Mam dwa przyrządy pomiarowe (halotronomierze Asonik SMS102). Po każdorazowym wykonaniu pomiaru przyrząd wysyła wartość do komputera przez RS232. Średnio co około sekundę (trochę losowo). Robie program w labview do sczytywania wartości i prezentacji danych na wykresie x-y.
Problem mam z komunikacją. Zrobiłem program tak:
No i sypie mi się co chwile następujący komunikat:
Czy istnieje jakiś bloczek oczekiwania na kompletną paczę danych? Walczę s tym od 4 godzin i nie wiem co robie źle...
Jeśli już, to raczej za wolno czytasz i następuje przepełnienie bufora portu. Chodzi o to, że bez żadnej kontroli przepływu urządzenie śle do Ciebie dane bez przerwy, a jeśli nie zdążysz ich przeczytać, to następuje przepełnienie systemowego bufora. Rozwiązaniem, jeśli nie możesz użyć flow control, jest czytanie danych częściej (najlepsze rozwiązanie to wyrzucenie komunikacji do oddzielnej pętli, która będzie robić tylko to) albo w większych paczkach (na pewno chcesz czytać tylko po 10 bajtów na raz? czy te przyrządy nie przysyłają więcej?).
Rzuć okiem też na to: Why Do I Get Buffer Overflows with My Serial Port When Using VISA with Flow Control?.
W celach diagnostycznych możesz podejrzeć, ile masz danych na porcie za pomocą property node.
Program sprawdza stan (ilość danych) w buforach odczytu. Jeśli ilość danych w jednym jest inna niż w drugim, to czyści bufor. To samo ma się dziać, gdy dane nie będą nieświeże (gdy w buforze jest więcej danych niż po 2 paczki na każdy tor).
Czy będzie to działać poprawnie, czy o czymś jeszcze zapomniałem??
Może ja tylko dodam spostrzeżenie od siebie. Zakładasz, że oba urządzenia wysyłają dokładnie taką samą ilość danych i obsługujesz oba w tej samej pętli. Jednak nawet jeśli urządzenia są tego samego typu, to być może nie działają tak deterministycznie jak zakładasz i po jakimś czasie ten szybszy przepełni bufor. To też można zaobserwować według wskazówek od PiDi.
Czyszczenie bufora gdy liczba danych nie jest taka sama w buforach jest pewnym obejściem, ale lepiej byłoby umieścić obsługę obu urządzeń w osobnych pętlach. Tutaj aż samo nasuwa się stworzenie subVI i wykorzystanie go wielokrotnie z innymi portami COM.