Autor Beitrag
DellIsSchnell
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 14.09.10 12:20 
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
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 14.09.10 12:22 
Wie/wer sendet die Daten?

_________________
Markus Kinzler.
DellIsSchnell Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: 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

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
DellIsSchnell Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: 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

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.