AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Buffer auslesen mit SerialNG

Ein Thema von sender01 · begonnen am 3. Dez 2006 · letzter Beitrag vom 10. Dez 2006
Antwort Antwort
sender01

Registriert seit: 3. Dez 2006
6 Beiträge
 
Delphi 7 Personal
 
#1

Buffer auslesen mit SerialNG

  Alt 3. Dez 2006, 13:32
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!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Buffer auslesen mit SerialNG

  Alt 3. Dez 2006, 14:32
Hi und herzlich Willkommen in der 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
  Mit Zitat antworten Zitat
sender01

Registriert seit: 3. Dez 2006
6 Beiträge
 
Delphi 7 Personal
 
#3

Re: Buffer auslesen mit SerialNG

  Alt 9. Dez 2006, 15:19
Das hatte ich mir schon gedacht.
Hab jetzt rausgefunden wie es geht.

Ich habe
AddHexString(SerialPortNG1.ReadNextClusterAsString,Terminal.Lines); umgeschrieben zu
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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Buffer auslesen mit SerialNG

  Alt 10. Dez 2006, 08:15
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 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