• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przesyłanie float po uart
#6
Na razie nie robiłem transmisji w ramkach po uart, wystarcza mi przesył tekstem. Ale tak rozważając teoretycznie zauważam kilka potencjalnych zagrożeń.
Nawet taki AVR może wykonywać instrukcję w 50ns (20MHz, dla łatwiejszego liczenia), operacje na bajtach, 8 bitach, w 8-bitowcu są szybkie i trwają jedną- kilka instrukcji. Nie można zakładać, że w buforze czeka cała gotowa ramka, bo jak się zdarzy, że wejdziesz tam tak jak się powinno to robić, czyli że pętla "jałowa" trwa kilka us, to będzie tam 1bajt, może dwa. Przesłanie bajtu z baud 9600 trwa ~1ms, 115200 z 50us. Wolno i szybko zarazem, nawet dla 115k jest to 1000 instrukcji uC. Bufor sprzętowy jest na max 2 bajty. Zakładając, że jest już "available cośtam" odczytujesz 1-2 bajty i masz śmieci, to nawet nie jest jedna liczba float. Zakładając że masz czekać na 10 bajtów może się okazać, że jakieś inne przerwanie lub inna biblioteka zakłóciła przerwania UART na tyle us, że bajt przepadł. Teraz do kolejnego resetu zawsze będziesz odczytywał 9bajtów z jednej ramki i 1 z kolejnej. No i siedział w jakiejś pętli while nie napełni bufora przez 0.5-10ms (10ms to już 200 tys. instrukcji)?
W nadajniku UART jest oczywiście podobna sytuacja, Ty sobie robisz write(dane,10bajtów) i lecisz dalej, ale to nie koniec wysyłania, dalej biblioteka już w tle ustawia sobie kolejkę, wrzuca bajt do nadajnika i czeka na przerwanie nadajnika dopóki ma w buforze dane do wysłania, przerwanie-wysyła, przerwanie-wysyła. W tym czasie może wyjść inne przerwanie i nadawanie kolejnych bajtów jest zawieszone. Przerwanie inne się kończy, wrzucany jest kolejny bajt i tak aż wyśle te 10.
Z timeout wiesz, że jak odebrałeś 9 bajtów i jest pauza powyżej 3-10ms (dla 9600), a dane wysyłasz co 50ms, to na pewno powinieneś zacząć od nowa. Jeśli sterujesz jakimś pojazdem/latawcem to też brak danych, nowej ramki oznacza utratę komunikacji, pojazd należy zatrzymać, kopterka delikatnie zawiesić i po paru s, jeśli sterownik nie dobiegnie w zasięg samemu powoli wylądować.
Nie można też tego robić na żywioł w nadajniku, że bez delay. Może być bez delay, ale co jakiś czas. Jak widać można sobie nawet 20 razy zrobić write by wysłać kolejne 10 bajtów zanim w ogóle pierwsza ramka zostanie nadana w całości. Po kilku obiegach pętli bufor nadawczy biblioteki UART zostanie przejechany zanim tyknie sekunda.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
Przesyłanie float po uart - przez omnixcrs - 08-10-2019, 20:16
RE: Przesyłanie float po uart - przez Jarewa0606 - 08-10-2019, 21:36
RE: Przesyłanie float po uart - przez omnixcrs - 09-10-2019, 22:04
RE: Przesyłanie float po uart - przez kaczakat - 10-10-2019, 01:09
RE: Przesyłanie float po uart - przez Jarewa0606 - 10-10-2019, 15:36
RE: Przesyłanie float po uart - przez kaczakat - 10-10-2019, 18:56
RE: Przesyłanie float po uart - przez Jarewa0606 - 10-10-2019, 20:03
RE: Przesyłanie float po uart - przez omnixcrs - 11-10-2019, 21:40
RE: Przesyłanie float po uart - przez kaczakat - 12-10-2019, 03:51
RE: Przesyłanie float po uart - przez Agregacik - 12-10-2019, 12:29

Skocz do:


Przeglądający: 1 gości