Einzelnen Beitrag anzeigen

Der_Unwissende

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

Re: Auslesen der Schnittstelle mit SerialNG

  Alt 31. Aug 2007, 11:57
Hi,
erstmal eine Kleinigkeit vorweg, wenn Du Code posten möchtest, dann benutze dafür am Besten die Delphi-Tags, die finden sich über dem Eingabefeld, wo Du den Beitrag eingibst. Einfach einmal auf Delphi-Code clicken, Code einfügen und auf Delphi-Code* Clicken, dann wird der Code einfach schöner dargestellt (nur für's nächste 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 würde meinen Arrays ja z.B am liebsten eine 23 für 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 häufig auch als String interpretiert werden müssen.
Bei der Übertragung gibt es aber verschiedene Möglichkeiten:
  • Es werden Daten fester Länge ü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 umfässt natürlich auch die möglichen Kombinationen. Das Problem bei der RS-232-Schnittstelle ist eben, dass die Kommunikation asynchron ist, Du bekommst einfach nur mehrere Bytes, ob die zusammengehören oder nicht, ob ein Datum komplett übertragen wurde, das musst Du selbst entscheiden. Vorab also die Warnung, dass Du hier ggf. drauf achten müsstest (kann Dir aber eventuell auch von SerialNG abgenommen werden).

Wenn Du jetzt also ein Datum empfängst, welche Form hat es denn? Hast Du bereits einen String wie '23' oder gar '23°'? Und möchtest 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 fängt dabei Fehler ab, wenn Du z.B. versuchst aus '1a0' eine Zahl zu machen. Die Funktion liefert ein Boolschen Wert zurück, ob die Umwandlung geklappt hat.
Für das Beispiel sähe dann die Umwandlung ungefähr so aus:
Delphi-Quellcode:
var temp: Integer;
begin
  // input ist der String, den Du in eine Temperatur umwandeln möchtest
  // Wenn Du das Grad-Zeichen dran hättest, 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 gültigen 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 möchtest
  temp := IntToStr(input);

  // oder wenn Du ein Grad Zeichen dran haben möchtest
  temp := IntToStr(input) + '°';
end;
Das ist jetzt natürlich nur der Weg, wenn Du ein einzelnen String oder Integer-Wert umwandeln möchtest. 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 hängt aber eben von dem Aufbau ab. Je nachdem ob es ein Trennzeichen gibt oder ein Datum eine feste Länge hat kommen unterschiedliche Wege in Frage, sag einfach erstmal wie die Daten aufgebaut sind.

Gruß Der Unwissende
  Mit Zitat antworten Zitat