Entwickler-Ecke

Dateizugriff - Daten von ComPort in Stringliste speichern


Grolle - Di 26.04.05 11:38
Titel: 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-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
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;


chrisw - Mi 27.04.05 12:09


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//...global Variable
   List : TStringList;

//... im OnCreate des Forms
List := TStringList.Create;

//... im OnClose des Forms
  List.Free;


procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);  
var  I: Integer;  
begin  
   for I:= 0 to Count-1 do List.Add(ApdComPort1.GetChar); //oder  heisst es 1 to Count ? Bitte noch mal prüfen, da ich die Komponente Async Pro nicht kenne ! 
  List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); 
end;


Grolle - Mo 02.05.05 11:30

Hi!
So klappt das schon fast. Allerdings werden die Buchstaben alle untereinander
geschrieben. Wie schreibt er das denn jetzt zeilenweise (so wie es ankommt)
in die Stringliste?
Viele Grüße: Grolle


Smartie - Mo 02.05.05 14:23

Servus,

ich hatte ein änlichzes Problem, und ich hab es folgendermaßen gelöst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for I := 1 to Count do begin
    C := ApdComPort1.GetChar;
    case C of
      #0..#31 : {Don't display} ;
      else S := S + C;
    end;
  end;
  tempBuffer := tempBuffer + S;   //Erst temporär


und dann am Schluß den tempBuffer abspeichern.

Fuß zum Gruß

Smartie


Grolle - Mo 02.05.05 15:01

Hi!
danke für deine Antwort. Allerdings bleibt das Programm bei
der Case Anweisung hängen (Ordinaltyp erforderlich?)
Viele Grüße....


Smartie - Mo 02.05.05 15:05

Dann laß die Case-Anweisung einfach weg. Wen ndu sie nutzen wilslt, mußt du deine Zeichen als Char einzeln nehmen. die Case ist nur dazu da, um die ersten 31 ASCII-Zeichen "fernzuhalten", sprich sowas wie tab, oder auch CR und LF etc.

Gruß

Smartie


Grolle - Mo 02.05.05 15:13

Muss ich tempBuffer dann erst nen leeren String zuweisen?
Ich checks net :nixweiss:


Smartie - Mo 02.05.05 15:19

user profile iconGrolle hat folgendes geschrieben:
Muss ich tempBuffer dann erst nen leeren String zuweisen?
Ich checks net :nixweiss:


Jup, das wäre Sinnvoll.

Ich hab meine Anbindung ein bischen anders als du, deswegen würde es nicht viel sinn ergeben dir hier meinen komplette ncode einzutippen.

Spiel einfach ein bischen rum, ich hab auch n bischen länger gebraucht bis ichs funktionierend hatte. Such mal auch im forum rum, ich hab ähnliche fragen wie du vor knapp 2 wochen gestellt, gibt ziemlich ausführliche threats zu, auch in den FAQs

Lieben Gruß

Smartie


Grolle - Mo 02.05.05 15:27

Ich schick dir nochmal den Quelltext. Es wird aber immer noch jeder einzelne
Buchstabe untereinander in die Stringliste geschrieben :gruebel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  c,tempBuffer : string;
  I: Integer;
begin
  tempBuffer := '';
  for I:= 1 to Count do
    begin
      C := ApdComPort1.GetChar;
    end;
  tempBuffer := tempBuffer + c;
  List.Add(tempBuffer);
  List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');
end;

Viele Grüße... Grolle


Smartie - Mo 02.05.05 15:36

Schau ma lden Code genauer an.

Du lässt deine Schleife durchlaufen, und änderst ständig dein 'c', und dann lässt du das letzte c einfach zum tempBuffer dazuschreiben.

probiers doch mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);  
var  
  C, tempBuffer : string;  
  I: Integer;  
begin  
  tempBuffer := '';  
  for I:= 1 to Count do  
    begin  
      C := ApdComPort1.GetChar;
      tempBuffer := tempBuffer + C;
    end;  
    
  List.Add(tempBuffer);  
  List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');  
end;


Ich hoffe des klappt, ich habs nicht ausprobiert.

Lieben Gruß

Smartie


chrisw - Mo 02.05.05 15:38


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);  
var  
  I: Integer;  
begin 
  with TStringList.Create do
  try
    for I:= 0 to Count-1 do Text := Text + ApdComPort1.GetChar;  
    SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');  
  finally
    Free;
  end;
end;


Grolle - Mo 02.05.05 15:41

