Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Buffer auslesen mit SerialNG (https://www.delphipraxis.net/81763-buffer-auslesen-mit-serialng.html)

sender01 3. Dez 2006 13:32


Buffer auslesen mit SerialNG
 
Hallo alle zusammen!

Ich versuche mich schon seit geraumer Zeit daran, Daten mit der seriellen Schnittstele zu versenden und zu empfangen.
Dazu habe ich mir SerialNG runtergeladen und die Beispiele dazu angesehen. Unter anderem "SerialNGadvDemo". In diesem Programm sollen alle Funktionen dieser Komponente vorgestellt werden, sodass man es einfach nachmachen kann.
Mein Problem ist, dass ich nicht verstehe, wie die empfangenen Daten ausgelesen werden. Ein Original-Auszug aus dem Programm:

Delphi-Quellcode:
// All receiving is done here
// See how less Lines!
procedure TForm1.SerialPortNG1RxClusterEvent(Sender: TObject);
begin
  if SerialPortNG1.NextClusterSize >= 0 then // Data available?
    begin
      if SerialPortNG1.NextClusterCCError = 0 then // Error during receiveing?
        Terminal.Lines.Add(FormatDateTime('"Rec " dd.mm.yy hh:mm:ss" :"', Now))
      else
        Terminal.Lines.Add(FormatDateTime('"RecX " dd.mm.yy hh:mm:ss" :"', Now));
      // Read the data and patch them into the editfield
      AddHexString(SerialPortNG1.ReadNextClusterAsString,Terminal.Lines);
    end;

end;
Scheint ja wohl ganz einfach zu sein, verstehe es aber trotzdem nicht...

Kann mir jemand erklären, wie das Programm die Empfangsdaten ausließt?


Hier noch der Text der Prozedur "AddHexString" (hat die überhaupt etwas damit zu tun?!):

Delphi-Quellcode:
procedure AddHexString(S : String; Lines : TStrings );
var AddS, HexS, CopyS : String;
    i : Integer;
const SLen = 8;
begin
  while Length(S) > 0 do
    begin
      AddS := Copy(S,1,SLen);
      HexS := '';
      Delete(S,1,SLen);
      for i := 1 to SLen do
        begin
          CopyS := Copy(AddS,i,1);
          if CopyS <> '' then
            HexS := HexS + ' ' + Format('%2.2x',[Byte(CopyS[1])]) //
          else
            HexS := HexS + '  ';
        end;
       while Length(AddS) < SLen do
         AddS := AddS + ' ';
       for i := 1 to SLen do
         case AddS[i] of
           #0..#31 : AddS[i] := '.';
           #127    : AddS[i] := '.';
         end;
       Lines.Add(HexS+' : '+AddS);
    end;
end;

Danke schonmal für eure Hilfe!

Der_Unwissende 3. Dez 2006 14:32

Re: Buffer auslesen mit SerialNG
 
Hi und herzlich Willkommen in der DP :dp:

Zu der von dir verwendeten Komponente kann ich ehrlich gesagt gar nicht so viel sagen, ich kenne sie nicht wirklich. Wenn du per RS-232 kommunizieren willst würde ich dir zu TComPort (gibt es bei Sourceforge) empfehlen, da kenn ich bisher keinen der da wirklich Probleme mit hatte und es gibt eine Menge interessanter Funktionen (z.B. Ereignisse wenn ein Zeichen empfangen wurde bzw. sogar erst wenn ein bestimmtes Zeichen empfangen wurde).
Falls du also Lust und Zeit hast, könnte sich ein Blick auf die TComPort Komponenten lohnen. Ist aber nur eine persönliche Meinung!

Bei SerialNG würde ich sagen liest man mittels der Funktion SerialPortNG1.ReadNextClusterAsString einen String aus. Worauf sich hierbei ein Cluster bezieht kann ich mangels Kenntnis der Komponente nicht sagen. AddHexString wird wohl eher der Formatierten Anzeige dienen als dem tatsächlichen auslesen. Das eigentliche Auslesen des Strings müsste eigentlich immer als Funktion der Komponente stattfinden (bzw. ein Handle/Zeiger auf die Komponente als Parameter bekommen).

Gruß Der Unwissende

sender01 9. Dez 2006 15:19

Re: Buffer auslesen mit SerialNG
 
Das hatte ich mir schon gedacht.
Hab jetzt rausgefunden wie es geht. :???:

Ich habe
Delphi-Quellcode:
AddHexString(SerialPortNG1.ReadNextClusterAsString,Terminal.Lines);
umgeschrieben zu
Delphi-Quellcode:
Terminal.Lines.Add(SerialPortNG1.ReadNextClusterAsString);
"Terminal" ist übrigens der Name eines Memofeldes.
Mit der veränderten Zeile wird das was an der seriellen Schnittstelle ankommt in das Memofeld geschrieben, und zwar ohne es in Hex-Zahlen zu verwandeln. Es erscheinen Buchstaben, Zeichen und Zahlen. Keine Ahnung ob es sich um ASCII oder sonstwas handelt...

An der Schnittstelle kommen einzelne Bytes rein. Jetzt würde ich diese nur noch gerne als Dezimalzahlen darstellen lassen.
Wie kann ich den Text im Memofeld in Dezimalzahlen umwandeln?

Der_Unwissende 10. Dez 2006 08:15

Re: Buffer auslesen mit SerialNG
 
Hi,
das was du fragst ist ja eigentlich eine eigene Frage (würde also eigentlich in einen eigenen Thread gehören). Nicht falsch verstehen, möchte hier keinen über die Regeln des Forums belehren oder so, aber so werden viele Leute den Thread hier nicht lesen, da sie nichts mit SerialNG anfangen können. Die werden dir aber vielleicht sagen können, wie man einen String in eine Ganzzahl umwandelt. Liest dennoch jmd. diesen Thread, so werden hier erst gelöste Probleme gelesen und erst am Ende klar, dass du schon was ganz anderes wissen willst, auch ärgerlich. Deswegen immer besser (und auch von den Mods lieber gesehen), wenn du jedes Problem in einem eigenen Thread mit eigenem Titel erfragst (wirklich nur als Tipp für's nächste mal gedacht, da du leichter und schneller die Antwort bekommst)

Aber das was du suchst ist StrToInt bzw. TryStrToInt oder gar StrToIntDef. Die leisten alle das, was du gerne hättest. StrToInt würde dabei nur funktionieren, wenn der String eine gültige Integer Codierung enthält, sonst wird eine Exception ausgelöst. Bei TryStrToInt würde die Exception schon in der Methode abgefangen werden, du bekommst hier als Rückgabewert der Funktion ob die Umwandlung erfolgreich war oder eben nicht. StrToIntDef funktioniert fast genauso, lässt sich der String nicht in ein Integer umwandeln, so wird hier ein (von dir festgelegter) vorgegebener Wert zurück gegeben.

Gruß Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz