Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 17.08.11 14:34 
Hallo Leute aus einem anderen Threat hier nochmal eine neue Frage:
ICh habe strings die ich über den Comport senden möchte, welche ich aus einer Datei auslese:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Z:=0;
while length(txtdat)>0 do
begin
I:=pos('1A1A',txtdat);  //Trennzeichen
substring:=copy(txtdat,1,I-1);
//form1.ListBox1.Items.Add(inttostr(I));
if Z=1 then
  begin
  while form1.SerialPortNG2.SendInProgress= false do
  form1.serialportng2.SendString(HexTostr(substring)); // hier wird der String gesendet
  form1.ListBox1.Items.Add(substring);
  Z:=0;
  end
  else
z:=z+1;
delete(txtdat,1,(I-1));
delete(txtdat,1,4);      //Hier wird nur das Trennzeichen gelöscht

end;
//form1.serialportng2.SendString(HexToStr('5261010100B54D4105530000000100E7'));

end;

Das problem daran ist, dass Strings verschluckt werden.
Also der erste wird gesendet, und mir in meiner Listbox auch angezeigt, der Zweite wohl auch noch aber der 3 zum Beipiel wird zwar in meiner Listbox angezeigt, aber nicht gesendet.
Als ob die Componente nicht hinterherkommt, wenn die Schleife durchlaufen wird.
KAnn das sein und wie kann ich darauf warten bis die Componente fertig ist und erst dann einen neuen String reinfüttern?
HAb das mit while versucht, aber wohl kläcklich gescheitert.
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 17.08.11 14:50 
Wenn du deinen Code ordentlich einrücken würdest, würdest du bemerken, dass da (mindestens?) ein begin fehlt ;)
So wird nämlich nur die erste Anweisung ausgeführt, und dein Z nicht wieder auf 0 gesetzt.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 17.08.11 15:03 
Ich hab das jetzt abgeändert und das While rausgenommen, so läuft alles durch und die Listbox weird gefüllt, nur wird nicht alles gesendet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Z:=0;
while length(txtdat)>0 do
begin
 I:=pos('1A1A',txtdat);  //Trennzeichen
 substring:=copy(txtdat,1,I-1);
 //form1.ListBox1.Items.Add(inttostr(I));
 if Z=1 then
  begin
   form1.serialportng2.SendString(HexTostr(substring));
   form1.ListBox1.Items.Add(substring);
   Z:=0;
  end
  else
 z:=z+1;
 delete(txtdat,1,(I-1));
 delete(txtdat,1,4);      //Hier wird nur das Trennzeichen gelöscht

end;
//form1.serialportng2.SendString(HexToStr('5261010100B54D4105530000000100E7'));

end;

Wie kann ich das jetzt hinbekommen, dass er auch alles sendet, er also bei jedem Durchlauf wartet bis der vorherige String gesendet wurde?
Grüße Christian
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 17.08.11 15:19 
wofür war gleich das Z noch mal gut? So, wie die Schleife jetzt ist, wird beim ersten Durchlauf (Z=0) nichts gesendet, aber trotzdem (IMMER) am Ende gelöscht, da im else-Zweig nur Z erhöht wird. Das delete wird immer ausgeführt. Zähle mal die begins und ends und vergleichs mal ;)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 17.08.11 15:22 
so habs hinbekommen denk ich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
while not form1.SerialPortNG2.SendInProgress=false do 
begin
application.ProcessMessages;
end;

So funktionierts jedefalls kann ich das so machen?
Das mit dem z geht schon klar es soll nur jede Zweite Zeile aufgenommen werden.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 17.08.11 16:10 
ICh muss nochmal stören da ich noch ein Problem habe. Diese Routine dient nur zu testzwecken und soll das eigentlich programm mit Daten versorgen.
Aufgerufen wird die Routine aber aus demselben Programm mittels Button.
Sie schickt die daten dann an COM1 und das eigentliche Programm empfängt die Daten auf COM2 und schickt eine Bestätigung zurück.
Hier jetzt mal der code für das senden der Daten:
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure emulate(data:string);
var
Datei: textfile;
command: string;
sl: TStrings;
filedata:tstringlist;
txtdat,T,substring,lb,test : String;
lines,I,z : Integer;

begin
form1.serialportng2.CommPort:='COM1';
form1.serialportng2.Active:=true;
sl.Create;
filedata:= tstringlist.Create;
filedata.LoadFromFile(data);
txtdat:=filedata.Text;
Z:=0;
while length(txtdat)>0 do
  begin
  I:=pos('1A1A',txtdat);  //Trennzeichen
  substring:=copy(txtdat,1,I-1);
  if Z=1 then
    begin
      delete(substring,1,2);
      showmessage(substring); // WENN DAS DRIN STEHT FUNTKIONIERT ALLES
      form1.serialportng2.SendString(HexToStr(substring));
      while not form1.SerialPortNG2.SendInProgress=false do
      begin
      application.ProcessMessages;
      end;

      while not form1.SerialPortNG2.NextClusterSize >0 do
      begin
      application.ProcessMessages;
      end;
      test:=form1.SerialPortNG2.ReadNextClusterAsString;
      form1.ListBox1.Items.Add(substring);
      Z:=0;
    end
  else
  z:=z+1;
  delete(txtdat,1,(I-1));
  delete(txtdat,1,4);      //Hier wird nur das Trennzeichen gelöscht

end;
end;

Das Problem ist, dass das Programm zu schnell sendet und mein eigentliches Programmnicht hinterher kommt das zu empfangen und zu verarbeiten. Wenn ich den Showmessagedialog drinne habe und immer erst bestätigen muss funktioniert alles. Wenn ich ihn rausnehme verschluckt sich das Programm.
Wie kann ich denn mein Sendeprogramm dazu bewegen immer erst zu warten bis das Hauptprogramm geantwortet hat?
ich hab das ja schon versucht über das while not form1.SerialPortNG2.NextClusterSize >0 do ... aber dsa bringt wohl nix.

GRüße Christian