com z win98 na win xp

0

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.

0

Zależy w jaki sposób wysyłasz dane - pokaż jakiś kawałek kodu.

0

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;
\\-------------------------------------------------------------------------------
0

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ć.

0
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 :-(

1 użytkowników online, w tym zalogowanych: 0, gości: 1