Entwickler-Ecke
Sonstiges (Delphi) - Daten vom com-port lesen
Krish - Mo 14.05.12 20:01
Titel: Daten vom com-port lesen
Es ist mal wieder so weit, ich habe ein Problem bei dem ich keine Lösung finde.
Folgendes: Ich habe mittels com-port eine Verbindung zwischen meinem Pc und einem Microcontroler erzeugt und soweit funktionert auch alles.
Ich sende von dem Microcontroler Datenpakete in Form von strings mit einer Länge von 5 bis 11 Zeichen(alles Ziffern). Mein Program startet sobald es Daten über den com-port erhält(on.rxchar).
Und hier ist das Problem. Die gesendeten Datenpakete kommen nicht in einem Stück in meinem Program an. D.h. für ein Datenpaket wird mein Programm 2x durchlaufen da es jedesmal wenn es Daten erhält neu startet.
Nun meine Frage: gibt es eine Möglichkeit mein Program warten zu lassen bis alle Daten angekommen sind oder wie kann ich das anders bewerkstelligen?
Hier der Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| procedure TTrainingRennen.ComPort1RxChar(Sender: TObject; Count: Integer);
var Daten, Spur, Runde, Zeit : String; Z : single;
begin sleep(50); ComPort1.ReadStr(Daten, Count); Daten := TrimRight(Daten); Spur := leftstr(daten,1); runde := midstr(Daten,2,3); rundeO := strtoint(runde); zeit := midstr(daten,5,9); z := StrTofloat(zeit);
if spur = inttostr(1) then begin runde1.caption := inttostr(rundeO); zeit1.caption := floattostr(Z/1000)+ ' s'; if rundeO+1 >= stringgrid1.RowCount then stringgrid1.RowCount := rundeO+2; Stringgrid1.Cells[0,rundeO] := inttostr(rundeO); Stringgrid1.Cells[1,rundeO] := floattostr(z/1000)+' s'; if z <= beste1z then begin beste1z := z; beste1.caption := floattostr(beste1z/1000)+' s'; end; end else begin runde2.caption := inttostr(rundeO); zeit2.caption := floattostr(Z/1000)+ ' s'; if rundeO+1 >= stringgrid2.RowCount then stringgrid2.RowCount := rundeO+2; Stringgrid2.Cells[0,rundeO] := inttostr(rundeO); Stringgrid2.Cells[1,rundeO] := floattostr(z/1000)+' s'; if z <= beste2z then begin beste2z := z; beste2.caption := floattostr(beste2z/1000)+ ' s'; end; end; end; |
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
bummi - Mo 14.05.12 23:02
Im rxChar an einen Buffer anhängen und die Auswertung des Buffers aufrufen.
In der Auswertung schauen ob ein komplettes Paket enthalten ist, wenn ja dieses aus dem Buffer entfernen und verarbeiten.
Krish - Mo 14.05.12 23:17
Kannst du mir bitte ein kleines Tutorial für den Buffer geben oder einen Link dazu wo ich es finde?
Narses - Di 15.05.12 00:39
Moin!
Krish hat folgendes geschrieben : |
Und hier ist das Problem. Die gesendeten Datenpakete kommen nicht in einem Stück in meinem Program an. D.h. für ein Datenpaket wird mein Programm 2x durchlaufen |
Hier wird erklärt [
http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html], warum das so ist (auch wenn das auf den ersten Blick Netzwerkkommunikation und eine ganz andere Komponente ist, das "Problem" ist das gleiche). :les: :think:
Krish hat folgendes geschrieben : |
Kannst du mir bitte ein kleines Tutorial für den Buffer geben oder einen Link dazu wo ich es finde? |
Dafür sollte gar kein Tutorial nötig sein, nimm einfach einen String, das reicht schon als Buffer. :idea: ;)
Dein eigentliches Problem liegt vermutlich hier:
Krish hat folgendes geschrieben : |
Ich sende von dem Microcontroler Datenpakete in Form von strings mit einer Länge von 5 bis 11 Zeichen(alles Ziffern). |
Du hast vermutlich kein Terminatorzeichen definiert oder lässt es einfach weg. Genau da ist das Problem:
wie erkennst du das Ende eines Datenpaketes? Alternativ beschreibst du mal den Aufbau der Datenpakete, vielleicht kann man dann schon was erkennen und helfen.
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!