W C++ piszę taki mały programik do odczytywania pomiarów z miernika RLC.
Wszystko w WinApi.
Najpierw muszę to urządzenie zainicjować i robię to tak:
strcpy ( Buffer_write, "//\x1B""2\x0A" ); // polecenie ESC2 - przejście urządzenia w tryb REMOTE WriteFile( hPort, Buffer_write, strlen ( Buffer_write ), &ile, 0 );
strcpy ( Buffer_write, "*CLS;ese 255\x0A" ); // Wyzerowanie urządzenia WriteFile ( hPort, Buffer_write, strlen ( Buffer_write ), &ile, 0 );
Następnie chcę sprawdzić czy komunikacja z urządzeniem jest prawidłowa. Robię to pytaniem o identyfikator urządzenia.
strcpy ( Buffer_write, "*idn?\x0A" ); // Niech się urządzenie teraz przedstawi WriteFile ( hPort, Buffer_write, strlen ( Buffer_write ), &ile, 0 );
W następnej części programu mam problem. Nie bardzo wiem, co zrobić aby program odczekał skutecznie tylko tyle czasu ile jest niezbędne, aż w buforze odbiorczym COM pojawią się wszystkie dane wysłane przez urządzenie.
Narazie robię to w bardzo nieelegancki sposób za pomocą opóźnienia
Sleep (1000);
Jest coś skuteczniejszego?
Dalej w programie jest tak. Po odczekaniu 1000ms program przystępuje do odczytania bufora. Najpierw sprawdzam ile jest znaków w buforze COM do odczytania
Result = ClearCommError( hPort, &Errors, &ComStatus ); Buffer_lenght = ComStatus.cbInQue; // Sprawdzenie ile bajtów oczekuje w buforze wejściowym COM
Następnie czyszczę bufor odbiorczy ale nie wiem czy to jest właściwy sposób. Gdy tego nie robiłem to były w nuforze śmieci z poprzednich odczytów
strcpy(Buffer_read, " "); // Wyzerowanie bufora odbiorczego
Ostatecznie odczutuję zawartośc bufora
Result = ReadFile( hPort, Buffer_read, Buffer_lenght, &ile, NULL );
Wynik trafia do okienka na ekranie
SetWindowText( g_hText1, Buffer_read );
Pominąłem polecenia if oraz while które pilnują aby nie próbować czekać w nieskończoność aż coś się pojawi w buforze. W analogiczny sposób odpytuję urządzenie o wyniki konkretnych pomiarów wartości RLC i tam też mam taki sam problem.
Marek