Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi COM Port Daten auslesen und auf bestimmtes Char reagieren (https://www.delphipraxis.net/188192-com-port-daten-auslesen-und-auf-bestimmtes-char-reagieren.html)

AJ_Oldendorf 9. Feb 2016 13:30

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
Das mit dem puffern und selbstständig abarbeiten würde wahrscheinlich funktionieren.
Dachte nur ich komme mit den Windows API Funktionen soweit zurecht.

AJ_Oldendorf 10. Feb 2016 08:01

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
Hallo,
mein Ablauf sieht jetzt so aus:


ComPortInit
Daten vorhanden an Schnittstelle?

Delphi-Quellcode:
TmpMask := EV_RXFLAG;
WaitCommEvent(SerHandle, TmpMask, @rOverlapped);
Thread prüft Overlapped Event auf WAIT_OBJECT_0 im Execute

Delphi-Quellcode:
if ReadFile (MyHandle, ReceiveBuffer, 1024, ReceivedBytes, @rOverlapped) then
begin
  //Tue irgendwas mit den Daten
  //Now als Zeitstempeleingang nutzen
  //Protokolliere Daten
end;
Wieder auf Daten vorhanden prüfen an Schnittstelle

Delphi-Quellcode:
TmpMask := EV_RXFLAG;
WaitCommEvent(SerHandle, TmpMask, @rOverlapped);
Daten vorhanden? Dann wird Thread wieder angetriggert usw. usw. usw.


Das läuft soweit auch ganz gut auf meinem Rechner.
Trotzdem passiert es ab und zu, dass ich 2 oder 3 Strings rein bekomme (bzw. in meinem Protokoll sehe), die genau den gleichen Zeitstempel haben (Now wird genutzt nach dem ReadFile für den Zeitstempel).

Jetzt habe ich das auf einem anderen Rechner probiert und da sieht das Protokoll noch "schlechter" aus.

Der String den ich bekomme hat immer 14 Byte + #13#10

Inhaltsbeispiel:
abcdefghijklmn#13#10

Auf meinem Rechner sieht es erstmal ganz gut aus, bis auf dem Problem mit den 2-3 Werten, die alle den gleichen Zeitstempel haben.

Auf dem anderen Rechner sieht das Protokoll so aus (jede Zeile ist ein Wert):

abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghi
jklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcde
fghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijkl
mn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10
abcdefghijklmn#13#10

Das ist nur ein Beispiel...
Wie man aber sieht, sind die Werte nicht immer am #10 beendet wurden sondern auch irgendwo dazwischen.
Das sieht für mich so aus, als wenn das WaitCommEvent kommt (#10 erkannt) und ich dann mit ReadFile auslese aber noch nicht alle Daten vollständig im Cache sind. Kann das sein?
Ansonsten würde ja das ReadFile nicht angetriggert werden wenn das WaitCommEvent nicht kommt.
Habt ihr dazu noch eine Idee?

Neumann 10. Feb 2016 08:22

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
Das ist wohl immer so bei Comports. Man braucht einen Puffer, in dem man die Teile der Übertragung sammelt und dann weiter verarbeitet. Das kann z.B. einfach eine globale String-Variable sein.

AJ_Oldendorf 10. Feb 2016 08:37

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
@Neumann:
Wieso das denn? Ich dachte mit dem WaitCommEvent wird mir signalisiert, dass an der Schnittstelle mein gesetztes Zeichen angekommen ist (=#10). Dann müssen die Daten die sich davor befinden (können ja nur davor stehen) auch irgendwo schon im Cache liegen oder wo sind die sonst?

Rollo62 10. Feb 2016 11:31

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
Warum nimmst du nicht sowas wie AsyncPro, da sind schon alle LowLevel Routinen gut abgefangen ?

Rollo

Neumann 10. Feb 2016 11:55

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
Rollo, hatte ich auch schon so ähnlich vorgeschlagen. Vielleicht gibt es Gründe warum alles selbst gebaut werden soll.

Noch mal zu den zerteilten Strings: Muss man wohl einfach mit leben.

AJ_Oldendorf 10. Feb 2016 13:41

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
@Rollo62: Ja ich muss leider alles selber bauen.

@Neumann:
Zitat:

Muss man wohl einfach mit leben.
Aber gibt es dafür auch ein Grund? Wenn ein bestimmtes Zeichen vorher an der Schnittstelle erkannt wird und sich x Zeichen davor befinden, dann muss ich die doch auch irgendwo sehen können bzw. warum sollte das Event mitten in dem String kommen, wo das Zeichen eigentlich gar nicht vorkommt?

Photoner 11. Feb 2016 11:32

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren
 
Noch mal:

Das mit dem Asynchron Lesen ist deutlich schwieriger als synchron. Probier doch mal die zweite Variante aus oder gib mal eine Rückmeldung dazu, falls du das schon hast. CreateFileA ohne FILE_FLAG_OVERLAPPED aufrufen und auf das ganze Overlapped Gedöns :) verzichten. Dann kommt der Rücksprung aus WaitCommEvent auch wirklich nur wenn dein Char im Buffer ist und die ganzen Waitfor... Aufrufe erledigen sich auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.
Seite 4 von 4   « Erste     234   

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