![]() |
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. |
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:
Bei der bertragung gibt es aber verschiedene Mglichkeiten:
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:
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).
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;
Delphi-Quellcode:
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.
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; Gru Der Unwissende |
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:
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.
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; ذذ ذذذ ذذذذ ذذ ذ ذ 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:
und diese Werte werden dann in ein Koordinatensystem bergeben.also die 20 stellt z.B 20 im KO-system da.
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 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] |
Re: Auslesen der Schnittstelle mit SerialNG
Ganz offensichtlich sind deine Daten binr.
Hast du ein Doku, in der jedes Byte erklrt wird ? Beispiel:
Code:
Und kannst du hier die Zusammenfasung angeben ?
Byte | Bedeutung
0 | STX (start of text) 1- 4 | Temperatur in mK 5 | Einheit 'C'=Celcius, 'F'=Fahrenheit 6 | EOT (end of text) |
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.
|
Re: Auslesen der Schnittstelle mit SerialNG
Zitat:
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; ![]() |
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?
|
Re: Auslesen der Schnittstelle mit SerialNG
In dem du jedes Zeichen mit Ord(char) in seinen Dezimalwert umwandelst ;-)
|
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; |
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 20:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz