Autor Beitrag
Krish
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 14.05.12 20:01 
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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Krish Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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, 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

_________________
There are 10 types of people - those who understand binary and those who don´t.