Witam
Mam problem z komunikacją po rs232.
Nie potrafię zmusić programu aby wysyłał i odbierał dane z rs.
Program ma za zadanie wysłać zapytanie do urządzenia, pobrać 1 ramkę, wyświetlić wynik i przejść do następnego zapytania.
Generalnie są 3 zapytania.
Zapytanie 1 - status
Zapytanie 2 - waga
Zapytanie 3 - waga_tymczasowa
Zrobiłem już jakąś transmisję ale zdarza się że dane ze statusu trafiają do wagi, wynik wagi jest zafałszowany.
Wydaje mi się że problem polega na buforze. Mam wrażenie że gdy przechodzę do zapytania 2 to przychodzi ramka ze statusu.
Funkcje potrzebne do RS232
int __fastcall Read_Comm(HANDLE hComm,
LPDWORD lpNumberOfBytesRead, DWORD Buf_Size)
{
DWORD nNumberOfBytesToRead;
ClearCommError(hComm, &Errors ,&Stat);
if (Stat.cbInQue > 0)
{
if (Stat.cbInQue > Buf_Size)
nNumberOfBytesToRead = Buf_Size;
else
nNumberOfBytesToRead = Stat.cbInQue;
ReadFile(hComm, &Buffer_I[0], nNumberOfBytesToRead,
lpNumberOfBytesRead, NULL);
}
else
*lpNumberOfBytesRead = 0;
return TRUE;
}
Zapytanie 1 - Status
void sprawdzStatus()
{
FlushFileBuffers(hComm);
WriteFile(hComm, status, sizeof status, &RS_ile, 0);
Read_Comm(hComm, &Number_Bytes_Read, sizeof(Buffer_I));
Sleep(100);
if (Buffer_I[0] == 02 && Buffer_I[1] == 03 && Buffer_I[2] == 04 && Buffer_I[3] == 00 && Buffer_I[4] == 00 && Buffer_I[5] == 00 && Buffer_I[6] == 03) {
status_wagi = true;
}
if (Buffer_I[0] == 02 && Buffer_I[1] == 03 && Buffer_I[2] == 04 && Buffer_I[3] == 00 && Buffer_I[4] == 00 && Buffer_I[5] == 00 && Buffer_I[6] == 01) {
status_wagi = false;
}
blokada_pomiaru = false;
}
Zapytanie 2 - Waga
void licznikGlowny()
{
FlushFileBuffers(hComm);
WriteFile(hComm, wagaGlowna, sizeof wagaGlowna, &RS_ile, 0);
Read_Comm(hComm, &Number_Bytes_Read, sizeof(Buffer_I));
Sleep(100);
wynik2=(Buffer_I[4]*65536)+(Buffer_I[5]*256)+Buffer_I[6];
}
I teraz w Timer co określony czas wywołuję funkcję.
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
zmienna++;
if(zmienna >= 5) zmienna = 0;
if (zmienna == 2) {
licznikGlowny();
}
if (zmienna == 4) {
sprawdzStatus();
}
}