![]() |
Daten von ComPort in Stringliste speichern
Hi!
Ich möchte gerne das, was von der ComSchnittstelle zurück kommt (benutze Async Pro) in eine Stringliste speichern. Das funtioniert nicht und ich weiß nicht wo der Fehler liegt (Es wird nur ein Zeichen gespeichert. Müssten aber einige Reihen sein.) Hier der Quelltext:
Delphi-Quellcode:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var Data: String; I: Integer; List: TStringList; begin List:=TStringList.Create; Data := ''; for I:= 0 to Count-1 do Data := Data + ApdComPort1.GetChar; List.Add(Data); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); List.Free; end; |
Re: Daten von ComPort in Stringliste speichern
Hallo,
du erzeugst deine Datei jedesmal neu wenn ein Event kommt, daher steht da immer nur ein Wert drin! entweder du lädst deine Datei immer in die jedesmal neu erzeugte Liste und fügst dann dein Wert dazu oder du erzeugst die Liste als Classen Variable der Form und speicherst somit immer alle Events mfg DerDan |
Re: Daten von ComPort in Stringliste speichern
Hi!
Ich kann dir leider nicht so ganz folgen. Die Datei ist ja eine temporäre Datei und soll nur für dieses Ereignis ge- ändert (bzw. erzeugt)werden. Ich weiß ja auch, welche Ereignisse kommen. Bitte nicht schlagen, wenn ich jetzt totalen Müll geschrieben hab. :drunken: |
Re: Daten von ComPort in Stringliste speichern
Ich brauche nochmal eure Hilfe. Habe es jetzt wie folgt gelöst:
Delphi-Quellcode:
Jetzt werden allerdings alle Zeichen untereinander und nicht reihenweise
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var I: Integer; begin for I:= 0 to Count-1 do List.Add(ApdComPort1.GetChar); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; in die Datei gespeichert, wie es sein soll. Wie kann ich das ändern? Ist wahrscheinlich ne doofe Frage, aber ich habe noch nie wirklich mit Stringlisten gearbeitet. :roll: |
Re: Daten von ComPort in Stringliste speichern
*push* :angel2:
|
Re: Daten von ComPort in Stringliste speichern
List.Add legt immer eine neue Zeile an.
List.text:=List.text + ApdComPort1.GetChar; |
Re: Daten von ComPort in Stringliste speichern
Hi!
Klappt auch nicht. Jeder Buchstabe wird schön untereinander in der Datei abgespeichert. :? |
Re: Daten von ComPort in Stringliste speichern
Hi,
evtl. gehts so:
Delphi-Quellcode:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var I: Integer; txt: STRING; begin txt := ''; for I:= 0 to Count-1 do begin txt := txt+ApdComPort1.GetChar; end; List.Add(txt); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; [edit] Sind evtl CR/LF's (#13#10) in der empfangenen Zeichenkette enthalten? [/edit] Gruß Stephan :dance: |
Re: Daten von ComPort in Stringliste speichern
Hi!
Funktioniert leider auch nicht. Alle Buchstaben stehen in der Liste untereinander. Vielleicht sollt ich mich mal nach einer anderen Lösung umsehen? |
Re: Daten von ComPort in Stringliste speichern
Hi,
hast mal geschaut, welche Zeichen in 'txt' stehen? Wie groß ist 'count'? Ist count bspw. 1, dann müssen die Zeichen untereinander stehen. Wie wird Dein erwarteter String abgeschlossen? Habe selber schon einiges mit ASync Pro gemacht, und das funzt mit Sicherheit irgendwie :mrgreen: Gruß Stephan :dance: |
Re: Daten von ComPort in Stringliste speichern
Hi!
Also drin stehen solte so ungefähr das: Zitat:
|
Re: Daten von ComPort in Stringliste speichern
äh, natürlich ohne den Smilie :mrgreen:
|
Re: Daten von ComPort in Stringliste speichern
Hi,
Zitat:
Und wenns in nem Memo klappt, klappts auch in ner Stringlist. TMemo.Lines stammt genauso wie TStringList von TStrings ab bzw. ist vom Typ TStrings... mach das, womit du den Text ins Memo bekommst einfach genauso für die Stringlist ;) Bzw. wie hast Du denn den Text ins Memo bekommen? Gruß Stephan :dance: |
Re: Daten von ComPort in Stringliste speichern
Hi!
Habe mich vertan. War doch nen RichEdit. Mit nem Memo gehts aber so auch. Hier der Source:
Delphi-Quellcode:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var Data: String; I: Integer; begin Data := ''; for I:= 0 to Count-1 do begin Data := Data + ApdComPort1.GetChar; RichEdit1.SelText := (Data); end; end; |
Re: Daten von ComPort in Stringliste speichern
Dann solle das aber mit
Delphi-Quellcode:
funktionieren.
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var Data: String; I: Integer; begin Data := ''; for I:= 0 to Count-1 do begin Data := Data + ApdComPort1.GetChar; List.Text := (Data); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; end; |
Re: Daten von ComPort in Stringliste speichern
Tut es aber nicht :cry:
|
Re: Daten von ComPort in Stringliste speichern
Hi,
der Code von Quake kann auch nicht wirklich funktionieren, da die Schleife auch das Add und das Speichern beinhaltet, also für jedes einzelne Zeichen. Und nicht erst, wenn die Zeichenfolge "fertig" ist. Hab doch nun einige Anregungen gegeben bzw. Fragen gestellt (Debuggen, String-Abschluss etc.) - versuch das doch mal, damit wir der Fehlerursache auf die Schliche kommen :!: Gruß Stephan :dance: |
Re: Daten von ComPort in Stringliste speichern
Hi Steve!
Hier nochmal was ich grundsätzlich versuche: Ich stelle eine Verbindung zu dem Endgerät her:
Delphi-Quellcode:
Durch den CR wird die BaudRate des Endgerätes auf 9600 gesetzt (Dies funktioniert
procedure TForm1.ToolButton6Click(Sender: TObject);
begin if FileExists(ExtractFilePath(ParamStr(0))+'verbindung.ini') then begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'verbindung.ini'); if ini.ReadBool ('comport','checked',true) then begin ApdComPort1.ComNumber := ini.ReadInteger('comport','port',0); ApdComPort1.Output := #13; StatusBar1.Panels.Items[0].Text := 'Verbunden'; end; end else Form2.Show; end; komischerweise auch nicht immer). Nun sende ich per Button Click z. B. 'M10=EIN'. Dadurch werden z. B. die Einstellungen abgefragt. Diese hatte ich in einem Beitrag weiter oben schon mal gepostet. So wie sie in dem Beitrag stehen kommen sie auch zurück. Mit Hyperterminal funktioniert das alles sehr gut. Ich weiß eben nicht, wie ich die empfangenen Daten weiterverwerten kann. (Stringliste, in Memo speichern etc.). Fehlermeldungen bekomme ich eigentlich keine. |
Re: Daten von ComPort in Stringliste speichern
Hi,
ich denke, ich verstehe schon halbwegs, was Du machen möchtest :) Mich interessiert viel mehr, woher Dein Fehler (in der abgespeicherten StringList/Datei) kommt. Darum nochmal: Welchen Wert hat der Parameter count in ApdComPort1TriggerAvail und erwartest Du als Abschluss einer empfangenen Zeichenfolge ein bestimmtes Zeichen, damit Du weißt, wann die Übertragung fertig ist? :?: Was ist an den Fragen denn so schwer? :wall: sorry, ich versteh's net... :stupid: Gruß Stephan :dance: |
Re: Daten von ComPort in Stringliste speichern
Hi!
Habt Nachsicht - bin noch Anfänger :mrgreen: Also Count hat bekommt keinen bestimmten Parameter zugewiesen. Ein bestimmtes Zeichen erwarte ich eigentlich nicht am Ende der Über- tragung. Ich könnte z. B. natürlich sagen, dass die letzten 4 Zeichen [M8] sein sollen, obwohl das nicht immer zutreffend ist. |
Re: Daten von ComPort in Stringliste speichern
Zitat:
Zitat:
Mach' doch mal bitte folgendes: Gehe in Deinem Code in die erste Zeile der Methode ApdComPort1TriggerAvail. Drücke F5 - nun sollte die Zeile hervorgehoben sein und links am Zeilenrand ein roter Punkt sein. Wenn Du nun via F9 übersetzt, sollte in dem roten Punkt ein Häkchen sein. (Ansonsten in der nächsten Zeile F5 drücken). Wenn nun der Code ausgeführt wird, also ein OnTriggerAvail ausgelöst wird, springt der Debugger an diesen Haltepunkt. Dann fahre mit der Maus über "count" oder markiere count und drücke Strg+F5. Somit wird Dir angezeigt, welchen Wert count momentan gerade hat -> Und dann teil uns mit, welchen Wert count hier hat :) Und zum "Zeilenabschluss": ich dachte da an so #13#10 o.ä. ;) muss aber nicht sein... Gruß Stephan :dance: |
Re: Daten von ComPort in Stringliste speichern
Hallo was kommt denn hier raus
Delphi-Quellcode:
stammt aus den Examples der TurboPower
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
{Event OnTriggerAvail - Example how OnTriggerAvail works} var I : Word; C : Char; S : String; begin S := ''; for I := 1 to Count do begin C := ApdComPort1.GetChar; case C of #0..#31 : {Don't display} ; else S := S + C; end; end; ShowMessage('Got an OnTriggerAvail event for: ' + S); end; Gruß Uwe |
Re: Daten von ComPort in Stringliste speichern
@ steve
count = 1 hat er mir angezeigt und als Zeilenabschluss kommt eigentlich kein #13#10 :gruebel: @ ol1uw Aha, da tut sich was. Anzeigen tut ers schonmal. |
Re: Daten von ComPort in Stringliste speichern
Villeicht funktioniert dann das hier auch
Delphi-Quellcode:
oder
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
{Event OnTriggerAvail - Example how OnTriggerAvail works} var I : Word; C : Char; S : String; List: TStringList; begin List:=TStringList.Create; List.LoadFromFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); S := ''; for I := 1 to Count do begin C := ApdComPort1.GetChar; case C of #0..#31 : {Don't display} ; else S := S + C; end; end; List.add(s); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); List.Free; end;
Delphi-Quellcode:
Gruß Uwe
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
{Event OnTriggerAvail - Example how OnTriggerAvail works} var I : Word; C : Char; S : String; List: TStringList; begin List:=TStringList.Create; List.LoadFromFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); S := ''; for I := 1 to Count do begin C := ApdComPort1.GetChar; case C of #0..#31 : {Don't display} ; else S := S + C; end; end; List.Text:=List.Text+S; List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); List.Free; end; |
Re: Daten von ComPort in Stringliste speichern
@ ol1uw
Leider nicht. Die Buchstaben werden alle untereinander in die Liste geschrieben. :( |
Re: Daten von ComPort in Stringliste speichern
Hi,
Zitat:
Also bekommst Du via GetChar nur ein Zeichen. Und dieses wird an die Stringliste als eigener Eintrag angehängt. Jeder Eintrag wird als eigene Zeile in die gespeichert, also muss das Ergebnis ja so aussehen! :cyclops: In meinem Fall war es so, dass die zurückgegebene Zeichenkette mit einem Steuerzeichen abgeschlossen wurde (z.B. #0, oder in meinem Fall eben #13#10), wenn die Antwort des Geräts auf meine Anfrage vollständig bzw. abgeschlossen war. (Daher meine dauernde Nachfrage nach dem String-Abschluss ;) ) Habe dann einfach nen String private deklariert, diesen mit in OnTriggerAvail für i:=0 bis count-1 mit GetChar gefüllt und geprüft, ob die letzten Zeichen #13#10 waren. Wenn nicht, passierte gar nix und im nächsten OnTriggerAvail wurden die nächsten empfangenen Zeichen angehängt. Falls aber doch, war die Übermittlung abgeschlossen und ich konnte meine empfangene Zeichenkette auswerten :) Gruß Stephan :dance: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz