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);
  //if length(Daten) < 5
    //then Showmessage('Fehler: Zeitanzeige ist im *popo*!')
      //else
        //begin
          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;
end;


Moderiert von user profile iconNarses: 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!

user profile iconKrish hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconKrish hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconKrish hat folgendes geschrieben Zum zitierten Posting springen:
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