Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit Datenempfang über COM mit Async Pro
DellIsSchnell - Di 14.09.10 12:20
Titel: Problem mit Datenempfang über COM mit Async Pro
Hallo,
ich habe ein Problem mit dem Empfan von Daten über die Com mit Async Pro.
Es läuft soweit alles, allerdings verhält sich die Funktion OnTriggerAvail am entsprechenden Port seltsam.
Ich möchte einen String von z.B. 100 Zeichen Länge empfangen. Die Funktion wird aufgerufen, count steht aber auf 8! Es werden die ersten acht zeichen empfangen, dann erfolgt ein erneuter Aufruf der Funktion, count steht nun auf 92 und es werden die nächten 92 Zeichen empfangen. Es macht keinen Unterschied was ich empfange. Ob ASCII, normalen Text oder was auch immer. Es wird immer nach den ersten acht Zeichen unterbrochen.
Hat das Problem schon mal jemand gehabt? Wäre für jede Hilfe dankbar, verzweifle nämlich schon fast daran!
Grüße
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TDataModule1.ApdComPort10TriggerAvail(CP: TObject; Count: Word); var j : word; c : char; hstr : string; cstr, DataStr : string; begin DataStr := ''; for j := 1 to count do begin c := ApdComPort10.GetChar; DataStr := DataStr + c; end; cstr := '10'; AufbereitungForm.CutString(DataStr, cstr); end; |
Moderiert von
Narses: Delphi-Tags hinzugefügt
mkinzler - Di 14.09.10 12:22
Wie/wer sendet die Daten?
DellIsSchnell - Di 14.09.10 14:48
Die Daten kommen im Moment von einem anderen Rechner, genauer von einem COM-Port-Monitor. Es ist nicht von dem Test-Tool abhängig, habe bereits verschiedene getestet. Der Fehler ist betriebssystemunabhänig, ebenfalls bereits getestet.
Habe gerade noch was festgestellt. Ich habe das ganze jetzt mal mit der Zielhardware getestet. Ganz normaler PC, die COM wird auf einen LAN COM Server (Feldgerät) umgeleitet. Es funkioniert wie vor jedoch taucht der Fehler nun mal nach zwei, mal nach einem, mal nach vier Zeichen usw. auf. Hat das doch was mit der Hardware zutun?
chrisw - Di 14.09.10 15:44
Hallo, das Verhalten ist normal, denke ich. Sobald Daten anliegen wird der Interrupt gesetzt , das Abarbeiten geschieht durch das OS nicht immer sofort.
Serielle Daten werden entweder durch eine vorgegebene Länge (z.Bsp. immer 7 Bytes), oder durch Start- und StopString (z.Bsp.: Startet immer mit ###000 und endet mit +++; hierfür gibt es das ApdDataPacket im APRO) oder du legst einen Timeout fest (z.Bsp. wenn 2 Sekunden nichts gekommen ist, ist das Paket komplett (hierfür geeignet OnTriggerStatus)).
Christian
DellIsSchnell - Di 14.09.10 20:36
Hallo,
also der String, welchen ich empfangen will, besteht im Moment nur aus 100 mal dem Zeichen A, nichts weiter, kein Start- oder Stop-String dabei. Mir stellt sich die Frage warum zu Beginn dieser Mist passiert und dann kommt der Rest in einem Zug durch... Das mit dem Timeout werde ich mal versuchen.
DellIsSchnell - Mi 15.09.10 13:20
Hallo nochmal,
also das mit dem DataPacket würde zwar funktionieren, allerdings weis ich nicht wann mir etwas am COM zugestellt wird und zweitens habe ich in den zu empfangenden String keinerlei Zeichen, die ich zur Auswertung von Start oder Ende des Strings verwenden könnte.
Ich habe jetzt nochmal etwas herumprobiert. Selbst wenn ich einen String mit 100 Zeichen Länge schicke, steht der InBuff als auch der count nur auf 2,3,4 oder 5. Beim zweiten Event wird alles korrekt abgearbeitet.
Ich kann das nicht nachvollziehen.
Thx
chrisw - Mi 15.09.10 14:08
Nochmal !
Ankommende Zeichen lösen einen Interrupt aus (zumindest bei Windows, es gibt auvh noch gem. Spezifikation ein Loop Verfahren), dieser wird, ohne das du darauf Einfluss nehmen kannst, von Windows abgearbeitet.
Es kann sein, dass Windows nach 2 Zeichen reagiert, es kann aber genauso sein, das es erst nach 10 Zeichen reagiert !
Deshalb die oben beschriebenen Methoden von I/O mit seriellen Schnittstellen.
A. Pakete immer gleich lang.
B. immer gleichen Anfang und Ende
C. Timeout
Christian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!