Witam,
wygląda to tak:
- otwieram Socket'a i strumień
try{
xsock->Open();
}
catch (...) {
// obsluga
}
TWinSocketStream * polaczenie = new (nothrow) TWinSocketStream(xsock->Socket, 3000);
jest ok.
Wysyłam komendę startu do urządzenia. Odpowiada dwoma bajtami: 1,1 ok, 2,2 błąd. Jedziemy dalej.
Wysyłam dane do urządzenia (ok 12 kB). I urządzenie po odbiorze ustalonej ilości danych odpowiada mi pięcioma jedynkami jeśli ok, lub 2 i CRC32 (w sumie 5[B]) jeśli błąd.
I pojawia się problem: czasem ostatni Bajt (piąty) nie przychodzi. Przychodzą np. cztery jedynki.
Kawałek kodu wygląda tak:
unsigned char odpowiedz [6] = {0, 0, 0, 0, 0, 0};
/*if(!xpolaczenie->WaitForData(1500)){ // nic nie zmienia
return false;
} */
try{xpolaczenie->TStream::ReadBuffer(odpowiedz, xiOdpIle);}
catch(...){
return false;
}
//Timeout = xpolaczenie->Read(odpowiedz, xiOdpIle); // funkcja Read
//if (Timeout == 0) {
// return false;
//}
if (odpowiedz[0] != 1 || odpowiedz[1] != 1 || odpowiedz[2] != 1
|| odpowiedz[3] != 1 || odpowiedz[4] != 1) {
if(odpowiedz[0] == 2){
// wyswietlenie CRC32
}else{
// sprawdzam sobie co dostalem i tu wlasnie widac ze czasem ostatni Bajt nie przychodzi (=0)
AnsiString errm = "1: " + IntToStr((int)odpowiedz[0]) + ". 2: " + IntToStr((int)odpowiedz[1]) +
". 3: " + IntToStr((int)odpowiedz[2]) + ". 4: " + IntToStr((int)odpowiedz[3]) + ". 5: " + IntToStr((int)odpowiedz[4]);
ShowMessage(errm);
}
return false;
}else{
// jest ok
}
Jak widać w kodzie: najpierw wysyłałem funkcją - Read, później ReadBuffer i to samo. ReadBuffer gdy nie dostanie 5 bajtów to sobie rzuca wyjątkiem.
Urządzenie wysyła 5 bajtów na 100% - badane na programie Terminal.
Parametry połączenia: 230400 bps, 8N1 przez transceiver LAN -> UART.
Jakieś pomysły?