AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi COM Port Daten auslesen und auf bestimmtes Char reagieren
Thema durchsuchen
Ansicht
Themen-Optionen

COM Port Daten auslesen und auf bestimmtes Char reagieren

Ein Thema von AJ_Oldendorf · begonnen am 8. Feb 2016 · letzter Beitrag vom 11. Feb 2016
Antwort Antwort
AJ_Oldendorf

Registriert seit: 12. Jun 2009
442 Beiträge
 
Delphi 12 Athens
 
#1

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 9. Feb 2016, 12:15
@Himitsu:
Zitat:
Ganz im Ernst, egal, ob du einen Zeitstempel brauchst. ReadFile liest das aus, was schon im Cache des Port ist.
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 oder ähnliches sein...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.386 Beiträge
 
Delphi 12 Athens
 
#2

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 9. Feb 2016, 12:21
Und den bekommst du Niemals raus.
Windows, der Treiber und vorallem dein Programm sind kein Echtzeitsystem.

Du kannst den Puffer nur schnell leeren und verarbeiten, womit du Zeitlich am Nächsten an die Empfangszeit ran kommst.
Alles unter 20 (sicherheitshalber unter 50) Millisekunden kannst du praktisch vergessen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Feb 2016 um 12:24 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 9. Feb 2016, 13:19
@Himitsu:
Zitat:
Ganz im Ernst, egal, ob du einen Zeitstempel brauchst. ReadFile liest das aus, was schon im Cache des Port ist.
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.
Dann mach doch genau das, was Sir Rufo geschrieben hat. Merk dir den momentanen Buffer samt Zeitstempel in einem Record und schieb das in einen Queue.

Ein anderer Thread arbeit nun den Queue ab. Untersucht den Record. Ist #10 drin den Part bis #10 samt dem ebenfalls im Record befindlichen Zeitstempel wegschreiben. Den Rest auch noch untersuchen. Immer noch ne #10 drin, das ganze wieder. Wenn nicht den Rest merken.
Nächsten Record (wenn denn schon einer im Queue ist) vornehmen. An den gemerkten Rest anhängen. Wieder nach #10 suchen. Falls gefunden mit dem neuen Zeitstempel aus dem neuen Record wegschreiben.
usw.usw.
Ralph
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
442 Beiträge
 
Delphi 12 Athens
 
#4

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 9. Feb 2016, 13:30
Das mit dem puffern und selbstständig abarbeiten würde wahrscheinlich funktionieren.
Dachte nur ich komme mit den Windows API Funktionen soweit zurecht.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
442 Beiträge
 
Delphi 12 Athens
 
#5

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 10. Feb 2016, 08:01
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?
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
544 Beiträge
 
Delphi 12 Athens
 
#6

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 10. Feb 2016, 08:22
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.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
442 Beiträge
 
Delphi 12 Athens
 
#7

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 10. Feb 2016, 08:37
@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?
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
4.176 Beiträge
 
Delphi 12 Athens
 
#8

AW: COM Port Daten auslesen und auf bestimmtes Char reagieren

  Alt 10. Feb 2016, 11:31
Warum nimmst du nicht sowas wie AsyncPro, da sind schon alle LowLevel Routinen gut abgefangen ?

Rollo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 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