ATNEL tech-forum
https://forum.atnel.pl/

bufor cykliczny uart
https://forum.atnel.pl/topic18978.html
Strona 1 z 1

Autor:  DarkMajster [ 11 sie 2017, o 12:46 ]
Tytuł:  bufor cykliczny uart

Witam! Mam pytanie co do bufora cyklicznego uart'a z bluebookowej biblioteki.
Mianowicie czy on powinien działać w taki sposób: w atmedze[1] wysyłam co sekundę inny char:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W atmedze[2] wyrzucam sobie na terminal zawartość tablicy bufora
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po włączeniu atmegi[2] mam same zera (co raczej mnie nie dziwi :D) i powolutku zera zamieniają się na kolejne liczby naturalne, myślałem, że po zapisaniu 32 bajta zaczną się nadpisywać bajty od 1, jednak nic się nie dzieje :( Gdzie więc podziała się cykliczność mojego bufora?

Autor:  mirekk36 [ 11 sie 2017, o 13:21 ]
Tytuł:  Re: bufor cykliczny uart

A co to ma w ogóle wspólnego z buforem cyklicznym ? Coś kolega chyba kompletnie nie zrozumiał IDEI działania takiego bufora

on jest po to żeby sobie działał w tle przy czym bufor nadawczy nie ma aż tak istotnego znaczenia przy większych prędkościach jak bufor odbiorczy

Co ty w ogóle testujesz i co chcesz osiągnąć ? sorki ale po twoim opisie kompletnie tego nie rozumiem - o czym piszesz ... no i ten test

uart_putc(i);

jak myślisz co ty zobaczysz na terminalu gdy 'c' będzie się zmieniać w zakresie od 0 do 128 ???? Zdajesz sobie sprawę z tego co to są znaki "niedrukowalne" o kodach chociażby od 0 - 32 ? ... znaki ASCII czyli te prawidłowo widoczne w terminalu zaczynają się dopiero od spacji od kodu = 32

w drugim przykładzie już coś sobie robisz dobrze bo korzystasz z uart_putint() ... ale nadal nie rozumiem co to ma mieć za związek z buforem cyklicznym ?

Bufor sobie działa a ty w takim przykładzie nawet nie wiesz o tym, że on działa "pod spodem" i tak ma być

Autor:  DarkMajster [ 11 sie 2017, o 15:05 ]
Tytuł:  Re: bufor cykliczny uart

z atmegi[1] przesyłam do atmegi[2] char'a 0-127, a z tej drugiej do komputera na terminal zawartość UART_RxBuf[].
Okej, czyli rozumiem, że bufor sobie żyje jak chce i tylko mi wrzuca co odebrał do UART_RxBuf[]? Jak więc powinienem korzystać z odebranych danych kiedy owa tablica mi się zapcha? jakoś czyścić czy cuś?

Autor:  xentis [ 11 sie 2017, o 16:15 ]
Tytuł:  Re: bufor cykliczny uart

Zrozum jak wysyłasz char'a od 0 - 127 to i tak te od 0 do 31 w terminalu nie ujrzysz nic albo krzaki bo znaki do 31 to są znaki specjalne i sterujące więc jak chcesz widzieć w terminali to wysyłaj znaki od 32 w górę (tablica znaków ASCII się kłania).
DarkMajster napisał(a):
Okej, czyli rozumiem, że bufor sobie żyje jak chce i tylko mi wrzuca co odebrał do UART_RxBuf[]? Jak więc powinienem korzystać z odebranych danych kiedy owa tablica mi się zapcha? jakoś czyścić czy cuś?

Jeżeli będziesz odbierać dane z bufora to Ci się nie przepełni. Każdy odczytany znak zwalnia miejsce z bufora. Przepełnienie może nastąpić gdy po stronie odbiorczej będziesz zbyt wolno odczytywał dane z bufora lub gdy masz za mały bufor a nadawana jest większa ilość danych ciurkiem.

Autor:  DarkMajster [ 11 sie 2017, o 16:21 ]
Tytuł:  Re: bufor cykliczny uart

ale ja nie wysyłam chara do terminala! chara wysyłam do drugiej atmegi a ta wysyla zawartość UART_RxBuf[] jako inty do terminala, bo chciałem sprawdzić czy atmega druga odbiera dane tak jak myślałem czyli zapalnia UART_RxBuf[] a po zapisaniu 32 bajta nadpisuje po kolei UART_RxBuf[0], UART_RxBuf[1].. etc, ale widzę, że nie i stąd drugie pytanie jak odbierać te dane poprawnie

Autor:  xentis [ 11 sie 2017, o 16:30 ]
Tytuł:  Re: bufor cykliczny uart

A jak sprawdzasz co jest w buforze odbiorczym?

Autor:  DarkMajster [ 11 sie 2017, o 16:32 ]
Tytuł:  Re: bufor cykliczny uart

tak jak w drugim kodzie, w 1 poście

Autor:  xentis [ 11 sie 2017, o 17:10 ]
Tytuł:  Re: bufor cykliczny uart

no to jeśli nie pobierasz danych z bufora cyklicznego funkcją która do tego służy a dobierasz się bezpośredni do samego bufora to nie dziw się że bufor się zatrzymuje ( jest tak napisany że jeśli tymczasowy head się zrówna z tail to dane nie są umieszczane w buforze, a w warunku nawet masz komentarz "tutaj możemy w jakiś wygodny dla nas sposób obsłużyć błąd spowodowany próbą nadpisania danych w buforze") Jeśli chcesz by bufor się nadpisywał po prostu wywal warunek, a do pobierania danych z bufora używaj dedykowanej do tego funkcji uart_getc (bo generalnie z bufora nie powinieneś bezpośrednio odczytywać).

Autor:  mirekk36 [ 11 sie 2017, o 17:31 ]
Tytuł:  Re: bufor cykliczny uart

DarkMajster napisał(a):
ale ja nie wysyłam chara do terminala! chara wysyłam do drugiej atmegi a


Jak ja słyszę że ktoś mówi

"wysyłam chara"

"wysyłam inta"

to aż mi ciarki po kręgosłupie z lewej strony chodzą a włosy stają dęba i potrójna gęsia skórka się robi

Chłopie - zrozum co to są znaki ASCII ... weź że obejrzyj ten poradnik



ale tak od początku do końca

..... opisany w Bluebooku bufor cykliczny działa TYLKO na ZNAKACH ASCII - zrozum to.

Więc jak sobie wysyłasz dane binarnie (bo tak się mówi - a nie że "wysyłam chary" bo to jakaś kosmiczna bzdura) ... to jak myślisz jak druga twoja atmega rozpozna koniec ramki gdy wyślesz sobie kod znaku = 13 ???? wiesz co to jest 13 ? hexadecymalnie 0x0D ???

Na prawdę - na początek postaraj się zrozumieć o co chodzi ze znakami ASCII - i jak wygląda komunikacja ASCII bo robisz jakieś MEGA KARDYNALNE błędy

możesz wysyłać STRINGI z jednej atmegi do drugiej i to stringi zakończone znakiem CR (ENTER 0x0d)

a nie tam wysyłać sobie ciurkiem 128 bajtów czysto binarnie. Twoja biedna druga Atmega po prostu zwymiotuje najpierw jak zobaczy ZERO

później gdy nadleci znak 0x0d ... bo uzna że dotarła pierwsza ramka ale ramka zamiast ASCII to zawierająca znaki niedrukowalne

0,1,2,3,4,5,6,7,8,9 ... 11,12

dlaczego nie ma 10 ? bo 10 czyli 0x0a to z kolei znak LF (LineFeed) pomijany przez obsługę bufora cyklicznego ....

coś czuję, że chyba jednak nawet nie przeczytałeś tego rozdziału w Bluebooku na temat tych buforów cyklicznych hmmm ?

Autor:  DarkMajster [ 11 sie 2017, o 19:21 ]
Tytuł:  Re: bufor cykliczny uart

No tak, powinienem użyć putint nie mam pojęcia o czym myślałem pisząc to ( zwalmy wszystko na grzejące słoneczko ). więc mam UART_RxBuf[] do którego wpadają odebrane dane, kradnąc je przez uart_getc zwalniam miejsce na kolejne, jeżeli tego nie zrobię to się bufor zapcha i obrazi?

Autor:  mirekk36 [ 11 sie 2017, o 21:32 ]
Tytuł:  Re: bufor cykliczny uart

DarkMajster napisał(a):
jeżeli tego nie zrobię to się bufor zapcha i obrazi?

;) no i fajnie w końcu widać - ze kolega załapał

