repeat until w RS232

0

Chcę wysłać X ramek danych do urządzenia.
Testując aplikację mam problem bo nie działa poprawnie - nie weim dlaczego ponieważ myślę że forma jest w dobrym stanie.

mam coś takiego:

Ramka:=1;

repeat
  repeat
     WriteCOM (BufforOUT);
     repeat
     until ReadCOM(BufforIN) = True;
  until  BufforIN = 100;   //potwierdzenie od urządzenia że odebrał poprawnie ramkę danych 
  Inc (Ramka);
until Ramka = 5000;
0

mam problem bo nie działa poprawnie

Kolejny...
Jaki problem ?
Podaj więcej kodu.
Linijka błędu.

0

Przyjmiemy takie wartości:

  • urządzenie odbierające dane powierdza po otrzymaniu danych bajtem 100 (to działa poprawnie nie wiesza się)

Problem mam z tym kawałkiem kodu, ponieważ aplikacja wysyłając ramki (mam podgląd przez StaticText) i im większa liczba tym bardziej spowalnia transmisja aż uzyskam np warość 4892 i stoi w miejsciu np przez 3-4min i kolejna ramka i znowu na zmiane wartości Ramki widze po długim czasie

Ogólnie mam odczucie jak by coś się w tym kodzie "zapychało"

Ramka:=1;

repeat
  repeat
     WriteCOM (BufforOUT);
     repeat
     until ReadCOM(BufforIN) = True;
  until  BufforIN = 100;   //potwierdzenie od urządzenia że odebrał poprawnie ramkę danych
 
  Inc (Ramka);
  StaticText1.Caption:=IntToStr (Ramka);  //podgląd ile się wysłało
until Ramka = 5000;
 

Tak wyglądają pełne funkcje Write i Read, może tu coś zapycha aplikacje?

//---------------------------------------------------------
function TForm2.Write_Comm(hCommDev: THANDLE; lpBuffer: PChar;
                           nNumberOfBytesToWrite: DWORD): BOOL;
var
  NumberOfBytesWritten : DWORD;

begin
   WriteFile(hCommDev, Buffer_O, nNumberOfBytesToWrite,
             NumberOfBytesWritten, NIL);
   Result := WaitCommEvent(hCommDev, fdwEvtMask, NIL);
end;
//---------------------------------------------------------
function TForm2.Read_Comm(hCommDev: THANDLE;
                          Buf_Size: DWORD): BOOL;
var
  nNumberOfBytesToRead: DWORD;
begin
   Result := FALSE;
   ClearCommError(hCommDev, Errors, @Stat);
   if (Stat.cbInQue > 0) then
     begin
        if (Stat.cbInQue > Buf_Size) then
          nNumberOfBytesToRead := Buf_Size
          else
             nNumberOfBytesToRead := Stat.cbInQue;
        Result := ReadFile(hCommDev, Buffer_I,
                           nNumberOfBytesToRead,
                           Number_Bytes_Read, NIL);
     end;
end;
0

ja zrobiłem to trochę inaczej. wrzuciłem na formę timera który odbiera z COM co ok 10ms funkcją readfile. w funckji tej znajduje się zmienna readbytes którą sprawdzam ile bajtów odczytałem. jeśli ilość bajtów jest wieksza od 1 to je przetwarzam. przed rozpoczeciem odbierania ustawilem timeout do odczytu na tym pliku na 1ms. przetwarzanie wygladalo mniej wiecej w ten sposob:
char buffer[5000]; // wielkosc rowna wielkosci buffora wejsciowego

DWORD bytesread;
ReadFile(...);
for (int i=0; i<bytesread; i++)
proccessbyte((unsigned char)buffer[i]);

funkcja proccessbyte realizowała automat. w niej tez byly wywolywane rozne funkcje zdarzen typu: ramka doszla poprawnie, niepoprawny znak w ramce itp

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