Skocz do zawartości

Bufor cykliczny - Uart - jak zorganizowac w C


Pomocna odpowiedź

Napisano

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? 

(edytowany)

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

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ń 

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

@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

11 godzin temu, Krawi92 napisał:

Bo jedyna jaka mi się kojarzy to kolejka elektryczna

Nie kolejka elektryczna a kolejka w sklepie - kto pierwszy przyszedł pierwszy zostanie obsłużony. Więcej informacji choćby w wikipedii

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

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