![]() |
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:
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 ;)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; Wie macht man es richtig? Gruß Temi |
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. |
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 |
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. |
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; |
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 |
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) |
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 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz