![]() |
String zerlegen und Teile in Integer umwandeln, AsyncPro
Hallo,
ich empfange über RS232 Zeichenketten, die das Format 2-3 Zahlen, : , 1-4Zahlen haben. Jetzt habe ich versucht, mit dem Quellcode
Delphi-Quellcode:
die vorderen Zahlen und die hinteren Zahlen jeweils in einen String zu kopieren. Wenn ich dann z.B. den String "Wert" in einem Memo anzeige, klappt das auch, aber wenn ich ihn in einen Integer umwandeln will, bekomme ich die Meldung :
procedure TForm1.signale;
var i,j,k,nummer_i,wert_i: integer; nummer, wert, input2: string; begin input2 := input; i := 0; j := 0; k := 0; i := pos(':', input2); for j := i + 1 to length(input2) do wert := wert + input2[j]; memo1.Lines.Add(input2); showmessage(wert); nummer_i := strtoint(wert); //wert_i := strtoint(wert); // paintbox1.Canvas.MoveTo(round(arccos((nummer_i-49)*3861/(Wert_i-37)))*8,8*round(arcsin((nummer_i-49)*3861/(Wert_i-37)))); // paintbox1.Canvas.Pixels[round(arccos((nummer_i-49)*3861/(Wert_i-37)))*8,8*round(arcsin((nummer_i-49)*3861/(Wert_i-37)))] := clred; memo2.Lines.Add(wert); end; --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt signalp.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: ''46 ' ist kein gültiger Integerwert'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- Habt ihr eine Idee, wo da der Fehler liegt? Gruß Spurius |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Hallo,
mich würde interessieren was das werden soll. :wiejetzt: Und was ist ein RS232 :?: //oder wie das ding heißt Wenn du zu einen String erzeugst, indem du in einer Schleife Teilstrings dazu addierst, dann sollte der String vorher am besten leer sein oder zumindest einen klar definierten Wert haben. Wenn du einer Variablen keinen Wert zuweist, dann hat sie immer noch den Inhalt, der schon im Speicher stand, als sie angelegt wurde. :!: Übrigens liest du mit Code nur die Zahlen nach dem ':' ein. Gruß Roedel |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Hi,
mit RS232 meinte ich die serielle Schnittstelle. Ich habe auch versucht, eine normale Zahlenfolge ohne ":" zu schicken, auch die kam an, aber die Umwandlung nach Integer geht auch da nicht. |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
evtl. haste ja nach der zehl noch n leerzeichen/sonderzeichen?
schau doch mal wie lange deine strings sind und ob das mit der länge der zahl übereinstimmt. |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Ich würde den String mit Copy() zerlegen - geht besser.
Delphi-Quellcode:
(Vorsicht - Code wurde gerade on-the-fly von Brain 1.0 generiert! Evtl. mit den Copy-Parametern rumspielen)
...
var VordereZahl, HintereZahl: string; ... j := pos(':',input2); if j <> 0 then begin VordereZahl := Copy(input2,1,j); // Alles vor ":" kopieren HintereZahl := Copy(input2,j+1,length(Input2)-j); // Alles nach ":" kopieren end else begin ShowMessage('Kein ":" gefunden!'); end; |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Zitat:
Delphi-Quellcode:
ach ja ... ich hatte das mir zusammengebastelt ...
VordereZahl := Copy(input2,1,j-1); // Alles vor ":" kopieren
Delphi-Quellcode:
aber Copy ist schon n stück feiner!
j := pos(':',input2);
for i := 1 to j-1 do zahl1 := zahl1+input2[i]; for i := j+1 to Length(input2) do zahl2 := zahl2+input2[i]; |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Hallo,
also bei einer 3-stelligen Zahl zeigt er 5 als Länge an :?: HyperTerminal Listet die Zahlen untereinander, bei mir sind aber Leerzeilen dazwischen. Hast du ne Idee wie ich das lösen kann? |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
@TeronG
Danke für die Korrektur - passiert halt wenn mal fix was aussen Kopf schreibt ^^ @Spurius Probiere mal trim(input2);. Kann sein, dass noch unnötige Leer- und Steuerzeichen davor oder dahinter liegen. |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Wenn Leerzeichen dazwischen sind hilft trim nicht, da würde ich StringReplace nutzen.
MfG freak |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Hi,
also hinten scheint zumindest das Ascii-Zeichen mit der Nummer 13 angehängt zu sein ![]() Also kann ich doch trim nutzen oder? |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Zitat:
so n +/-1 kann einem schon ganz schön zeit kosten ^^ (oder wenn man wie ich mal vergisst dem endgerät zu sagen, daß es dir was schicken soll :oops: ) Zitat:
evtl. mal die Endposition mit posex(' ',g) suchen. |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Zitat:
(#13 ist das Steuerzeichen für CR (Zeilenumbruch)). @freak4fun Man kann ja trim dann auch einzeln auf "VordereZahl" und "HintereZahl" anwenden... |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Zitat:
|
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Hallo,
also es geht jetzt, aber nur wenn ich weniger als 7 Zeichen insegamt habe. Also 67:331 ist ok, aber 103:223 nicht, da komt wieder ein Fehler wegen ungültigem Integer.
Delphi-Quellcode:
procedure TForm1.signale;
var i,j,k,nummer_i,wert_i: integer; nummer, wert, input2: string; begin input2 := ''; input2 := trim(input); i := 0; i := pos(':', input2); nummer := copy(input2,1,i - 1); wert := copy(input2,i + 1,length(input)); memo1.Lines.Add(input2); nummer_i := strtoint(nummer); wert_i := strtoint(wert); // paintbox1.Canvas.MoveTo(round(arccos((nummer_i-49)*3861/(Wert_i-37)))*8,8*round(arcsin((nummer_i-49)*3861/(Wert_i-37)))); // paintbox1.Canvas.Pixels[round(arccos((nummer_i-49)*3861/(Wert_i-37)))*8,8*round(arcsin((nummer_i-49)*3861/(Wert_i-37)))] := clred; memo2.Lines.Add(wert); end; |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
:gruebel: (so auf die schnelle ^^)
Delphi-Quellcode:
Trim(nummer);
Trim(wert); |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Kannst du und ein zu zerlegendes String hier posten?
|
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Hi,
also das trim(wert), trim(nummer) hat nichts gebracht. Bsp.string der geht: 99:139 Bsp.string der nicht geht: 100:139 Direkt an einem Terminal empfangen sieht man, dass hinten dran <0D><0A> hängen, und auch wenn mans durch trim durchjagt, bleiben die 13 und die 10 hinten dran hängen. |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Aber Hallo !
Auch ich empfange Zeichenketten von einer seriellen Schnittstelle (RS232). Die eingehenden Strings haben folgendes Format: Beispiel:= '$01RR000 000000023 000000000' + chr(13) und setzen sich wie folgt zusammen:
Delphi-Quellcode:
In meiner Anwendung muss ich nun die Zeichen 4 und 5 ('RR') als Zeichenkette interpretieren, damit mein Programm weiß, dass es sich um den Befehl bzw. Zeichenkettentyp "Report Ready" handelt und entsprechend darauf reagieren kann.
$ = Startzeichen des Strings (Dollarzeichen, ASCII 36)
0 = Serial Master Address 1 = Serial Slave Address RR = "Report Ready" (ein spezielles Kommando) 000 = Speicherort 000000023 = Zählerstand 000000000 = darf ich getrost ignorieren #13 = Endezeichen des Strings (ASCII 13) Nur bei 'RR' sollen nämlich die Zeichen 15 bis 18 ('0023') in einem Panel angezeigt und ggf. noch zu einem Integer konvertiert werden. Ein paar Code-Schnipsel:
Delphi-Quellcode:
Ich frage mich, ob man die Zugriffe auf die Einzelzeichen des Strings mit Msg[x] sowie die Verwendung der Copy-Funktion nicht etwas etwas eleganter lösen könnte ? :roll:
// *** An der seriellen Schnittstelle liegt ein Empfangsereignis an ***
procedure TForm1.VaComm1RxChar(Sender: TObject; Count: Integer); var i: integer; begin //Alter Code: //r:= VaComm1.ReadText; //Memo2.Lines.Text:= Memo2.Lines.Text + r; //Neuer Code: //Lese Daten von der seriellen Schnittstelle r:= VaComm1.ReadText; hhALed7.TrueColor:= clYellow; for i := 1 to Length(r) do case r[i] of #10:; // ignorieren #13: // Wir warten lediglich auf #13 begin Memo2.Lines.Add(FMessage); //Jetzt erfolgt die Auswertung des Strings Analyze(FMessage); FMessage := ''; end; else //nicht #10 oder #13 FMessage := FMessage + r[i]; end; hhALed7.TrueColor:= clLime; end; // *** Zählerstand automatisch abfragen (Standard-Intervall 250 ms) *** procedure TForm1.Timer2Timer(Sender: TObject); var a: string; i: integer; begin if not CheckBox13.Checked then Exit; if RefIndex = $FF then HeadAdr:= UpDown1.Position else HeadAdr:= RefIndex; StatusBar1.Panels[6].Text:= 'RefIndex: ' + IntToStr(RefIndex) + ' '+ 'HeadAdr: ' + IntToStr(HeadAdr); StatusBar1.Panels[5].Text:= 'Lese Report von Schreibkopf ' + IntToStr(HeadAdr) + ' ....'; w:= '$0' + IntToStr(HeadAdr) + 'RR' + MLD[HeadAdr]; w:= w + CreateChecksum(w) + #13; VaComm1.WriteText(w); Memo1.Lines.Add(w); // --> erstmal raus hier, Auswertung soll nun über neue Routine erfolgen Exit; ... ... ... end; // *** Auswertung des empfangenen Strings *** procedure TForm1.Analyze(Msg: string); begin if Msg[1] = '$' then begin if (Msg[4] = 'R') and (Msg[5] = 'R') then begin with Memo2.Lines do begin if Copy(Strings[Count-1], 4, 2) = 'RR' then Panel7.Caption:= Copy(Strings[Count-1], 15, 4); try Counter[HeadAdr]:= StrToInt(Panel7.Caption); except Counter[HeadAdr]:= 0; Panel7.Caption:= '----'; end; //try end; //if end; //with end; //if end; //procedure Für die Abfrage der seriellen Schnittstelle verwende ich übrigens die Komponenten Varian Async 32. Funktionieren sehr gut, ich kann nicht meckern. :-D So long, wünsche weiterhin stets eine Handbreit StrToInt() ohne Exception .... :P Gruß Andreas |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Einwurf:
Das OnRxChar wird ausgeführt sobald was im Buffer ist. Wenn du bspw. "Hallo was geht ab" schickst kommt kann es im onrxchar so rauskommen: Hallo w nächstes onrxchar as geh nachstes onchar t ab Wenn du nun zahlen empfängst ist es das gleiche. Ich hoffe das hilft. Mfg Tobi |
Re: String zerlegen und Teile in Integer umwandeln, AsyncPro
Zitat:
2. Zeichen = Ziffer2 3. Zeichen = Ziffer3 4. Zeichen = #13 5. Zeichen = #10 Das 4. und 5. Zeichen ist der angezeigt zeilenumbruch. Den solltest du mit StringReplace wegmachen. ;-) Mfg Tobi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 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