Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   lesen von RS232 / TComPortLib / Delphi6 (https://www.delphipraxis.net/182979-lesen-von-rs232-tcomportlib-delphi6.html)

temi 1. Dez 2014 15:59

lesen von RS232 / TComPortLib / Delphi6
 
Hallo Forum,

ich muß hier die Gewichte von einer Waage übertragen. Also an der Waage kann man mit Print das aktuelle Gewicht auf eine RS232-Schnittstelle ausgeben.

Ich hab mir die ComPort Library version 4.10 installiert.

und kann auch was empfangen. Leider nur einmal dann geht's nicht mehr.

OK also die Komponente hat einen RxChar Event dort lese ich

Delphi-Quellcode:

procedure TfrmKaeseSchneiden.ComPort1RxChar(Sender: TObject; Count: Integer);
var
   gewicht, gram: String;
   gramm: Currency;
begin
     sleep(2000);
     ComPort1.ReadStr(gewicht, Count);

     ShowMessage(gewicht);

     // Weitere Verarbeitungschritte .....
end;
Frage ist warum erhalte ich nur einmal einen Wert von der Schnittstelle. Ich schätze mal ich könnte die serielle Schnittstelle nach jedem Wert kurz schließen und dann wieder öffnen. Denke aber das ist nicht so gedacht ;)
Wie macht man es richtig?


Gruß
Temi

himitsu 1. Dez 2014 16:23

AW: lesen von RS232 / TComPortLib / Delphi6
 
Wozu das Sleep?

Hast du mal um deinen Code ein Try-Except drumrumgemacht, inkl. Fehlerausgabe?
Wenn da eine Exception auftritt, dann wird diese nicht angezeigt, sondern in den TComPort-Lese-TThread weitergeleitet.
Der Thread wird dadurch beendet und das war's dann.

Auch mußt du aufpassen, ob OnRxChar im Hauptthread läuft (weiß das grade nicht) und wenn nicht, dann darf dort nich auf die VCL zugegriffen werden.

Außerdem, wenn du OnRxChar benutzt, dann mußt du selber sicherstellen, daß die Daten "komplett" sind und den unvollständigen Teil selber zwischenspeichern, bzw. auch zuviele Daten (vom nächsten Datenpacket).
Oder du benutzt TComDataPacket.OnPacket, welches für dich das Cachen und Zerlegen übernimmt.

p80286 1. Dez 2014 16:38

AW: lesen von RS232 / TComPortLib / Delphi6
 
Könnte es sein, daß die gelesenen Daten quittiert werden müssen?
Ohne quittung ist mit dem Senden Schluß?

Gruß
K-H

jobo 1. Dez 2014 17:08

AW: lesen von RS232 / TComPortLib / Delphi6
 
Ist Jahrzehnte her bei mir, damals musste man mit der Waage vereinbaren, wie Meßwerte übertragen werden. Also z.B. kontinuierlich (man wird mit Meßwerten erschlagen) oder Peakgewicht, Null usw. musste man dann selber bestimmen oder die Waage schickt nur stabile Meßwerte.
Dann die Frage, wie die Werte übernommen werden. Ist da eine Art CR/LF implementiert ähnlich Read/Readln, was ist das Zeilenendezeichen, usw usw.
Ich würde mal die Doku der Waage fragen.

baumina 2. Dez 2014 06:26

AW: lesen von RS232 / TComPortLib / Delphi6
 
Meine Routine zum Waage auslesen sieht an der Stelle so aus:

Delphi-Quellcode:
var
  sReceive : String;

procedure TfmMeasU.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  r_buff : array[0..2048] of char;
  i,p   : Integer;

begin
  ComPort1.Read(r_buff,SizeOf(r_buff));
  for i := 1 to Count do
  begin
    if r_Buff[i-1] > #13 then
    begin
      sReceive := sReceive + r_Buff[i-1];
    end else
    begin
      if r_Buff[i-1] = #13 then
      begin
        Showmessage('Gewicht : ' + sReceive);
        sReceive := '';
      end;
    end;
  end;
end;

temi 2. Dez 2014 07:12

AW: lesen von RS232 / TComPortLib / Delphi6
 
Hallo himitsu

Ohne das Sleep bekomme ich nicht alle Zeichen. Ich denke das der Event beim Empfang des ersten Zeichen aufgerufen wird und Ich erst warten muß bis alle Zeichen im Buffer sind.

Jedenfalls ohne Sleep funktionierts nicht die 2000 hab ich im try and error "ermittelt" ;)

nein try - except hab ich noch nicht versucht. Dachte eigentlich die IDE zeigt mir immer alle Fehler an :( aber mit threads kenn ich mich nicht aus muss ich gestehen ;)

Kannst Du mir mal ein Beispiel mit TComDataPacket.OnPacket zeigen? Dachte eigentlich mit RxChar und ReadStr hab ich die einfachte Variante erwischt. Selbiger Quellcode funktioniert nämlich mit einer anderen Waage.

Gruß
temi

himitsu 2. Dez 2014 08:08

AW: lesen von RS232 / TComPortLib / Delphi6
 
IDE Debugger zeigt Exceptions an: Das klappt nicht immer.

Sleep: Diese Antwort/Lösung kann so nicht stimmen funktionieren, denn egal ob zwischendrin noch was reinkäme ... du liest dennoch nur das aus, was bei Funktionseintritt da war, weil
ComPort1RxChar(Sender: TObject; Count: Integer); . --> . sleep(2000);. --> . ComPort1.ReadStr(gewicht, Count); :angel:

siehe baumina (OK, die zeichenweise Behandlung könnte man auch besser erledigen) oder TComDataPacket (mit Ende-Code = #13)

temi 2. Dez 2014 12:13

AW: lesen von RS232 / TComPortLib / Delphi6
 
Hallo Danke an alle ich hab's jetzt :)

Ja himitsu das mit dem sleep is völliger Quatsch - hab mir da so'ne komische Erklärung zusammengebastelt, weil ich immer unterschiedliche Stringlängen in meiner Variablen hatte.

Mein Fehler das ich aus was für Gründen auch immer mir vorgestellt habe die Schnittstelle übergibt mir immer meinen fertigen String. Also mit einem Event immer der komplette String dabei ist das so das der unter umständen mehrmals aufgerufen wird und ich mir meinen kompletten String zusammenbasteln muß ;)

bin jetzt aus diesen Gründen doch auf ComDataPacket umgestiegen ;) und wieder 'n bischen schlauer ;)

Danke nochmal an alle

Gruß
temi


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz