No to po kolei, widzisz - teraz jak podałeś komunikat pełny z konsoli to od razu wiadomo o co chodzi
użyłeś pan funkcji strtok_r() ..... a dodać odpowiedni plik nagłówkowy w którym ona się znajduje to co ???? amba zjadła ?
Kod:
#include <string.h>
i problem znika
to teraz dalej
------------------------ [ Dodano po: 19 minutach ]rezasurmar napisał(a):
Parsowanie po przecinku działa
, ale jak rozpoznać teraz przez brak znaku CR, te dwie dane w ramce oddzielone znakiem CR?
Aleś ty się uczepił tego CR
..... eeeeh jak jeszcze raz usłyszę, że powiesz o CR - to umawiamy się, że odetnę koledze język
..... (żarto oczywiście)
rezasurmar napisał(a):
Na wyświetlaczu rozdziela je na dwie linie
przy wykorzystaniu tej funkcji
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W tym momencie rozumiem, tylko sens użycia if i zmiennej cnt, która to rozdziela daną z mybuf, na dwie linie. Ale nie rozumiem, w jaki sposób funkcja lcd_str wie że jest nowa linia, przecież wywołując uart_puts(mybuf); nie dostajemy znaku nowej linii?
Wytłumacz mi proszę - skąd u licha bierze się tu w twoich rozważaniach nagle ten
uart_puts(mybuf) bo tego KOMPLETNIE nie rozumiem ? czyżbyś chciał sobie znowu coś utrudnić na siłę ?
Ale tłumacząc początek tego pytania - to funkcja lcd_str() NIC NIE WIE. A co ona ma wiedzieć ? ona dostaje tylko rozkaz coś wyświetlić więc nic nie wie. Zastanów się lepiej dlaczego dwa razy oddzielnie wywołuje się twoja funkcja
czytaj_dane_z_rs232( char * mybuf )
????? .... takie pytanie powinieneś sobie zadać. No dobra zakładamy że je zadałeś to ja odpowiadam. Po kolei:
urządzenie wysyła ramkę
-010,024[CR]045,456[CR][LF]
biblioteka UART odbiera kolejno znaki i NAGLE !!!!!!!!!!!! dostrzega pierwszy znak CR !!!!!!!!!!!!
w tym momencie uznaje że dotarła PIERWSZA LINIA do bufora cyklicznego i zwiększa zmienną mówiącą o siedzących liniach w buforze na potrzeby zdarzenia EVENT() i jednocześnie ignoruje ten znak CR ... no ale to nie koniec bo przecież ciurkiem nadlatują kolejne dane tej całej ramki z urządzenia prawda ??? czyli 045,456[CR][LF] ...
No i co? znowu biblioteka dochodzi do znaku CR .... czyli kolejna nowa linia !!!! zwiększa zmienną ilości linii odebranych w buforze cyklicznym!!!!!! i jednocześnie ignoruje znak [CR] - dalej wczytuje - patrzy a tu znak [LF] no to też go ignoruje.
i to wszystko co zrobiła biblioteka w przerwaniach obsługując bufory cykliczne, jednocześnie dała CYNK dla funkcji zdarzenia UART_EVENT() że w końcu pojawiły się upragnione dane !!!!!!! hurrraaaaa
no i teraz sobie wyobraź, że odbywa się kolejny przebieg pętli głównej while(1) .... i wykonuje się zdarzenie UART_EVENT, ono pięknie sprawdza licznik linii odebranych w buforze cyklicznym i co ???? bierze pierwszą linię i jeśli wcześniej zarejestrowałeś swoją funkcję
czytaj_dane_z_rs232()
to ją wywołuje przekazując jako argument CO ?????? UWAGA!!!!! tą pierwszą linię panie kochany - czyli
-010,024dzięki temu - ta funkcja wywołuje się PIERWSZY raz i dzięki zmiennej cnt wyświetla ją na pierwszej linii LCD, wychodzi program z funkcji, wraca do zdarzenia, zdarzenie się kończy i pętla główna while(1) biegnie dalej - w tym czasie na LCD nie ma jeszcze NIC, drugiej linii !!!!!!! musisz to sobie wyobrazić - wejść do matrixa bo to się dzieje tak szybko
no i w końcu nadchodzi drugi obieg pętli while(1) ... znowu wykonuje się zdarzenie UART_EVENT() i CO?????????
nadal widać że jeszcze jedna linia siedzi w buforze cyklicznym, więc co dalej ????? ponownie grzecznie wywołuje twoją funkcję do parsowania danych, i w argumencie mybuf przekazuje ci grzecznie, drugą część ramki:
045,456bez żadnych tam nikomu nie potrzebnych CRLF'ów
.... a durna funkcja lcd_str() dzięki locate() i cnt wyświetla ją grzecznie w drugiej linii LCD
a że dzieje się ten odbiór dwóch linii strasznie szybko to tobie - śmiertelnikowi wydaje się że to się od razu wyświetliło na LCD
czyli teraz masz w pierwszym wywołaniu swojej funkcji do podziału na kawałki tylko
-010,024więc pomyśl - użyjesz teraz tego znowu - czyli strtok_r() i podzielisz to dalej na tokeny
tak samo w drugim wywołaniu tej funkcji podzielisz na tokeny
045,456czy teraz jaśniej na razie ?