nie nie obrazi - zajrzyj do BB do przykładów - masz tam moment w którym możesz reagować na błąd przepełnienia ... ale...

ale czy warto czekać na niego ?

nie ! ... warto wciąż odbierać stringi a nie pojedyncze znaki - wtedy nie uda ci się zapchać bufora cyklicznego

Jak to robić ?

To wyjaśniam już na końcu Greenbooka - ponieważ do tego potrzebne mi było aby czytelnik zrozumiał programowanie oparte o zdarzenia ...

czy można bez GB ? ,..... można - pewnie, że można - jakoś "ręcznie" ... na forum wielokrotnie czytelnicy podejmowali takie próby i z powodzeniem

pomimo to na końcu gdy zobaczyli jak warto to robić w oparciu o (EVENTS) zdarzenia - to ...

ALE tu warto obejrzeć chociażby ostatni poradnik o komunikacji UDP

nie obawiaj się, że mowa o UDP - zobacz o co w ogóle chodzi ;)

mówię ci obejrzyj to ;)



zdziwisz się jak prosto można to obsługiwać

Autor:  DarkMajster [ 12 sie 2017, o 10:38 ]
Tytuł:  Re: bufor cykliczny uart

Wczorajszy brak prądu mi chyba wyszedł na dobre bo drugi raz przeczytałem rozdział o uarcie, i wydaje mi się, że wiem więcej :D

