AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Ntzliche Links
Registrieren
Zurck Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Auslesen der Schnittstelle mit SerialNG
Thema durchsuchen
Ansicht
Themen-Optionen

Auslesen der Schnittstelle mit SerialNG

Ein Thema von Delphieinsteiger · begonnen am 29. Aug 2007 · letzter Beitrag vom 3. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
Delphieinsteiger

Registriert seit: 17. Aug 2007
45 Beitrge
 
#1

Auslesen der Schnittstelle mit SerialNG

  Alt 29. Aug 2007, 11:15
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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beitrge
 
#2

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 31. Aug 2007, 11:57
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 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
  Mit Zitat antworten Zitat
Delphieinsteiger

Registriert seit: 17. Aug 2007
45 Beitrge
 
#3

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 31. Aug 2007, 14:35
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]
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mr 2004
5.508 Beitrge
 
Delphi 5 Professional
 
#4

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 31. Aug 2007, 15:26
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 ?
Andreas
  Mit Zitat antworten Zitat
Delphieinsteiger

Registriert seit: 17. Aug 2007
45 Beitrge
 
#5

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 31. Aug 2007, 15:38
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mr 2004
5.508 Beitrge
 
Delphi 5 Professional
 
#6

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 31. Aug 2007, 15:46
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.
Andreas
  Mit Zitat antworten Zitat
Delphieinsteiger

Registriert seit: 17. Aug 2007
45 Beitrge
 
#7

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 2. Sep 2007, 16:43
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?
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Gppingen
1.238 Beitrge
 
Delphi 2007 Professional
 
#8

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 2. Sep 2007, 17:09
In dem du jedes Zeichen mit Ord(char) in seinen Dezimalwert umwandelst
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Delphieinsteiger

Registriert seit: 17. Aug 2007
45 Beitrge
 
#9

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 2. Sep 2007, 17:27
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;
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beitrge
 
Delphi 2007 Professional
 
#10

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 2. Sep 2007, 17:35
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

Gru oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beitrge zu antworten.
Es ist dir nicht erlaubt, Anhnge hochzuladen.
Es ist dir nicht erlaubt, deine Beitrge 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 06:18 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