Witam, zwracam się do was drodzy forumowicze o pomoc.
Jestem w trakcie pisania pracy inżynierskiej. W skrócie muszę odebrać dane z urządzenia "A", przefiltrować je i następnie wyświetlić gotowe nazwy, które będą bazowały właśnie na odebranych informacjach. Urządzenie korzysta z bardzo dziwnej magistrali bo jest z branży AGD. Z tego co zauważyłem jest to połączenie CAN'a, one wire i uart'a. Ogólnie na wyjściu urządzenia wykorzystywane są RX i TX. Struktura ramki podstawowa - 8n1. Mikrokontroler jaki wykorzystuje to ATmega8. Jako posiadacz bluebooka wspieram się książką w pisaniu programu.
Niestety mam problem z filtracją otrzymanych ramek :/. Do obsługi UART'u wykorzystuję program oparty na buforach cyklicznych (z bluebook'a). Ogólnie mój pomysł na przefiltrowanie danych jest następujący:
- Wykorzystując funkcje uart_getc w loopie pobieram sobie jeden bajt z bufora cyklicznego UART_RxBuf
- Następnie w ifie sprawdzam czy pobrany bajt, to koniec ramki danych (tutaj mam problem, ponieważ nie mam pojęcia w jaki sposób kończy się ramka. Chodzi mi o to, ze nie znam jej fizycznej wartości, po której mógłbym "uciąć" daną ramkę, więc nie sugerujcie się wartością 0xFF). Postanowiłem to zrobić na takiej samej zasadzie, jak jest opisana w bluebooka w temacie o tablicach znakowych. Czy istnieje jakiś sposób na znalezienie fizycznej wartości ? Sprawdzałem dokumentację, jednak tam nic nie znalazłem ;/
- Po wykryciu końca ramki, chcę użyć funkcji strCopy(), która ma za zadanie przepisanie wartości bufora Rx do nowej tabilcy. Żeby ta funkcja mi zadziałała, to tablicę do której przepisuję dane, musiałem dać również jako volatille. W tym przypadku również wykorzystałem wiedzę z tematu o tablicach znakowych
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
- Następnie, chce wyświetlić odebraną ramkę (już uciętą po znaku kończącym ją) na LCD. Pomyślałem, ze warto byłoby wykorzystać funkcję lcd_hex(), jednak wykorzystuje ona itoa, więc potrzebuję tablicy typu int (chyba, że się mylę) a moja tablica, ta do której kupuję zawartość bufora cyklicznego RX jest typu volatille char, bo inaczej nie zadziała mi funkcja kopiująca. Pewnie musze jakoś ją zmienić właśnie na int, jednak nie wiem jak to zrobić.
Tutaj wrzucam kod z mojego main.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dodatkowo wrzucam schemat układu, którym odbieram dane prosto do atmegi. (Schemat jest nie zaktualizowany, ponieważ sygnał nie trafia do Arduino, a do czystej ATmegi. Wcześniej właśnie próbowałem to zrobić na arduino, ale zrezygnowałem bo czyste C lepsze
.
Czy opisane przeze mnie rozumowanie jest poprawne? Inaczej nie mam pomysłu jak to rozwiązać, pomijając fakt, że to aktualnie zaproponowane przeze mnie mi nie działa. Macie jakiś pomysł jak to zrobić? Może własne rozwiązania odbioru takich danych? Myślę, ze małe nakierowanie mnie dużo pomoże w tym temacie.
Liczę na waszą pomoc!