Skocz do zawartości

[Bascom] Obsługa UART


Pomocna odpowiedź

Napisano

Czy ktoś na forum opanował obsługę UART (USART) i odbiór danych o nieznanej długości?

Dotąd w swojej dłubance wykorzystywałem zawsze schemat:

'- zmienne uart ----------------------------------------------------------------
Dim I As Byte
Dim Buf(8) As Byte
'Bufor odbioru danych z rejestru UART
Dim Index As Byte
'numer kolejnego bajtu odebranego przez uart
Dim Odebrano As Boolean
'flaga ustawiana gdy odebrano przez uart 5 bajtów i zapisano do bufora Bufor() 
'- konfiguracja USART ----------------------------------------------------------
On Urxc Odbierz
'Ubrr = 207                                                  '4800 bps przy U2X=0
'Ubrr = 51                                                   '19200 bps przy U2X=0
'Usr = &B00100000
Ucr = &B10011000
'Ucsrc = &B10000110
Enable Urxc
Enable Interrupts

...

Odbierz: 
  Buf(index) = Udr
  Incr Index                                               'zwiększamy licznik o jeden
  If Index = 6 Then
     Index = 1
     Odebrano = 1
  End If
Return

przy czym zawsze wiedziałem ile bajtów mam odebrać (tu akurat 5).

Teraz mam odebrać dane o nieznanej długości, więc ustawienie flagi po odebraniu określonej, znanej liczbie danych odpada.

Chciałbym to zrobić na mniej więcej na wyżej opisanej zasadzie, tzn. na przerwaniu i odbiorze do bufora wszystkich bajtów. Na szybko przychodzi mi sprawdzanie timeoutu między kolejnymi bajtami w celu wykrycia końca transmisji, ale może ktoś już ma lepsze działające rozwiązanie?

Faktycznie może to być rozwiązaniem pod warunkiem, że urządzenie odpowiada zawsze stałą końcówką i że końcówka ta nie wystąpi przypadkiem w "treści" pakietu.

Muszę to obadać.

Jeżeli masz kontrolę nad nadawcą, to to ma sens. Może coś w stylu: każdy bajt danych rozpoczynaj 0, natomiast ostatni bajt stopu puść same jedynki, lub coś podobnego.

Nie mam kontroli nad nadawcą. Co będę ściemniał - chodzi o komórkę, C35 i obsługę sms. Zrobiłem projekt z komunikacją jednostronną, ale zachciało mi się czegoś więcej.

Nie sprawdziłem przed montażem jak komórka gada (tzn. odpowiada) a teraz po ptokach bo została przykręcona i zalana we wtyczce silkonem.

Po próbach i testach wiem już jednak, że kończy ona wiadomość zawsze jednakowym ciagiem, więc łatwo to rozpoznać. Układ działa w obie strony i czyta już zmienne łańcuchy.

Natomiast patent z bajtami identyfikacyjnymi na początku i końcu pakietów stosuję przy obsłudze modułów radiowych dla minimalizowania wpływu śmieci z otoczenia.

Można np: tak:

Niech wartości bajtów od 0 do 254 będą interpretowane zwyczajnie, natomiast wartość bajtu 255 będzie znacznikiem, i jeśli kolejne dwa odczytane bajty mają wartość 255, wtedy interpretujemy te daw bajty jako jeden o wartości 255.

Każdej zaczynającej się od 255 parze bajtów można przypisać jakąś funkcję,

np: 255 0 - początek ramki danych, 255 1 - koniec ramki danych

Proste i oszczędne rozwiązanie.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...