Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - COM Port Programmierung


Orko - Di 15.06.10 07:50
Titel: COM Port Programmierung
Einen schönen guten Morgen,

ich hab ein kleines Projekt wo ich zwischen einem Mikrocontroller und einem PC Daten austausche z.B. Akku Status, Zeiten und so was. Der Controller arbeitet einwandfrei hab die Daten über ein Terminal ausgelesen. Das Prinzip meiner Programmierung auf dem Controller war so gedacht das die ersten beiden Zeichen eine Art Befehls Codierung ist damit das PC Programm weiß was für Nutzdaten folgen z.B. steht "7F" dafür das jetzt Daten kommen die den Zustand des Akkus darstellen. Auf dem Terminal würde das dann wie folgt aussehen "7F456" die Zahl 456 ist in diesem beispiel jetzt der Wert des AD Wandlers (Akku Stand). In diesem Zuge habe ich mich mit der ComPort Library http://sourceforge.net/projects/comport/ beschäftigt und folgenden code geschrieben:

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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
command: string;
Temp_in_string:string;
power: integer;
lange: integer;
begin

  sleep(300);

  comport1.ReadStr(temp_in_string,count);

  temp_in_string := trim(temp_in_string);

  temp_in_string := copy(temp_in_string,length(temp_in_string) -4,20);

  command := copy(temp_in_string,1,2);

  comport1.ClearBuffer(true,true);

  if command = '00' then
  begin

  timer1.Enabled := true;

  label7.Caption := 'Messung';

  end;

  if command = '7F' then
  begin

  lange := length(temp_in_string) - 2;

  Power := strtoint(copy(temp_in_string,3,lange));

  power := trunc(power * 0.204);

  label5.Caption := inttostr(power) + '%';

  end;

  if command = 'FF' then
  begin

  timer1.Enabled := false;

  lange := length(temp_in_string) - 2;

  edit1.Text := copy(temp_in_string,3,lange);

  label7.Caption := 'Bereit';

  end;

  if command = 'F7' then
  begin
  label7.Caption := 'Bereit';
  end;

  temp_in_string :='';

end;


Nun habe ich ein paar fragen: Springt das Ereignis "RxChar" an wenn der erste Charakter in den Buffer gelangt?
Was bedeutet "#$D#$A"?

Hab jetzt das Problem das es manchmal geht und manchmal nicht. (mehr nicht!!) 
Hat jemand eine Idee wie man das sauber Programmieren kann? Ich hab keine Ahnung wie die Daten im Buffer gespeichert sind.
Wenn ich mir im Debug die Variable "temp_in_string" ansehe dann sieht das so aus "'7F456'#$D#$A'7F456'#$D#$A'7F456'#$D#$A" hab versucht es aus zuschneiden aber irgendwas haut nicht hin. Hoffe ihr könnt mir helfen. MfG Orko


bummi - Di 15.06.10 09:38

"#$D#$A" ist ein Zeilenumdruch #13#10


Zitat:
"RxChar" an wenn der erste Charakter in den Buffer gelangt?

Du kannst Dich nie verlassen wann wieviel hier aufschlägt, Daten in einem (Ring)-Puffer ablegen
auswerten und eine eigenes Event in Deine Abgeleitet Komponente einbauen wenn der Puffer gültig gefüllt ist.

Moderiert von user profile iconKlabautermann: Quote-Tags hinzugefügt.


ALF - Di 15.06.10 15:57

Hi,
wichtig sehe ich vielleicht noch ein Protokoll für so was. Wie es ja im allgmeinen üblich ist!
Dazu mal ein kleines Beispiel.
1. 7F00 = ProtokollSignal
2. 7Fxx = xx ist max zu empfangende Daten = max 256 bytes, incl LF CR (wenn nicht benötigt evtl. vor dem Senden entfernen)
3. 7F02 = STX, Start of Text

alles was jetzt kommt sind Daten von einer anzahl xx bytes

4. 7F03 = ETX, End of Text oder
4. 7F04 = End of Transmission
Ist vielleicht alles überflüssig, aber um zu Erkennen, was wan wo Anfängt oder Endet, sollte man es vielleicht berücksichtigen.
Ansonsten hat user profile iconbummi Dir ja schon gesagt das mit dem Puffer.

Gruss Alf