Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Daten von ComPort in Stringliste speichern (https://www.delphipraxis.net/44882-daten-von-comport-stringliste-speichern.html)

Grolle 26. Apr 2005 13:08


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;

DerDan 26. Apr 2005 13:26

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

Grolle 26. Apr 2005 13:49

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:

Grolle 2. Mai 2005 14:13

Re: Daten von ComPort in Stringliste speichern
 
Ich brauche nochmal eure Hilfe. Habe es jetzt wie folgt gelöst:
Delphi-Quellcode:
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;
Jetzt werden allerdings alle Zeichen untereinander und nicht reihenweise
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:

Grolle 3. Mai 2005 14:18

Re: Daten von ComPort in Stringliste speichern
 
*push* :angel2:

Quake 3. Mai 2005 15:04

Re: Daten von ComPort in Stringliste speichern
 
List.Add legt immer eine neue Zeile an.
List.text:=List.text + ApdComPort1.GetChar;

Grolle 3. Mai 2005 15:53

Re: Daten von ComPort in Stringliste speichern
 
Hi!
Klappt auch nicht. Jeder Buchstabe wird schön untereinander
in der Datei abgespeichert. :?

Steve 4. Mai 2005 09:19

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:

Grolle 4. Mai 2005 10:14

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?

Steve 4. Mai 2005 10:22

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:

Grolle 4. Mai 2005 11:42

Re: Daten von ComPort in Stringliste speichern
 
Hi!
Also drin stehen solte so ungefähr das:

Zitat:

Do05.10.03 02:09:33 Status/Einstellung(N):
Status Input(1- 8):00000000 / Output(1-2):00
N1:+491714205012.0 N2:+491????????2.0
N3:+491????????3.0 N4:+491????????4.0
N5:+491????????5.0 E-Mail-Adr:
testadresse*T-Online.de
Auto: T2=Fr.16:15
Whlg: T3=00 mal
nach: T4=05 min
Prepaid: T5=200 Cent
Guthaben: 655.35 Euro
M1: 32 Zeichen SMS - Meldetext(M01)
M2: 32 Zeichen SMS - Meldetext(M02)
M3: 32 Zeichen SMS - Meldetext(M03)
M4: 32 Zeichen SMS - Meldetext(M04)
M5: 32 Zeichen SMS - Meldetext(M05)
M6: 32 Zeichen SMS - Meldetext(M06)
M7: 32 Zeichen SMS - Meldetext(M07)
M8: 32 Zeichen SMS - Meldetext(M08)
Mit nem Memo Feld funktioniert das so. :gruebel:

Grolle 4. Mai 2005 11:44

Re: Daten von ComPort in Stringliste speichern
 
äh, natürlich ohne den Smilie :mrgreen:

Steve 4. Mai 2005 11:48

Re: Daten von ComPort in Stringliste speichern
 
Hi,
Zitat:

Zitat von Grolle
Also drin stehen solte so ungefähr das:
...
Mit nem Memo Feld funktioniert das so. :gruebel:

Schau doch mal, was tatsächlich in den Parametern bzw. Variablen drinsteht (Breakpoint mit F5, durchsteppen mit F7/F8 ).

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:

Grolle 4. Mai 2005 15:35

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;

Quake 4. Mai 2005 16:26

Re: Daten von ComPort in Stringliste speichern
 
Dann solle das aber mit
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;
    List.Text := (Data);
    List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');
  end;
end;
funktionieren.

Grolle 4. Mai 2005 17:31

Re: Daten von ComPort in Stringliste speichern
 
Tut es aber nicht :cry:

Steve 6. Mai 2005 09:10

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:

Grolle 6. Mai 2005 13:02

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:
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;
Durch den CR wird die BaudRate des Endgerätes auf 9600 gesetzt (Dies funktioniert
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.

Steve 6. Mai 2005 13:16

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:

Grolle 6. Mai 2005 13:34

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.

Steve 6. Mai 2005 13:47

Re: Daten von ComPort in Stringliste speichern
 
Zitat:

Zitat von Grolle
Hi!
Habt Nachsicht - bin noch Anfänger :mrgreen:

Keine Sorge, das waren alle mal :zwinker:

Zitat:

Zitat von Grolle
Also Count hat bekommt keinen bestimmten Parameter zugewiesen.

Hä? :gruebel:

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:

ol1uw 6. Mai 2005 14:24

Re: Daten von ComPort in Stringliste speichern
 
Hallo was kommt denn hier raus

Delphi-Quellcode:
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;
stammt aus den Examples der TurboPower

Gruß Uwe

Grolle 6. Mai 2005 15:39

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.

ol1uw 6. Mai 2005 16:44

Re: Daten von ComPort in Stringliste speichern
 
Villeicht funktioniert dann das hier auch
Delphi-Quellcode:
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;
oder
Delphi-Quellcode:
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;
Gruß Uwe

Grolle 6. Mai 2005 17:53

Re: Daten von ComPort in Stringliste speichern
 
@ ol1uw
Leider nicht. Die Buchstaben werden alle untereinander
in die Liste geschrieben. :(

Steve 9. Mai 2005 08:19

Re: Daten von ComPort in Stringliste speichern
 
Hi,
Zitat:

Zitat von Grolle
@ steve
count = 1 hat er mir angezeigt und als Zeilenabschluss kommt eigentlich kein #13#10 :gruebel:

das sind doch mal gute Nachrichten :mrgreen: Die Schleife geht von 0 bis Count-1, wird für count=1 also genau einmal durchlaufen.
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