Skocz do zawartości

[Bascom] Obsługa UART


rezolut

Pomocna odpowiedź

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?

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.