Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Auslesen der Schnittstelle mit SerialNG (https://www.delphipraxis.net/98576-auslesen-der-schnittstelle-mit-serialng.html)

Delphieinsteiger 29. Aug 2007 11:15


Auslesen der Schnittstelle mit SerialNG
 
Hallo

Ich habe da ein Problem mit dem Aulesen der seriellen Schnittstelle.Und zwar mchte ich mit der Komponente SerialNG die Werte die von einem Tempearaturdatenlogger kommen auslesen und in meiner Delphioberflche anhand eines Arrays in einen Koordinatensystem bringen.Habe es durch probieren bislang soweit geschafft das ich Daten vom Logger empfange und zwar bin ich so vorgegangen:

SerialNG.Active:=True;
Memo1.Text:=SerialNG.ReadNextClusterAsString;

Jetzt habe ich alle Werte die der Logger aufgenommen hat(Bytes) als String in meiner Memobox.aber wie kriege ich diese Werte umgewandelt?ich wrde meinen Arrays ja z.B am liebsten eine 23 fr 23 bergeben.

Bin halt noch ein Anfnger auf den Gebiet und kenne mich mit der SerialNG-Komponente nicht aus,und mit Delphi arbeite ich auch erst seit 2 Wochen.Vieleicht kann mir jemand einen Vorschlag machen wie man an die Sache gehen wrde.

Der_Unwissende 31. Aug 2007 11:57

Re: Auslesen der Schnittstelle mit SerialNG
 
Hi,
erstmal eine Kleinigkeit vorweg, wenn Du Code posten mchtest, dann benutze dafr am Besten die Delphi-Tags, die finden sich ber dem Eingabefeld, wo Du den Beitrag eingibst. Einfach einmal auf Delphi-Code clicken, Code einfgen und auf Delphi-Code* Clicken, dann wird der Code einfach schner dargestellt (nur fr's nchste mal, ist ja nichts Schlimmes!)

Zitat:

Zitat von Delphieinsteiger
Jetzt habe ich alle Werte die der Logger aufgenommen hat(Bytes) als String in meiner Memobox.aber wie kriege ich diese Werte umgewandelt?ich wrde meinen Arrays ja z.B am liebsten eine 23 fr 23 bergeben.

Wie genau sehen denn die Daten aus die Du bekommst. Ich kenne die SerialNG-Komponente nicht (benutze immer TComPort), aber an sich bekommst Du beim Zugriff auf die serielle Schnittstelle immer etwas wie Bytes, die sehr hufig auch als String interpretiert werden mssen.
Bei der bertragung gibt es aber verschiedene Mglichkeiten:
  • Es werden Daten fester Lnge bertragen
  • Es wird ein Festes Datum (Anzahl der folgenden Daten) bertragen (
  • Es werden Start- und/oder Endzeichen bertragen (Datum endet, sobald bestimmtes Zeichen empfangen wurde)
Letzteres umfsst natrlich auch die mglichen Kombinationen. Das Problem bei der RS-232-Schnittstelle ist eben, dass die Kommunikation asynchron ist, Du bekommst einfach nur mehrere Bytes, ob die zusammengehren oder nicht, ob ein Datum komplett bertragen wurde, das musst Du selbst entscheiden. Vorab also die Warnung, dass Du hier ggf. drauf achten msstest (kann Dir aber eventuell auch von SerialNG abgenommen werden).

Wenn Du jetzt also ein Datum empfngst, welche Form hat es denn? Hast Du bereits einen String wie '23' oder gar '23'? Und mchtest Du daraus jetzt ein Integer machen? Dazu kannst findest Du in der Unit SysUtils (in der Uses Klausel angeben) die Funktion StrToInt bzw. auch TryStrToInt. Letztere fngt dabei Fehler ab, wenn Du z.B. versuchst aus '1a0' eine Zahl zu machen. Die Funktion liefert ein Boolschen Wert zurck, ob die Umwandlung geklappt hat.
Fr das Beispiel she dann die Umwandlung ungefhr so aus:
Delphi-Quellcode:
var temp: Integer;
begin
  // input ist der String, den Du in eine Temperatur umwandeln mchtest
  // Wenn Du das Grad-Zeichen dran httest, musst Du das vorher entfernen
  // wenn nicht, die folgende Zeile weglassen
  input := copy(input, 1, Pos('')); // Kopiert aus dem String input alles vom ersten Zeichen bis zum ersten Auftreten von ''
 
  if not TryStrToInt(input, temp) then
  begin
    // Fehler bei der Umwandlung, irgendwas machen
  end;

  // in Temp steht nun der Zahlenwert der Temperatur
end;
Der umgekehrte Weg ist dann noch leichter, hier scheiden Fehler in der Eingabe aus. Ein Integer ist immer mit einer gltigen Zahl belegt und kann ber IntToStr in einen String umgewandelt werden (ebenfalls in der Unit SysUtils deklariert).
Delphi-Quellcode:
var temp: String;
begin
  // input ist der Integer Wert, den Du in einen Temperatur-String umwandeln mchtest
  temp := IntToStr(input);

  // oder wenn Du ein Grad Zeichen dran haben mchtest
  temp := IntToStr(input) + '';
end;
Das ist jetzt natrlich nur der Weg, wenn Du ein einzelnen String oder Integer-Wert umwandeln mchtest. Du sagtest ja, dass Du gleich eine ganze Menge davon hast. Was Du also tun musst ist, diesen zu zerlegen. Wie man das am Einfachsten macht hngt aber eben von dem Aufbau ab. Je nachdem ob es ein Trennzeichen gibt oder ein Datum eine feste Lnge hat kommen unterschiedliche Wege in Frage, sag einfach erstmal wie die Daten aufgebaut sind.

Gru Der Unwissende

Delphieinsteiger 31. Aug 2007 14:35

Re: Auslesen der Schnittstelle mit SerialNG
 
Danke erstmal fr die guten Tipps!

also ich kann ja nochmal beschreiben wie mein derzeitiger Stand ist.
also ich lese die Daten vom Logger aus,da bin ich so vorgegangen.

Delphi-Quellcode:
procedure TForm1.RS232RxClusterEvent(Sender: TObject);
begin
case n of
1..255:   begin
                string1:= string1 + rs232.ReadNextClusterAsString;
                label1.Caption:= inttostr(n);
           end;
256..510: begin
                string2:= string2 + rs232.ReadNextClusterAsString;
                label2.Caption:= inttostr(n-255);
           end;
511..765: begin
                string3:= string3 + rs232.ReadNextClusterAsString;
                label3.Caption:= inttostr(n-510);
           end;
766..1020: begin
                string4:= string4 + rs232.ReadNextClusterAsString;
                label4.Caption:= inttostr(n-765);
           end;
1021:     begin
                label5.Caption:= ' Speicher voll ';
                label5.Color:= clred;
           end;
end;
n:=n+1
end;


und lasse sie dann in einer memobox darstellen

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var m: integer;
begin
memo1.Clear;
for m:=1 to 1023 do
        case m of
        1..255:   Memo1.Text:= Memo1.text + string1[m];
        256..510: Memo1.Text:= Memo1.text + string2[m-255];
        511..765: Memo1.text:= Memo1.text + string3[m-510];
        766..1020: Memo1.text:= Memo1.text + string4[m-765];
end;
end;
Das dargestellte sieht dann ungefhr so aus (wobei das noch keinen realen Werte sind weil ich den datenlogger noch vernnftig programmieren muss,soll halt nur ein Test sein.Auch noch keine Angaben zu welchen Zeitpunkt Datum etc. die Daten ausgelesen wurden.

ذذ ذذذ ذذذذ ذذ ذ ذ xPP `( Xhxp ؈pXX0hxxx𐀀 Аذ Ph pX@xP hXp` X (`H0x؈P (@X@P8и (@ 0(P0 Ш@xؘ0 (H00 @xpXh(Pxhx P@ p`XX0 訸 hxxpX(@ 0 P0X (8 0@谰 h` `H0 8 (@ p`Px8pXx8p8(xhPphx p h ( 8 8HH 8 8 Ȱؐ xx `H0@x PxPx`X@HШp`x0`x Ȱ`P@0p8؈ȰH 8 ( X H (``H0@ ИxxH ` `PhXP耐x`8xh 8x 8 ` x8X h (`hX` @(訐@P Xx x0 8x@@ P`HȰذ @0 `x (8p0(``(@ȸ h(( h h ` h 8

das mchte ich dann aber in einem array bringen der auf meiner Form2 so hnlich aussieht

Delphi-Quellcode:
TestWerte: ARRAY[1..31] of integer=(20,20,15,15,24,26,28,30,35,45,25,45,34,20,20,20,20,
                                        20,20,27,29,25,20,20,20,28,20,20,27,20,20);
und diese Werte werden dann in ein Koordinatensystem bergeben.also die 20 stellt z.B 20 im KO-system da.

und jetzt wei ich nicht genau weiter,habe etwas von einer Ord() Funktion gelesen aber wei nicht wie und wo ich die einbringen knnte.Kenne mich mit Delphi halt noch nicht so gut aus,war schon ziemlich froh das meine Oberflche mit dem KO-System und so weiter fertig ist.jetzt halt das Problem mit den Werten dort hineinbekommen.ich wrde mich freuen wenn man mir Tipps geben knnte.

[edit=Phoenix]Leerzeichen eingefgt, wegen des Layouts... Mfg, Phoenix[/edit]

shmia 31. Aug 2007 15:26

Re: Auslesen der Schnittstelle mit SerialNG
 
Ganz offensichtlich sind deine Daten binr.
Hast du ein Doku, in der jedes Byte erklrt wird ?
Beispiel:
Code:
Byte | Bedeutung
   0 | STX (start of text)
 1- 4 | Temperatur in mK
   5 | Einheit 'C'=Celcius, 'F'=Fahrenheit
   6 | EOT (end of text)
Und kannst du hier die Zusammenfasung angeben ?

Delphieinsteiger 31. Aug 2007 15:38

Re: Auslesen der Schnittstelle mit SerialNG
 
Leider habe ich keine Doku was das fr Werte sind,habe einfach die mewerte die ich mit einem Temperatursensor (KTY9) erfasse in einen microcontoller gebrannt und die dann in meine Memobox bertragen.Also zum Beispiel ein A ist laut ascii-code aus meinem Tabellenbuch eine 65.Gerade weil ich das nicht wei wrde ich ja gerne die Werte umwandeln.

shmia 31. Aug 2007 15:46

Re: Auslesen der Schnittstelle mit SerialNG
 
Zitat:

Zitat von Delphieinsteiger
Leider habe ich keine Doku was das fr Werte sind

Schlecht!
Also solltest du die Daten erst mal in Hexadezimal Darstellung wandeln:
Delphi-Quellcode:
procedure TForm1.RS232RxClusterEvent(Sender: TObject);
var
   hexstring : string;
begin
   hexstring := StrToHexString(rs232.ReadNextClusterAsString); // nach Hex wandeln
   string1:= string1 + hexstring + #13#10;
   // gleich als eine Zeile in einem Memo anzeigen
   memo1.lines.add(timeToStr(Now)+ ' - ' + hexstring);
end;
StrToHexString ist hier.

Delphieinsteiger 2. Sep 2007 16:43

Re: Auslesen der Schnittstelle mit SerialNG
 
Gibt es nicht die Mglichkeit das ich so wie ich es Auslese es sofort dezimal in meiner Memobox darstellen kann?Oder muss man es zuerst in hexadezimal wandeln?

EDatabaseError 2. Sep 2007 17:09

Re: Auslesen der Schnittstelle mit SerialNG
 
In dem du jedes Zeichen mit Ord(char) in seinen Dezimalwert umwandelst ;-)

Delphieinsteiger 2. Sep 2007 17:27

Re: Auslesen der Schnittstelle mit SerialNG
 
Danke

Aber wo kann ich das Ord(char) einbringen?Direkt in meine RS232RXClusterEvent Procedur?
Dann ungefhr so :

1..255: Begin
string1:=string1+rs232.ReadNextClusterAsString
String1:=Ord(char);
end;

oki 2. Sep 2007 17:35

Re: Auslesen der Schnittstelle mit SerialNG
 
Hi,
bist du dir sicher, dass du die richtigen Schnittstellenparameter verwendest (Baud, Stoppbit ...)?
Ohne Doku ist es schon sau schwer was ordentliches hin zu bekommen, aber wenn dann auch noch falsche Schnittstellenparameter dazu kommen :pale:

Gru oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.
Seite 1 von 2  1 2      

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