Cześć.
Pracuję nad takim małym systemem komunikacji pomiędzy kilkoma urządzeniami pomiarowymi a PC. Pomiędzy urządzeniami a PC jest coś w rodzaju hub'a, co sam zaprojektowałem i wykonałem - ogólny schemat jest taki:
Wspomniane przeze mnie urządzenia pomiarowe nie są pierwszej nowości, więc każde z nich wyposażyłem w uP (XMega128A3U), który odpytuje je z mierzonych parametrów parametrów (wykorzystałem obsługę UART z przerwaniami). Wszystko spiąłem razem magistralą RS485 celem podpięcia do komputera - przez jakąkolwiek przejściówkę do USB.
Każde z tych urządzeń (obecnie są 3) jest trochę inne to i programy do nich są inne. Ta część działa jednak bez zarzutu - każde urządzenie jest odpytywane przez uP (zgodnie z algorytmem dla każdego z urządzeń) z odpowiednich danych i te dane są przysyłane do uP. Nic się nie tnie, transmisja jest ciągła nawet po wielu godzinach. Także z samą częścią czysto elektryczną na PCB jak i napisaniem softu do odpytywania urządzeń nie miałem kłopotu.
Kłopot pojawił się jak zacząłem pisać oprogramowanie na PC do wizualizacji i interpretacji odebranych danych. Mój zamysł był prosty - wysłać komendę do uP z żądaniem wysłania danych i w ramach odpowiedzi - do PC leci paczka z danymi z urządzenia. W tym celu zastosowałem ramkę protokołu MODBUS.
Na czym polega kłopot? Mianowicie: transmisja danych pomiędzy PC a uP z niewiadomych dla mnie przyczyn co jakiś czas się zacina. NIE WIERZĘ, że nie da się tego zrobić w sposób wysoko niezawodny (szczególnie, że problem nie jest skomplikowany) i jestem przekonany, że ja robię gdzieś błąd. Tym bardziej, że wymiana danych pomiędzy uP, a urządzeniami działa wysoko niezawodnie, co wydawało mi się trudniejsze. Oto jak zaplanowałem algorytm do komunikacji pomiędzy PC a uP:
1. (PC) Wyślij ramkę z rozkazem z do odpowiedniego uP.
2. (uP) Zeruj rejestr CNT timera za każdym odebranym bajtem.
3. (uP) Po odebraniu ostatniego bajtu - czyli po przerwaniu od przepełnienia timer'a, który ustawiłem na 50ms - analizuj odebraną ramkę.
4. (uP) Jeśli ramka jest poprawna to postaw flagę zezwalającą na wysyłkę danych do PC.
5. (PC) Zinterpretuj dane z uP.
Kody są obszerne więc przedstawiam fragmenty odpowiedzialne za odbiór danych z PC i interpretację odebranej ramki.
Fragment 1. - odbiór bajtu z PC:
Fragment 2. - obsługa przerwania od przepełnienia:
Fragment 3. - analiza odebranej ramki z PC, wykonywane w pętli głównej programu:
No i dalej, jeśli zostanie postawiona flaga sendResponse = true; to w następnej instrukcji warunkowej mam kapsułkowanie odebranych danych i wysyłkę do PC.
Pytam Was Kolegów, bo jesteście mądrzejsi i bardziej doświadczeni - czy widzicie gdzieś błąd w algorytmie? A może w ogóle inaczej byście zorganizowali komunikację?
Proszę uprzejmie o wskazówki i pozdrawiam
Edit1 - dodam jeszcze taką obserwację - kiedy odpytywałem z PC tylko jeden uP, a nie 3 po kolei, to transmisja zacinała się o wiele rzadziej
Edit2 - dodam jeszcze ogólny szkielet programu:
Pracuję nad takim małym systemem komunikacji pomiędzy kilkoma urządzeniami pomiarowymi a PC. Pomiędzy urządzeniami a PC jest coś w rodzaju hub'a, co sam zaprojektowałem i wykonałem - ogólny schemat jest taki:
Wspomniane przeze mnie urządzenia pomiarowe nie są pierwszej nowości, więc każde z nich wyposażyłem w uP (XMega128A3U), który odpytuje je z mierzonych parametrów parametrów (wykorzystałem obsługę UART z przerwaniami). Wszystko spiąłem razem magistralą RS485 celem podpięcia do komputera - przez jakąkolwiek przejściówkę do USB.
Każde z tych urządzeń (obecnie są 3) jest trochę inne to i programy do nich są inne. Ta część działa jednak bez zarzutu - każde urządzenie jest odpytywane przez uP (zgodnie z algorytmem dla każdego z urządzeń) z odpowiednich danych i te dane są przysyłane do uP. Nic się nie tnie, transmisja jest ciągła nawet po wielu godzinach. Także z samą częścią czysto elektryczną na PCB jak i napisaniem softu do odpytywania urządzeń nie miałem kłopotu.
Kłopot pojawił się jak zacząłem pisać oprogramowanie na PC do wizualizacji i interpretacji odebranych danych. Mój zamysł był prosty - wysłać komendę do uP z żądaniem wysłania danych i w ramach odpowiedzi - do PC leci paczka z danymi z urządzenia. W tym celu zastosowałem ramkę protokołu MODBUS.
Na czym polega kłopot? Mianowicie: transmisja danych pomiędzy PC a uP z niewiadomych dla mnie przyczyn co jakiś czas się zacina. NIE WIERZĘ, że nie da się tego zrobić w sposób wysoko niezawodny (szczególnie, że problem nie jest skomplikowany) i jestem przekonany, że ja robię gdzieś błąd. Tym bardziej, że wymiana danych pomiędzy uP, a urządzeniami działa wysoko niezawodnie, co wydawało mi się trudniejsze. Oto jak zaplanowałem algorytm do komunikacji pomiędzy PC a uP:
1. (PC) Wyślij ramkę z rozkazem z do odpowiedniego uP.
2. (uP) Zeruj rejestr CNT timera za każdym odebranym bajtem.
3. (uP) Po odebraniu ostatniego bajtu - czyli po przerwaniu od przepełnienia timer'a, który ustawiłem na 50ms - analizuj odebraną ramkę.
4. (uP) Jeśli ramka jest poprawna to postaw flagę zezwalającą na wysyłkę danych do PC.
5. (PC) Zinterpretuj dane z uP.
Kody są obszerne więc przedstawiam fragmenty odpowiedzialne za odbiór danych z PC i interpretację odebranej ramki.
Fragment 1. - odbiór bajtu z PC:
Kod: C / C++
Fragment 2. - obsługa przerwania od przepełnienia:
Kod: C / C++
Fragment 3. - analiza odebranej ramki z PC, wykonywane w pętli głównej programu:
Kod: C / C++
No i dalej, jeśli zostanie postawiona flaga sendResponse = true; to w następnej instrukcji warunkowej mam kapsułkowanie odebranych danych i wysyłkę do PC.
Pytam Was Kolegów, bo jesteście mądrzejsi i bardziej doświadczeni - czy widzicie gdzieś błąd w algorytmie? A może w ogóle inaczej byście zorganizowali komunikację?
Proszę uprzejmie o wskazówki i pozdrawiam
Edit1 - dodam jeszcze taką obserwację - kiedy odpytywałem z PC tylko jeden uP, a nie 3 po kolei, to transmisja zacinała się o wiele rzadziej
Edit2 - dodam jeszcze ogólny szkielet programu:
Kod: C / C++
