Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
11. Feb 2016
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......
Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
9. Feb 2016
Hast recht, das lässt sich nicht kompilieren. Man muss eine Variable angeben. In dieser steht aber kein sinnvoller Wert drinnen wenn ReadFile ein False zurück liefert weil der Zugriff noch nicht komplett ist.
Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
9. Feb 2016
Bei Asynchronem Zugriff liefert dir die Funktion
GetOverlappedResult
den gesuchten Wert.
Von der Reihenfolge dann:
WaitCommEvent
WaitForSingleObject
ReadFile
Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
9. Feb 2016
Nein:
"lpNumberOfBytesRead
A pointer to the variable that receives the number of bytes read when using a synchronous hFile parameter. ReadFile sets this value to zero before doing any work or error checking. Use NULL for this parameter if this is an asynchronous operation to avoid potentially erroneous results."
Wenn du mit Overlapped arbeitest, steht nichts sinnvolles in diesem Parameter.
Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
9. Feb 2016
Readfile liefert in deiner Konstellation falsche Ergebnisse da es
entweder a) mit Overlapped wieder asynchron ist (Rücksprung bevor fertig gelesen)
oder b) mit nil beim Overlapped einfach falsche Ergebnisse liefern kann.
Du musst das Rückgabeergebnis von Readfile prüfen und wieder auf das Event warten:
if not ReadFile(MyHandle, ReceiveBuffer, 1024, nil, @rOverlapped) then
if...
Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
9. Feb 2016
Der Rücksprung aus der Funktion WaitCommEvent erfolgt sofort obwohl das Ereignis RX_Char noch gar nicht eingetreten ist. Das Readfile danach findet dann meist auch nichts.
WaitForSingleObject ist das Stichwort.
Diese Funktion wartet auf ein bestimmtes Ereignis und hat einen Timeout.
Wenn das Event RX_Char auslöst, dann wird das Event im Overlapped signalisiert und ein Rücksprung aus...
Forum: Win32/Win64 API (native code)
Delphi
by Photoner,
8. Feb 2016
Wie wäre es mit dem lesen von jeweils einem Char? (wie himitsu´s Vorschlag)
DCB.EvtChar := #0;
Beispiel: