-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
10. Feb 2016
@Rollo62: Ja ich muss leider alles selber bauen.
@Neumann:
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?
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
10. Feb 2016
@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?
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
10. Feb 2016
Hallo,
mein Ablauf sieht jetzt so aus:
ComPortInit
Daten vorhanden an Schnittstelle?
TmpMask := EV_RXFLAG;
WaitCommEvent(SerHandle, TmpMask, @rOverlapped);
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
Das mit dem puffern und selbstständig abarbeiten würde wahrscheinlich funktionieren.
Dachte nur ich komme mit den Windows API Funktionen soweit zurecht.
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
Das lässt sich aber nicht compilieren:
if ReadFile (MyHandle, ReceiveBuffer, 1024, Nil, @rOverlapped) then
Kannst du mir mal bitte in meinem Beispiel Source von oben zeigen, wie du das genau meinst?
@himitsu
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
@Himitsu:
Mir geht es aber nicht um einen Zeitstempel wann ich mir den String zusammen gebaut habe sondern wann dieser sozusagen an der Schnittstelle an lag.
Aller 9ms steht sozusagen ein neuer Wert am COM an. Den brauche ich mir dem genauen Zeitstempel wann er kam.
Der nächste Wert ist dann eben 9ms später. Das ist aber abhängig davon, wie schnell das Gerät sendet.
Kann auch mal 12ms...
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
Nil und @rOverlapped ist sicherlich ein Tippfehler oder?
if not ReadFile(MyHandle, ReceiveBuffer, 1024, nil, @rOverlapped) then
Also sollte ich es so machen?
while not Terminated do
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
Habe bei dem ReadFile anstatt dem Nil als letzten Parameter nochmal die gleiche Overlapped Struktur angegeben.
Dann bekomme ich auch in den ReceivedBytes was zurück. Nämlich die angegebenen 1024. Ich will ja aber keine 1024 lesen sondern immer nur zwischen zwei #10 Characters.
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
Das habe ich auch so.
Mein Thread:
while not Terminated do
begin
HandleBuffer := rOverlapped.hEvent;
HandleBuffer := wOverlapped.hEvent;
Return := MsgWaitForMultipleObjects (Handles, HandleBuffer, False,
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
@Sir Rufo...
Ich habe jetzt mal Byteweise die COM abgefragt und mir entsprechend beim Auftreten meines #10 den String zusammen gebaut. Das ist ja im Endeffekt ein Pollen der Seriellen Schnittstelle und man merkt dabei "deutlich", dass das mehr Rechenleistung benötigt.
Der bessere Weg ist auf ein bestimmtes Zeichen nur zur Triggern (WaitCommEvent) und dann die Daten auslesen.
Das Problem...
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
hEvent wird gesetzt beim Init des ComPorts:
rOverlapped.hEvent := CreateEventA (NIL, True, False, NullStr);
Dann kommt das WaitCommEvent wie oben schonmal geschrieben und wenn dieses getriggert wird sieht mein Aufruf so aus:
ReadFile (MyHandle, ReceiveBuffer, 1024, ReceivedBytes, Nil); //<- ReceivedBytes ist hier 0
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
9. Feb 2016
Ich habe das mal so versucht, dass ich die Zeiten entsprechend gesetzt habe und anschließend mit WaitCommEvent auf das #10 gewartet habe. Anschließend reagiere ich auf das Event mit ReadFile:
ReadFile (MyHandle, ReceiveBuffer, 1024, ReceivedBytes, Nil);
Leider ist der ReceiveBuffer an dieser Stelle immer leer und auch die ReceivedBytes sind 0.
Frage ich die ReceivedBytes nach dem...
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
8. Feb 2016
@Photoner:
Danke, das klingt sehr interessant.
Also das würde dann so aussehen, oder?
ReadIntervalTimeout := MaxDWord;
ReadTotalTimeoutConstant := 0;
ReadTotalTimeoutMultiplier := 0;
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
8. Feb 2016
Folgendes habe ich vergessen zu sagen:
Ich brauche zu jedem Wert den ich übermittelt bekommen habe sozusagen ein Zeitstempel wann der Wert eingetroffen ist.
Wenn ich jetzt den Buffer sehr groß stelle, dann werden intern "ganz viele" Werte aufgesammelt. Anschließend soll ich die ja einzeln abgrasen und auf das bestimmte Ev_Char prüfen.
Ich will ja keine Verzögerung zwischen dem Eingang des...
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
8. Feb 2016
Habe anstatt dem ReadFile folgenden Aufruf gemacht:
TmpMask := EV_RXFLAG;
WaitCommEvent(MyHandle, TmpMask, @rOverlapped);
Darauf wird auf alle Fälle reagiert aber wie komme ich jetzt an die Daten? Nach dem ReadFile stehen die Daten ja in dem übergebenen ReceiveBuffer.
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
8. Feb 2016
Ok, Zeichenweise auslesen wäre auch noch möglich aber ich dachte das "EvtChar" ist genau dafür da.
Da steht ja:
The value of the character used to signal an event.
Ich bin davon ausgegangen, dass ich ein Event bekomme wenn das entsprechende Char gefunden wurde im Buffer...
Das andere muss ich mir mal genauer angucken von "Photoner"
-
Forum: Win32/Win64 API (native code)
Delphi
by AJ_Oldendorf,
8. Feb 2016
Hallo zusammen,
ich habe ein Gerät, welches mir ca. aller 10ms ein Wert über die serielle Schnittstelle liefert.
Dieser String hat immer den gleichen Aufbau und endet mit #13#10.
Das Gerät kann aber auch andere Daten schicken aber es wird immer mit #13#10 abgeschlossen.
In meiner Software habe ich eingestellt, dass ich auf das #10 reagieren möchte und damit das Ende eines Strings erkenne....