Witam.
Mam taki problem napisałem program do komunikacji przez porty com pod win98 ale ten system już zanika i próbowałem przenieść go na win xp. Okazało się że interfejs działa ale transmisja strasznie muli i z przesyłanych danych powstają śmieci. Czy można jakoś w prosty sposób temu zaradzić? Co jest tego przyczyną? Proszę o pomoc.
Zależy w jaki sposób wysyłasz dane - pokaż jakiś kawałek kodu.
Witam. Dołączam kawek kodu. Coś doczytałem i wydaje mi się że to przez wątek tak muli. Proszę o potwierdzenie lub zaprzeczenie. Jeśli tak to jak można to obejść bez potrzeby pisania wszystkiego od nowa?
//----------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
OS:TOsVersionInfo;
Comp : String;
Buff : DWORD;
hM : HDC;
J: Integer;
port_com:pchar;
Reg : TRegistry;
RealSerialNumber : string;
dl_ser:integer;
begin
.
.
.
hcommport:=createfile(port_com,generic_read+generic_write,0,
nil,open_existing,file_attribute_normal,0);
ctmocommport.readtotaltimeoutmultiplier:=1;
setcommtimeouts(hcommport,ctmocommport);
dcbcommport.dcblength:=sizeof(dcb);
getcommstate(hcommport,dcbcommport);
dcbcommport.BaudRate:=cbr_9600;
setcommstate(hcommport,dcbcommport);
.
.
.
end.
//-------------------------------------------------------------------------------
procedure W_Watek.Execute;
var
i_kod:integer;
begin
FreeOnTerminate:=True;
repeat
if kod<>'' then
begin
for i_kod:=0 to length(kod) do
begin
w_c:=kod[i_kod];
writefile(hcommport,w_c,1,w_dwcount,nil);
repeat until w_dwcount=1;
end;
W_c:=#10;
writefile(hcommport,W_c,1,w_dwcount,nil);
repeat until w_dwcount=1;
W_c:=#13;
writefile(hcommport,W_c,1,w_dwcount,nil);
repeat until w_dwcount=1;
kod:='';
end;
//------------------------------------------
if koniec_watka=1 then a:=2;
until a>1;
end;
\\-------------------------------------------------------------------------------
Nie rozumiem tej linijki:
repeat until w_dwcount=1; //(powtarza się pare razy).
Czy wysyłając dane w ten sposób dochodzisz w ogóle do szczęśliwego końca czy w pewnym momencie program po prostu się zawiesza i game over?
Edytuj swój poprzedni post i przed kodem daj <delphi> a na koniec </delphi> (bez podkreśleń oczywiście) to będzie to trochę łatwiej czytać.
repeat until w_dwcount=1;
To działa poprawnie nie wiesza się. Z tego co pamiętam to zmienna ta przyjmuje wartość 1 gdy wysłanie zostanie zakończone. Czeka na zakończenie operacji. Gdy tej pętli nie było to wysyłane dane czasem nie dochodziły w całości do odbiorcy. A co z tym "muleniem" i utratą wysyłanych danych? Coś w tym kodzie może być nie tak (pomijając już ww niejasność)? Czy piorytet wątka ma znaczenie?
constructor W_Watek.Creater(Count: Integer);
begin
inherited Create(false); // wywołanie wątku
OnTerminate:=MyTerminate2;
Priority := tpLower;
end;
Do odbioru danych jest taki kod:
constructor Online_Watek.Create(Counter: Integer);
begin
inherited Create(false); // wywołanie wątku
OnTerminate:=MyTerminate;
Priority := tpNormal;
end;
procedure Online_Watek.Execute;
var
buf_echo:string;
begin
FreeOnTerminate:=True;
a1:=0;
repeat
readfile(hcommport,c,1,dwcount,nil);
if (dwcount=1) then
begin
status:=300; // do pobierania programu
status_m:=60; // do info
if c<>#13 then
begin
IF c<>#10 then
begin
buf:=buf+c;
end;
end
else
begin
if okno=0 then Form1.RichEdit3.Lines.add(buf);// do online
if okno=1 then writeln(Outfile, buf);// do pliku
if okno=2 then Form1.Memo1.Lines.add(buf);// info
if okno=3 then Form6.RichEdit1.Lines.add(buf);// raport
if okno=8 then buf_TEST:=buf;// do test wysylania
if okno=9 then buf_echo:=buf;// do nikad
buf:='';
end;
end;
if status>0 then dec(status);
if status_m>0 then dec(status_m);
if koniec_watka=1 then a1:=2;
until a1>1;
end;
Pod win98 działa bez problemu nie wiesza się. Obydwa wątki działają w tle i mogę działać na kompie w innych aplikacjach. A xp ciężko to łyka :-(