Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rs232 (https://www.delphipraxis.net/188826-rs232.html)

tomkupitz 11. Apr 2016 10:50

Rs232
 
Hallo,

über RS232 sende ich einen Befehl und erhalte eine Antwort darauf. Der Antwortstring ist nicht mit #13 abgeschlossen. Wenn ich den Antwortstring mit ReadFile abhole, erhalte ich nur einen Teil der Antwort. D.h. ich muss nochmals Lesen, um auch den Rest der Antwort zu erhalten. Für das Ganze habe ich einen Timeout definiert, so daß ich immer sicher gehen kann, dass die gesamte Antwort ausgelesen ist.

Der Timeout oft nicht optimal und kostet unnötig Zeit. Gibt es eine schnelle Möglichkeit einen solchen Antwortstring auszulesen?

Beste Grüße

Der schöne Günther 11. Apr 2016 11:08

AW: Rs232
 
Ich glaube es wäre einmal interessant wie und was du für den Timeout einstellst und wie genau dein ReadFile-Aufruf aussieht.

Wenn ich es richtig verstehe:
  1. Deine Gegenstelle terminiert das Gesendete nicht mit einem bestimmten Zeichen (wie ETX (#03) oder #13)
  2. Du weißt nicht, wie lang die Antwort auf deine Frage sein wird

himitsu 11. Apr 2016 11:57

AW: Rs232
 
Jupp, entweder die Länge wird vorher mit gesendet, bzw. ist vorher bekannt/statisch, oder es gibt eine "Ende"-Kennung, egal ob in den Daten oder mit Hilfe der Steuerleitungen (DCD, DTR, DSR, RTS, CTS und RI).
Ansonsten kannst du halt nur warten, ob nicht doch noch etwas kommt.

Alternativ vorher die maximal mögliche Zeit warten, wie lange eine Antwort dauern kann und danach dann einmal auslesen. (geht nur, wenn der Puffer des COM-Ports groß genug ist)

tomkupitz 11. Apr 2016 12:05

AW: Rs232
 
Es gibt kein Ende-Zeichen und die Länge ist auch nicht bekannt.

So siehts aus:

var s: AnsiString

SetLength(s, InQueue);
ReadFile(FComHandle, s[1], Length(s), result, @Overlapped);
GetOverlappedResult(FComHandle, Overlapped, result, True);

Das ganze wird halt x-mal wiederholt bis der Timeout (GetTickCount ...) abgelaufen ist.

Der schöne Günther 11. Apr 2016 12:14

AW: Rs232
 
Und wann fällt die Zahl
Delphi-Quellcode:
InQueue
vom Himmel?

Ansonsten: Kannst du vom Protokoll aus denn überhaupt nicht erkennen ob denn nun nichts mehr kommt?

tomkupitz 11. Apr 2016 12:32

AW: Rs232
 
if ClearCommError(FComHandle, e, @ComStat) then
result:=ComStat.cbInQue;

Ansonsten zeigt mir die Antwort ob noch was kommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 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