Skocz do zawartości

Bufor cykliczny - Uart - jak zorganizowac w C


Krawi92

Pomocna odpowiedź

Witam, chciałbym rozpocząć mała dyskusje, jak w najprostrzej postaci zorganizować sobie nadawanie i odbiór np z uart wykorzystując bufor cykliczny. W bardzo podstawowy sposób mechanizm zapętlenia takiego mechanizmu jest mi znany. Trochę problem mam obsłużyć to wszystko w przerwaniach i zorganizować podstawowy odbiór znaków ascii z terminala. Miałby ktoś krok po kroku wytłumaczyć jak podchodzić do czegoś takiego w języku C? 

Link do komentarza
Share on other sites

Czy transmisja będzie w 1 kierunku? Po prostu przy każdym przerwaniu zapisujesz do buffora ten bajt co dostajesz, a po odebraniu całości (nie wiem ile danych potrzebujesz na przesłanie) jedziesz już w pętli głównej z "obróbką"

edit. może tak niezbyt jasno napisałem:
Przykładowo ramka 8 bitów - każde przerwanie i mamy 8 bitów gotowych do zapisu - w obsłudze przerwania wrzucamy go do buffora i na tym kończymy właściwie przerwanie (tutaj możemy też zaznaczyć, że np. oczekujemy 5 znaków, czyli po 5 znaku ustawimy sobie jakąś flagę, że dane są gotowe do obróbki - dalej przerwanie będzie się pojawiać i kolejne dane dalej w bufforze sobie mogą być zapisywane i nic nie powinniśmy tracić)
w pętli głownej możemy sobie zrobić funkcję, która te dane będzie obrabiała ale tylko wtedy, gdy są one gotowe do obróbki, bo po co obrabiać część danych co odbiór znaku - nie ma co tracić czasu mcu na takie pierdoletki, chyba, że niektóre dane są krytyczne (jak np. błąd jakiegoś podzespołu czy coś, ale to zależne od aplikacji)

 

 

Edytowano przez BananWszyscy
Link do komentarza
Share on other sites

Ogólnie jestem zainteresowany podejściem do tworzenia takiego mechanizmu. Uart to tylko przykład ponieważ mam taki w książce. Bufor opisany jakimś tam sposobem który wykorzystuje uart. Akurat że mam problem z odbiorem to troche odrębny temat. Na dzień dzisiejszy chodzi mi o sam mechanizm, a że to forum i duża społeczność to i wiele rozwiązań 

Link do komentarza
Share on other sites

Bufor kołowy nadaje się nie tylko dla transmisji UART, równie dobrze można go zastosować dla I2C czy np SPI i ja bym w tym kierunku poszedł, należałoby to tak napisać aby sama jego obsługa nie była zależna od interfejsu który ładuje dane do niego. 

  • Pomogłeś! 1
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

5 godzin temu, slon napisał:

@Krawi92 na samych przerwaniach można całkiem sporo zdziałać. W zasadzie  main może nic nie robić.

A to już zależy jakie kto ma podejście. Niektórzy cały program mają napisany w przerwaniach, a niektórzy znaczna część w pętli głównej. Fanatycy będą bronić swojego podejścia wyzywając tych którzy robią inaczej 😄

Link do komentarza
Share on other sites

https://embeddedartistry.com/blog/2017/05/17/creating-a-circular-buffer-in-c-and-c/

Jak zwykle polecam książkę pana Francuza, jak dalej nie będzie jasne, spróbuję coś skleić w domu

 

EDIT. po co kleić... https://forbot.pl/blog/port-szeregowy-interfejs-usart-2-id1218 🙂

Edytowano przez BananWszyscy
Link do komentarza
Share on other sites

@Krawi92 mogę wkleić obsługę przycisku, timera, rtc, uart (odbieranie) na przerwaniach dla stm8. Całość mam w interrupt_vector.c . Ale to dopiero około 19:30. Nie jest to jakoś pięknie napisane (rejestry , tablice) ale działa

Link do komentarza
Share on other sites

17 minut temu, Krawi92 napisał:

akurat zasada FIFO jest mi znana

No i na tej zasadzie obsługujesz przychodzące dane. A ringbuffer może tu służyć jako implementacja kolejki o stałym maksymalnym rozmiarze.

  • Pomogłeś! 1
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.