Mam taki kłopot; korzystam w programie z transmisji z PC do mikrokontrolera vis RS232 (Atmega 2561, sprzętowy uart, 115200 b).
W tym celu używam funkcji SERIALIN z opcją BYTEMATCH (znak CR).
Bufor o długości 200 znaków.
Dane odbierane z PC obsługiwane są standardowo ;
Jak widać, odebrany string ląduje w zmiennej Bufor2.
I niby wszystko jest OK - niestety, nie zawsze. Co któraś odbierana transmisja jest "przyciana". Tzn, w buforze jest tylko część odebranego stringu.
Podejrzewam, że przyczyną może być to, że w czasie działania ogólnego programu wykorzystywane są timery. I być może przerwania z tych timerów wpływają na poprawny odbiór danych ?
Jeżeli tak - to jak temu zapobiec ?
Nie można wyłączać timerów, bo dane z PC przychodzą losowo, czyli nie wiadomo kiedy. Ot - w trakcie działania całości.
Przerwania z timerów są generowane z częstotliwością 1Hz (timer3) i 1000Hz (timer1).
Niestety priorytety przerwań są przypisane na sztywno i przerwanie UART jest poniżej przerwań timerów. Próbowałem na początku procedury Serial1charmatch wyłączać przerwania (disable interrupts) i włączać je na wyjściu, ale nie pomaga.
Spowolnienie transmisji np. do 9600b też nie pomaga.
A może nie mam racji i przyczyna może być inna ?
(samo połączenie jest na pewno OK, bo ten sam port jest wykorzystywany przez bootloader, i przesyłanie nawet dużego programu działa poprawnie).
W tym celu używam funkcji SERIALIN z opcją BYTEMATCH (znak CR).
Bufor o długości 200 znaków.
Kod: VB.net
Dane odbierane z PC obsługiwane są standardowo ;
Kod: VB.net
Jak widać, odebrany string ląduje w zmiennej Bufor2.
I niby wszystko jest OK - niestety, nie zawsze. Co któraś odbierana transmisja jest "przyciana". Tzn, w buforze jest tylko część odebranego stringu.
Podejrzewam, że przyczyną może być to, że w czasie działania ogólnego programu wykorzystywane są timery. I być może przerwania z tych timerów wpływają na poprawny odbiór danych ?
Jeżeli tak - to jak temu zapobiec ?
Nie można wyłączać timerów, bo dane z PC przychodzą losowo, czyli nie wiadomo kiedy. Ot - w trakcie działania całości.
Przerwania z timerów są generowane z częstotliwością 1Hz (timer3) i 1000Hz (timer1).
Niestety priorytety przerwań są przypisane na sztywno i przerwanie UART jest poniżej przerwań timerów. Próbowałem na początku procedury Serial1charmatch wyłączać przerwania (disable interrupts) i włączać je na wyjściu, ale nie pomaga.
Spowolnienie transmisji np. do 9600b też nie pomaga.
A może nie mam racji i przyczyna może być inna ?
(samo połączenie jest na pewno OK, bo ten sam port jest wykorzystywany przez bootloader, i przesyłanie nawet dużego programu działa poprawnie).
