Skocz do zawartości

Kombinowanie z przerwaniami UART


Torkness

Pomocna odpowiedź

Witajcie,
mam do skomunikowania z atmegą 328p moduł GSM (Fibocom G510). Problem polega na "nieregularnych" odpowiedziach modułu. Nie mam pomysłu jak określać w którym momencie ustawiać flagę, informującą że rozkaz jest gotowy do przesłania. Opierając się na "bluebooku" kombinowałem ze zliczaniem LF i/lub CR ale czasem w komendzie zwrotnej dostaję 2, 3 a czasem nawet 4 razu te znaki. Długość komend/ilość odebranych znaków też nie wchodzi w grę bo ta waha się między 8 a 75. Zastanawiam się nad jakąś formą czasowego wyzwalania flagi (np 400ms od pierwszego znaku). Nie zależy mi na bardzo szybkiej komunikacji. Komendy będą wysyłane "w godzinach szczytu" raz na 1s. Mógłby ktoś podpowiedzieć w jaki sposób wrzucić zliczanie czasowe do przerwania (pamiętam że w blubooku było WYRAŹNIE napisane żeby nie wrzucać do przerwań _delay'ów) lub może jest jakaś inna metoda?

Link do komentarza
Share on other sites

Najlepiej by było od razu przetwarzać w pętli głównej - ładujesz z bufora kołowego do pośredniego przychodzące dane aż trafisz na jakiś terminator np. i przetwarzasz dane.

Dzięki temu co zostało wyplute w poprzedniej paczce (paczkach) możesz określić czy coś jeszcze przyjdzie. (Rozwiązanie dosyć podobne do tego)

To tyle jeśli chodzi o moje wróżenie. 🙂

Najlepiej jakbyś dał przykładowe dane jakie ten modem może wypluć.

Zastanawiam się nad jakąś formą czasowego wyzwalania flagi (np 400ms od pierwszego znaku). [...] Mógłby ktoś podpowiedzieć w jaki sposób wrzucić zliczanie czasowe do przerwania

To wtedy nic nie odbierzesz

Link do komentarza
Share on other sites

1. Spojrzałem na opis komend tego fibocom i tam w paczce masz indykator długości... nie warto by było z tego skorzystać?

2. Zrób przerwanie na timerze np. co 10 ms. W tym przerwaniu dodawaj tylko 1 do zmiennej ( zmienna typu volatile char lub podobnego, oczywiście nie dopuść do przepełnienia).

Teraz w przerwaniu od uarta możesz tylko sprawdzać czy zmienna dodawana w timerze nie przekroczyła 40 ( czyli Twoich 400ms ) i jak przekroczyła to obrobić pakiet no i oczywiście wyzerować zmienną zliczaną w timerze. W ten sposób nie blokujesz przerwania.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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