Zrobiłem w atmedze wysyłającej tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A w odbierającej wymyśliłem coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I myślę, że powinno to działać tak:
czekam sobie na znak start of text, jeżeli go nie mam to uart_getc'harem usuwam z bufora jeden znak, a jeżeli już będzie ten oczekiwany znak 2, to wiem ze następne piec znaków to interesujące mnie dane.
Mam tylko jeden problem - nie działa :C co zrobiłem źle?

(dekoder to poprostu zamiana cyfr z ascii na zwykłe oraz kilka interersujących mnie liter na liczby 10-15
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

)

Autor:  mirekk36 [ 12 sie 2017, o 14:03 ]
Tytuł:  Re: bufor cykliczny uart

DarkMajster napisał(a):
co zrobiłem źle?


funkcja get_char() pobiera po jednym znaku z bufora cyklicznego a jeśli NIC nie ma w buforze to zwraca ZERO

a zatem jeśli nie masz GB to musisz sobie sam na razie jakoś napisać odbiór stringów z bufora cyklicznego. Krótka podpowiedź jak to zrobić tak "na piechotę"

badasz cyklicznie czy get_char() zwraca NIE ZERO, jeśli znak ASCII to doklejasz go do jakiegoś już swojego bufora i wciąż oczekujesz na znak CR czyli 0x0D - jeśli get_char() zwróci CR to wtedy wiesz że nadleciał koniec stringa i możesz odczytać swój bufor z ładnym stringiem.

Polecam jednak GB tam pokazane jest to pięknie jak się robi na zdarzeniach

Autor:  DarkMajster [ 12 sie 2017, o 14:21 ]
Tytuł:  Re: bufor cykliczny uart

Coś takiego?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  xentis [ 12 sie 2017, o 16:05 ]
Tytuł:  Re: bufor cykliczny uart

No niezupełnie - zauważ że dwa razy użyłeś funkcji uart_getc zanim odczytałeś docelowo znak. pierwsze użycie uart_getc w ifie pośle odebrany znak w niebyt, to samo w warunku pętli while dopiero trzeci znak wyląduje w Twoim buforze, ale już 4 znów poleci w nicość itd. Każde użycie funkcji uart_getc bezpowrotnie wyjmuje jeden znak z bufora więc od razu musisz wynik tej funkcji gdzieś umieścić.

Jeśli już chcesz bez zdarzeń to
najpierw załaduj wynik funkcji uart_getc do jakiejś tymczasowej zmiennej, następnie jeśli jest tam znak to umieść go w swoim buforze.
Możesz też w przerwaniu gdzie bufor cykliczny jest ładowany dodaj sobie zmienną/flagę która w momencie gdy w buforze będzie cokolwiek zostanie ustawiona na 1 a gdy bufor pusty na zero. A w pętli głównej programu sprawdzaj flagę i gdy ustawiona na 1 inicjuj odbiór danych z bufora cyklicznego do swojego bufora.

Autor:  DarkMajster [ 12 sie 2017, o 16:26 ]
Tytuł:  Re: bufor cykliczny uart

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A teraz?

Autor:  xentis [ 12 sie 2017, o 16:34 ]
Tytuł:  Re: bufor cykliczny uart

powinno zadziałać

Autor:  DarkMajster [ 12 sie 2017, o 17:47 ]
Tytuł:  Re: bufor cykliczny uart

No niby działa, ale nie działa :(

jedna atmega wysyła ciągle tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


druga odbiera i wyrzuca bufor stringowy do putty na zasadzie: indeks, zawartość dziesiątkowo, no i raz jest dobrze
Obrazek

a raz nie wiem co tu sie w ogóle wyprawia, nawet spacje ukradli :(

ObrazekObrazek

dodam, iż przy resetowaniu procka odbiorczego czasem zaczyna działać, potem się chrzani, a jak po resecie jest schrzanione to już naprawić się nie chce ;c

czyżby jednak wonsz sie zjadał? No i co tu teraz mądrego zrobić?



EDIT:
Problem rozwiązany! Choć nie wiem czy to tak elegancko :D, mianowicie: muszę przesłać 6 bajtów, więc dorzuciłem dwa byle jakie, zmniejszyłem rozmiar bufora odbiorczego do 8 bajtów, pozwoliłem mojemu wonszowi się zjadać, i teraz jeżeli przyjdą nowe dane[a będzie to dokładnie 8 bajtów], to dany bajt (oznaczający np stan przycisku) będzie miał nie zmieniony indeks, a na wypadek jakiegokolwiek przesunięcia - sprawdzam czy te zbędne 2 bajty są na swoim miejscu, jeżeli nie to ustawiam wonża na początek. Do moich celów sprawdza się wyśmienicie, co o tym sądzicie?

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/