Einzelnen Beitrag anzeigen

Andreas_R

Registriert seit: 5. Apr 2005
Ort: Bremen
14 Beiträge
 
Delphi 2005 Professional
 
#18

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 16. Aug 2006, 21:33
Aber Hallo !

Auch ich empfange Zeichenketten von einer seriellen Schnittstelle (RS232).
Die eingehenden Strings haben folgendes Format:

Beispiel:= '$01RR000 000000023 000000000' + chr(13)

und setzen sich wie folgt zusammen:

Delphi-Quellcode:
$ = Startzeichen des Strings (Dollarzeichen, ASCII 36)
0 = Serial Master Address
1 = Serial Slave Address
RR = "Report Ready" (ein spezielles Kommando)
000 = Speicherort
000000023 = Zählerstand
000000000 = darf ich getrost ignorieren
#13 = Endezeichen des Strings (ASCII 13)
In meiner Anwendung muss ich nun die Zeichen 4 und 5 ('RR') als Zeichenkette interpretieren, damit mein Programm weiß, dass es sich um den Befehl bzw. Zeichenkettentyp "Report Ready" handelt und entsprechend darauf reagieren kann.
Nur bei 'RR' sollen nämlich die Zeichen 15 bis 18 ('0023') in einem Panel angezeigt und ggf. noch zu einem Integer konvertiert werden.

Ein paar Code-Schnipsel:

Delphi-Quellcode:
// *** An der seriellen Schnittstelle liegt ein Empfangsereignis an ***
procedure TForm1.VaComm1RxChar(Sender: TObject; Count: Integer);
var i: integer;
begin
     //Alter Code:
     //r:= VaComm1.ReadText;
     //Memo2.Lines.Text:= Memo2.Lines.Text + r;

     //Neuer Code:
     //Lese Daten von der seriellen Schnittstelle
     r:= VaComm1.ReadText;
     hhALed7.TrueColor:= clYellow;
     for i := 1 to Length(r) do
         case r[i] of
              #10:; // ignorieren
              #13: // Wir warten lediglich auf #13
              begin
                   Memo2.Lines.Add(FMessage);
                   //Jetzt erfolgt die Auswertung des Strings
                   Analyze(FMessage);
                   FMessage := '';
              end;
         else //nicht #10 oder #13
              FMessage := FMessage + r[i];
         end;
     hhALed7.TrueColor:= clLime;
end;


// *** Zählerstand automatisch abfragen (Standard-Intervall 250 ms) ***
procedure TForm1.Timer2Timer(Sender: TObject);
var a: string;
    i: integer;
begin
     if not CheckBox13.Checked then Exit;

     if RefIndex = $FF then HeadAdr:= UpDown1.Position else HeadAdr:= RefIndex;
     StatusBar1.Panels[6].Text:= 'RefIndex: ' + IntToStr(RefIndex) + ' '+
                                 'HeadAdr: ' + IntToStr(HeadAdr);
     StatusBar1.Panels[5].Text:= 'Lese Report von Schreibkopf ' +
                                 IntToStr(HeadAdr) + ' ....';
     w:= '$0' + IntToStr(HeadAdr) + 'RR' + MLD[HeadAdr];
     w:= w + CreateChecksum(w) + #13;
     VaComm1.WriteText(w);
     Memo1.Lines.Add(w);

     // --> erstmal raus hier, Auswertung soll nun über neue Routine erfolgen
     Exit;

     ...
     ...
     ...
end;

// *** Auswertung des empfangenen Strings ***
procedure TForm1.Analyze(Msg: string);
begin
     if Msg[1] = '$then
     begin
          if (Msg[4] = 'R') and (Msg[5] = 'R') then
          begin
               with Memo2.Lines do
               begin
                    if Copy(Strings[Count-1], 4, 2) = 'RRthen
                       Panel7.Caption:= Copy(Strings[Count-1], 15, 4);
                    try
                       Counter[HeadAdr]:= StrToInt(Panel7.Caption);
                    except
                          Counter[HeadAdr]:= 0;
                          Panel7.Caption:= '----';
                    end; //try
               end; //if
          end; //with
     end; //if
end; //procedure
Ich frage mich, ob man die Zugriffe auf die Einzelzeichen des Strings mit Msg[x] sowie die Verwendung der Copy-Funktion nicht etwas etwas eleganter lösen könnte ?

Für die Abfrage der seriellen Schnittstelle verwende ich übrigens die Komponenten Varian Async 32.
Funktionieren sehr gut, ich kann nicht meckern.

So long, wünsche weiterhin stets eine Handbreit StrToInt() ohne Exception ....
Gruß Andreas
Win XP Pro, Delphi 2005 Professional, Intel P4 3,2 GHz, 1 GB RAM, ATi Sapphire Radeon X800XT PE (16 Pipelines), eigenes Fahrrad.
  Mit Zitat antworten Zitat