Hi Smartie!
Auch auf die Gefahr hin, dass du mir gleich den Kopf abreißt:
Es klappt so auch nicht. Alle Buchstaben sind schön untereinander. :evil:
Viele Grüße: Grolle


Smartie - Mo 02.05.05 15:45

Ich werd dir sicher nicht den Kopf abreißen. Ich hab selbst erst morgen vor 3 Wochen mit Delphi angefangen, und gehöre somit selbst noch zu den Anfängern.

Bist du sicher, daß du auc hwirklich den tempBuffer in deine Datei schreiben läßt, und nicht "C"?
:gruebel:
Lieben Gruß

Smartie


Grolle - Mo 02.05.05 17:33

@ chrisw
Bei deinem Vorschlag wird leider gar nix in die Liste (Datei)
geschrieben. :( .


chrisw - Di 03.05.05 07:35

Dann probier das hier mal !
(Der Fehler war, dass er Count von der TStringList und nicht von der procedure genommen hat.
Da die Liste leer ist, hat er auch nichts reingeschrieben)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);   
var
  I: Integer;
  t : TStringList;
begin
  t := TStringList.Create;
  try
    for I:= 0 to Count-1 do t.Text := t.Text + ApdComPort1.GetChar;       //Dieses Count !
    t.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');
  finally
    t.Free;
  end;


Grolle - Di 03.05.05 09:40

Hi Chris!
Hat auch nicht geklappt. Die Datei ist nach wie vor leer.
Ich werde noch verrückt... :bawling:
Habe es jetzt so probiert, aber in der Datei stehen alle
Buchstaben untereinander und es gibt ne Exception:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
 
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  c,tempBuffer : string;
  I: Integer;
begin
  tempBuffer := '';
  for I:= 1 to Count do
    begin
      C := ApdComPort1.GetChar;
      tempBuffer := tempBuffer + c;
    end;
  List.Add(tempBuffer);
  List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');
end;

HIIIIIIIIIIIILLLLLLLLLLLFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEE


chrisw - Di 03.05.05 10:23


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); 
var
  I: Integer;
  t : TStringList;
  tempStr : String;
begin
  t := TStringList.Create;
  try
    for I:= 1 to Count do tempStr := tempStr + ApdComPort1.GetChar;
    t.Text := tempStr;
    t.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');
  finally
    t.Free;
  end;
end;


chrisw - Di 03.05.05 10:41

Ich denke Du hast ein grundsätzliches Verständnisproblem der Arbeitsweise der seriellen Schnittstelle ! Guck mal hier [http://www.delphi-forum.de/viewtopic.php?t=40427&highlight=smartie], da hab ich das schon mal erklärt !

Chris


Grolle - Di 03.05.05 14:04

Hi!
Danke erstmal für eure Antworten und für eure Geduld. :roll:
vielleicht habe ich noch nicht das wirkliche Verständniss für
die RS232, aber warum funktioniert dann folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
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;

Hier wird einfach das, was von dem Gerät zurück kommt an ein Memo über-
geben. Das funktioniert sehr gut. Warum klappt das mit der Stringliste
nicht?


chrisw - Di 03.05.05 14:34

Wenn Du mein letztes Beispiel nimmst, die Zeile I := 1 to Count ..
in I := 0 to Count -1 ... änderst sollte es dann auch funktionieren !


Grolle - Mi 04.05.05 10:22

Hi!
Funktioniert leider auch so nicht!
Sollte ich mich nach einer komplett
anderen Lösung umsehen?


chrisw - Mi 04.05.05 10:49

Probier mal das hier !

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
//globale variable    
RS232Active : Boolean;  
tempBuffer     : String;   //als temporärer Buffer  
//im OnCreate der Form    
RS232Active := False;    
//Einen Timer einfügen in dem nach 2 Sekunden (2000 im Interval eintragen)     
procedure TForm1.Timer1Timer(Sender: TObject);    
begin    
  RS232Active := False;      //RS232 nicht mehr aktiv
  with TStringList.Create do //Abspeichern
  try
    Text := tempBuffer;
    SaveToFile('c:\test.txt'); 
  finally
    Free;
  end;
   tempBuffer := ''// Buffer Löschen   
end;    

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);      
  {Event OnTriggerAvail - Example how OnTriggerAvail works}      
var      
  I : Word;      
begin      
  RS232Active := True;    //RS232 ist aktiv
  Timer1.enabled := False; // Timer neustarten !!    
  Timer1.enabled := True;    
  for I := 1 to Count do tempBuffer := tempBuffer + ApdComPort1.GetChar;      //Empfangene Zeichen nach tempBuffer
 end;