Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 2 gru 2024, o 22:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 48 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
 Tytuł: Problem z RS232
PostNapisane: 6 kwi 2012, o 10:24 

Pomógł: 0

Witam serdecznie wszystkich i z góry przepraszam jeżeli zadam głupie pytanie, ale już dłuższy czas nad tym deliberuje i pomysłów nie przybywa.

Piszę program do wyświetlacza 7-segmentowego sterowanego z RS232, dokładniej, przychodzi ciągle ramka z danymi, trzeba wysupłać z niej 7bajtów + CR (oznaczający koniec interesującej mnie dane), dane przychodzą cały czas na RS, więc koncepcja z kołowym buforem (przykład z książki M.Kardaś) nie spełnia swojego zadania. Gdyż bufor cały czas jest jak by zapełniany danymi. Ramka ma dokładnie 17bajtów, najpierw jest jedna 7bajtowa dana kończąca się CR, potem druga 7bajtowa CR+LF na końcu.

Obsługę wyświetlacza udało mi się ładnie napisać dzięki książce :), wszystko jest fajnie w niej wyjaśnione.
Niestety, programista ze mnie marny, nawet nie mam pomysłu jak to ugryźć, mam 6zmiennych, każda odpowiada za znak na wyświetlaczu.
RS musi być obsługiwany w przerywaniu, podobnie zresztą jak wyświetlacz.

Koncepcja moja wyklarowana w mym ciasnym umyśle, jest następująca, zrobić coś na kształt bufora jak w książce, ale o stałym rozmiarze 7bajtów +CR, reszta danych w próżnię, ewentualnie do drugiego bufora.
Potem zależnie od tego co jest w danych "wywalenie" tego na wyświetlacz.

Problemem jest zwracanie tablicy char przez funkcję obsługującą bufor odbiorczy, bo z tego co kojarzę nie bardzo da się w C zwrócić tablicy char przez funkcję, a to by było najprościej, potem by wystarczyło za pomocą pętelki wysupłać poszczególne bajty z tablicy na wyświetlacz.

Prośba, czy ktoś może mnie poratować jakimś przykładem, jak za pomocą wskaźników przekazać np. RxBUF[7] (tablica 7bajtowa) przez funkcję obsługującą bufor RSa.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2012, o 14:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Ja tylko powiem tak.

ZDECYDOWANIE można do tego celu wykorzystać bufory cykliczne, powiem więcej, nawet WARTO ;) I taka koncepcja pięknie może spełniać swoje zadania w 100% a nawet w 1000000%

Owszem - w tej książce pokazałem najważniejsze podstawy pracy z RS232 w tym właśnie bufory cykliczne. Nie mogłem jednak wrzucać wszystkiego naraz łącznie z przykładami obsługi tychże buforów w oparciu o zdarzenia - bo zdarzenia i te bardziej zaawansowane techniki programowania dopiero pod koniec książki poruszam - więc wyszłaby z tego kołomyja.

Opisuję to za to w drugiej części książki i mam nadzieję, że po niej wielu osobom przejdą pomysły na realizację własnej prostej komunikacji przez RS232 w postaci tworzenia jakichś własnych dziwnych binarnych ramek - bo tak to próbujesz robić.

Oczywiście nie mam tu na myśli tego że tak nie da rady - ale wbrew pozorom - wszyscy aż TAK się boją komunikacji za pomocą znaków ASCII bo to straszne niby ---- a później sami się wkopują w transmisję binarną, ramki, wyłapywanie ich początku, końca, dochodzą zaraz timeout'y - a jeśli jeszcze nie doszedłeś że muszą takie być - to niestety wkrótce dojdziesz - bo to jest i bywa dużą bolączką takiej komunikacji.

Uwierz mi że ja w 99% swoich przeróżnych i skomplikowanych projektów nadaję tylko w postaci łańcuchów ASCII gdzie znakiem końca linii jest jeden wygodny znak ENTER .....

szkoda że tak mało ludzi idzie tą drogą .....

ale kilka dni temu był tu na forum podobny temat - i też radziłem jak najszybciej nauczyć się wykrywać w przerwaniu znaki ENTER nadlatujące i masz od razu możliwość odczytu całych pięknych łańcuchów z buforów cyklicznych bo po to one są....

Możesz zapomnieć wtedy o dziwnych timeoutach i mieszaniu się wszystkiego ale także o własnym programowaniu na nowo w przerwaniach .....

Bo z jednej strony sam stwierdziłeś że bufory cykliczne są fajne i fajnie to działa - tylko że zamiast podchwycić pomysł to strasznie szybko z niego zrezygnowałeś - porzucając podstawy i rozpoczynając wymyślanie koła tak jakby od nowa .....

Odszukaj sobie ten temat na tym forum i poczytaj jak kolega dzięki podpowiedziom tego typu zaczął już sam bez drugiej części książki korzystać z tych mechanizmów i buforów cyklicznych....

Bo tak to wychodzi na to, że opisałem jakąś fajną ale felerną zabawkę "bufory cykliczne", która rzadko się przydaje w praktyce i nie do wszystkiego można jej użyć...... A to nieprawda ;) .... można jej użyć i nawet warto do wszystkiego wręcz.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2012, o 19:57 

Pomógł: 0

Nie twierdzę, że zarzuciłem temat bufora cyklicznego, po pierwsze mam problem z zrozumieniem jak z niego wysupłać daną która mnie interesuje, po drugie programista ze mnie żaden ;), elektronik owszem ;), ale programista niestety nie.
Kiedyś skrobnąłem kilka programów w asemblerze, nie do końca jeszcze rozumiem C.
Przejrzę dokładniej resztę książki, w rozdziale o RS232, nie do końca, przynajmniej dla mnie jest jasno wyjaśnione jak pobrać cały bufor, tylko pojedyncze znaki.

PS. rozumiem, że chodziło o ten topic topic968.html ?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2012, o 21:26 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Dokładnie chodziło i chodzi o ten topic ;)

a dlatego podałem tylko funkcję do pobierania pojedynczego znaku z bufora cyklicznego bo cały czas przekonuję że język C ma tą fajną zaletę, że wszystko sprowadza się do napisania sobie podstawowej funkcji do wysyłania czy odbioru pojedynczego znaku (jeśli chodzi o jakieś transmisje) a potem to już z górki - bo wszystkie nadrzędne funkcje można pisać na jedno kopyto, praktycznie COPY & PASTE tylko nazwy funkcjom zmieniać ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 13:23 

Pomógł: 0

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



Przy wysyłaniu w terminalu, na wyjście terminala dostaje dokładnie to co na wejściu, ale niestety lcd_str(z) nie za każdym razem dobrze wyświetla, rzadko wyświetla co dostaje na terminal, głównie wyświetla głupoty.

Po drugie, próbuję wrzucić pierwsze 7znaków do tablicy

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


procedury obsługi lcd i led, są z książki, sprawdzone, sprawne, bo przy wrzucaniu do funkcji lcd_str gotowego stringa tj. lcd_str("test") - tekst test wyświetla się prawidłowo
Tak samo przy wrzucaniu do zmiennych np, jak w cy1=1 wyświetla się na wyświetlaczu 1. Tablica z przypisaniem zmiennych odpowiadających poszczególnym znakom led ma przy pozycji 1, zapalić segmenty odpowiadające b i c.

Nie bardzo wiem, co począć z tym whilem, próbowałem już bez negacji, ale program po prostu przechodzi dalej. Wiem, że każde wywołanie uart_getc() powoduje pobranie znaku z bufora, a dana dana ;) jest tracona, dokładniej pobierana z bufora a wskaźnik bufora pokazuje od tej pory na element kolejny itd.
Tylko po pierwsze, mnie dane do bufora napływać będą non stop, czyli cały czas w tej postaci (znaki w ASCII) -01,230|CR|000,450|CR|LF (more wstawiłem tylko do poprawy czytelności).
CR ma kod 0x0d, więc pętla while powinna wypełniać tablicę znak[i] aż do napotkania znaku CR.

PS. funkcja lcd_str(z) wyrzuca takiego warninga jeszcze "Description Resource Path Location Type
passing argument 1 of 'lcd_str' makes pointer from integer without a cast main.c LargeLED"

Wszelka krytyka i naprowadzenie mile widziane.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 13:34 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Krytyka? po co - przecież pytasz ;) a nie prezentujesz jakieś gotowe ukończone własne opracowanie w DIY ;)

Naprowadzenie OK chętnie - ale niestety bez kodu ani rusz - przynajmniej ja nie dam rady po takim opisie .... przecież nawet nie wiadomo z czego wynika ten błąd który pokazałeś - a pewnie coś nie tak robisz z definicjami wskaźników lub zmiennych

zaczynaj więc od kodu - tylko umieszczaj go z łaski swoje w znacznikach [ synatax = c ] zamiast w [ code ] ??? masz zresztą możliwość zrobić to automatycznie - zaznaczając kod i wybierając rodzaj z pola "Listing kodu"

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 14:03 

Pomógł: 0

Kod musiał bym wysłać na PW, bo sporo jest Pana książki. Przynajmniej część obsługi RS, LED i LCD :). Uważam, że nie ma co wyważać otwartych drzwi, to po pierwsze, a po drugie z moim zasobem wiedzy nie był bym wstanie napisać tak lekkiego i praktycznego kodu.

Tj. wystarczy, że podeślę pliki na PW, chociaż uważam że to troszkę kłopotliwe, albo na jakiegoś maila :).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 14:09 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Poczekaj - jak mówię o pokazaniu kodu - to nie chodzi mi wcale o biblioteki z książki bo przecież te mamy razem pod ręką - wystarczy tylko to co piszesz w main.c

ale ok już wyżej znalazłem babola straszliwego jakiego robisz :(

Kod:
   uint8_t z = c; // to pewnie nie jest potrzebne, tj. rzutowanie char na int
        lcd_str(z);


zajrzyj sobie do deklaracji lcd_str()

co ma być jej argumentem ???? wskaźnik na łańcuch danych czyli jakiś tekst

a ty definiujesz sobie zmienną uint8_t ..... przypisujesz do nie zmienną c która z kolei jest typu char - no i bach! dajesz tą zmienną z jako argument funkcji która potrzebuje wskaźnika - więc nie zgadza ci się ani rodzaj argumentu ani jego typ

jak więc chciałbyś żeby to miało ci zadziałać ?

wiesz co to jest wskaźnik na tekst ???? przecież lcd_str() ma w założeniu wyświetlać własnie string (tekst) - a ty co próbujesz robić ? zastanowiłeś się nad tym ??? - pokombinuj tutaj co robisz nie tak - bo mocno robisz nie tak - OK ?

i daj znać co ci wychodzi po przemyśleniach

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 14:19 

Pomógł: 0

Rozumiem, że argumentem powinien być wskaźnik na tablicę znaków, ewentualnie nazwa tablicy która jest sama wskaźnikiem na pierwszy znak tablicy.
To pierwszy problem, poniżej cały mój main
w zasadzie kwestia wyświetlania na LCD nie jest dla mnie priorytetem, podczas problemów z opanowaniem wyświetlania na 7segmentowym wyświetlaczu, danych ascii przychodzących z RSa, pomyślałem, że łatwiej będzie zapanować nad tym co się dzieje na wejściu, taki mój własny debager programu.


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


Nie wiem, może problemem jest na początku zła deklaracja tabeli znak
powinno być volatile??
program nie przechodzi przez while, próbowałem obydwu wersji z negacją != i bez niej. Ale while wykonuje się tak długo jak wyrażenie w nawiasie jest prawdziwe, z tego co pamiętam.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 16:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Po pierwsze to powiedz mi co to w ogóle jest ????? :

Kod:
#define F_CLK 11059200


bo już czuję że po odpowiedzi na to pytanie będzie mnóstwo kłopotów..... (a dodam od siebie że to na pewno jest nieporozumienie genetyczne) :(


druga sprawa - co to jest?

Kod:
char znak[17]={0};


przecież definiujesz tablicę wewn. funkcji czyli na stosie - o to ci chodziło - i inicjalizujesz w niej TYLKO pierwszy znak - a reszta będzie przypadkowymi wartościami co najczęściej zaowocuje ci szeregiem błędów podczas próby wyświetlenia znaku z takiej tablicy :(

poczytaj/doczytaj o różnicach i inicjalizacji zmiennych globalnych a lokalnych

kolejna rzecz - a co tu robi to słówko extern ??? na pewno wiesz do czego to jest ? jeśli tak to wytłumacz mi to - co ono u ciebie robi ?

Kod:
extern char znak[17];


a nadmienię że domyślam się iż robi poważne KUKU - i podejrzewam , że program po kompilacji sypie ci warnigami w takiej postaci jeśli on jest

na koniec - jakiego środowiska używasz do pisania programów ?????

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 21:24 

Pomógł: 0

OK, poczytałem dokładnie o co chodzi z tym externem, tj. nie używam zmiennej w innych plikach to i extern jest zbędny, F_CLK, też już odfajkowałem, przyznaję się nie zauważyłem tego, a już tyle razy przepisywałem to, że mi umknęło.

Używam eclipse. Instalacja dokładnie zgodna z filmem na płycie z książki Atnel :).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2012, o 22:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No proszę czyli coraz fajniej - skoro extern zniknęło po takiej analizie ok

i jak teraz program ?

Tą tablicę zdefiniuj jako zmienną globalną to sama się wypełni zerami i wtedy jeśli do pierwszego elementu zapiszesz znak do wyświetlenia na LCD to zawsze w kolejnym elemencie będzie zero czyli ładny C-String o długości jednego znaku i już funkcja lcd_str() ze wskaźnikiem na pierwszy element tej tablicy zawsze ładnie ci zadziała

z drugiej strony zobacz że biblioteka LCD też udostępnia na zewnątrz funkcję

lcd_char()

która może wyświetlać pojedynczy znak

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2012, o 14:23 

Pomógł: 0

Po analizie swoich baboli ;), doszedłem do wniosku, że potrzebuję do..while, by pętla wykonała się przynajmniej raz

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


niestety, dalej wyświetlanie na lcd świruje, co prawda dostaję prawie to co na wejściu, ale prawie, nie zawsze wraca kursor na home
, oraz próba wyświetlenia czegokolwiek na wyświetlaczach led za pomocą zmiennych cy nie daje pożądanych rezultatów. Jedynie co to fakt dodania na końcu delay 1s, daje efekt zmiany ale tylko na wyświetlaczu cy3, czyli zmienna i się zmienia :). Od poszczególnych "znaków" ascii odejmuję 30, by przesunąć pozycję w mojej tablicy znaków dla LED.

Na wyjściu terminala dostaję ładnie to co na wejściu, ale po usunięciu funkcji delay, program czasem idzie w maliny, trzeba zresetować proca. Nie wiem, czy czasem pętla nie wychodzi po za obszar tablicy.
Wysyłam -01,230$0d000,450$Od$0A, i najpierw dostaję pierwszą połówkę, a po 1s drugą (tj, do pierwszego $0d) po 1s do $0A, co nie powinno mieć teoretycznie miejsca, bo przecież pętla sprawdza, że dla 0x0d powinna przerwać przepisywanie zmiennych z funkcji uart_getc().
Coś dalej robię źle.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2012, o 17:18 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Niestety idziesz bardzo złą drogą w celu odbierania stringów w pętli głównej - polecam ci przyjrzeć się i przeanalizować temat:

topic968.html

jak kolega fajnie nad tym pracował i wypracował w końcu - poczytaj ze szczególną uwagą końcówkę tego całego wątku

Jak dla mnie to za dużo naraz chcesz robić w jednym nie opanowawszy najpierw odbierania stringów i wyświetlania ich na LCD i przez to wszystko naraz ci się miesza - masz za dużo niewiadomych....


Najpierw opanuj RS232 bardzo dobrze tzn przynajmniej to potrzebne ci odbieranie stringów i wyświetlanie ich na LCD a potem łącz dalsze rzeczy jak wyśw. LED itp

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 14:52 

Pomógł: 0

Wziąłem sobie do serca wszystkie uwagi w moim wątku i polecanym. Po przemyśleniach, poczytaniu kilku książek ;).

Udało mi się zmusić do działania i LCD i LED,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


fragment rs232.c

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


fragment pliku d_led.c z tablicą deklarującą znaki na LED
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Problem mam z rozdzieleniem pierwszej "paczki" Paczki danych, dokładniej jak wcześniej pisałem format -01,230$0d000,450$Od$0A jest stały, może być też 001,230$0d000,450$Od$0A, z wyłączaniem oraz przesuwającym się przecinkiem poradzę, sobie sprawdzając poszczególne miejsca za pomocą if. Zresztą jest to już przykładowo w main zrobione i działa
Nie wiem, jak zostawić pierwszy człon tj. -01,230 danej, bo teraz dostaję na wyświetlacz raz -01,230 a raz 000,450 Zresztą zgodnie z działaniem warunku pętli while, próbowałem zmieniać w while i if porównianie z !=0x0d na 0x0a, ale za każdym razem program idzie w maliny ;).
W tej formie co jest działa, ale wyświetla na przemian. Jakiś pomysł?.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 18:40 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No ja raczej na razie nie pomogę bo musiałbym rozwijać pomysł którego bym nie polecał :( ... ale już niedługo druga książka i będzie tam sporo o tym w ostatnim rozdziale - ale już tak jak to się powinno robić od początku do końca i to jeszcze pięknie za pomocą własnych komend AT

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 20:43 

Pomógł: 0

Niestety nie mam możliwości zmiany w jakikolwiek sposób ramki idącej do RSa, książkę i tak kupię, chociaż czekać nie mam za bardzo czasu ;);).
Sprawdzę jeszcze parę pomysłów. Ogólnie pomysł bufora o podstawie potęgi 2, u mnie się nie sprawdza. Albo ja go nie potrafię odpowiednio zaimplementować. Po ograniczeniu "sztucznym" bufora do ramki 17bajtów, dane przestały się rozjeżdżać, jak na razie ostatni problem, to rozdzielenie danych między separatorem 0x0d.

Mam już chyba każdą polecaną książkę, o C ;). Szkołę programowania S. Prata do c i c++, symfonie i pasję grębosza, thinking in c++, język C nowoczesne programowanie, bibliotekę C++, wszystkie pozycje C pod AVRy ;). Tylko nie ma kiedy tego czytać ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 21:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Absolutnie nie chcę się przyrównywać do wymienionych przez ciebie książek, kanonów języka C .... nie mniej jednak mam nadzieję, że i w tej mojej znajdziesz coś co od razu - pozwoli ci pozbyć się jak od pstryknięcia palcami - problemów o których piszesz a szczególnie że masz do tego równie dobrze skomentowany kod źródłowy z przykładem i aplikacją na PC do testowania tego wszystkiego - na prawdę - mam nadzieję, że będzie to również miłe zaskoczenie.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 21:19 

Pomógł: 0

Dziś to już chyba moje ostatnie pytanie

czy

if(*wsk_znak == 0x0d && *wsk_znak+1 == 0x0a)break;

ma prawo bytu???, jak sprawdzić dwa następujące po sobie znaki w buforze, czy są zgodne z wzorcem?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 21:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Jeśli u ciebie wskaźnik wsk_znak pokazuje na bufor to pewnie że ma prawo bytu - tylko ja bym może to tak zapisał:

if(*wsk_znak == 0x0d && *(wsk_znak+1) == 0x0a) break;

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 21:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8587
Pomógł: 337

a próbowałeś może wyliczać sumę kontrolna CRC pakietu ??
przecież możesz wysłać paczkę w postaci np: TD:DATA1:DATA2:DATA3:CRC ??

CRC pozwoli ci dojść czy pakiet przesłał się prawidłowo:)
a potem formatowanie już jest proste prawda :)

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 21:59 

Pomógł: 0

Dzięki, za radę z CRC, niestety, za każdym razem będzie wysyłana inna wartość, tj. ramka się nie zmienia czyli 3bajty, 2c, 3bajty, 0d, 3bajty, 2c, 3bajty, 0d, 0a. Co prawda docelowo muszę jakoś to kontrolować, ale sama ramka się nie zmienia.
Zastanawiam się czy nie lepiej, zmienić w nadawaniu dodatkowo sprawdzania parzystości np. zawsze to pewniejsza transmisja sprzętowa. Tylko dobrze też, by się na wyświetlaczu głupoty nie pojawiały.


PS. if(*wsk_znak == 0x0d && *(wsk_znak+1) == 0x0a) break; działa :D., zapomniałem, że *(wsk_znak+1) musi być, czyli nie dodawanie do zmiennej wskazywanej, ale do samego wskaźnika, czyli de facto przesuniecie wskaźnika o jeden w górę.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 22:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8587
Pomógł: 337

ale to żaden problem wyliczać z ramki CRC
np bierzesz ostatnie bity każdego ciągu danych , oczywiście możesz to kontrolować poprzez bit parzystości
możesz też po każdych możesz też spróbować nadawać CR po każdych 3ch bajtach

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2012, o 22:18 

Pomógł: 0

Niestety zmiana ramki, jest ograniczona, wysyła je gotowe urządzenie i za wielu modyfikacji samej ramki nie można zrobić.
Teoretycznie sprzętowe CRC, oraz kontrola czy faktycznie napłynęło 17bajtów z 0x0d, 0x0a na końcu może być jakimś rozwiązaniem sprawdzania poprawności nadchodzących danych.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lip 2012, o 13:31 

Pomógł: 0

Problemów ciąg dalszy.
Próbowałem, a przynajmniej tak mi się wydaje skorzystać z funkcji mirka
char * uart_get_str(char * buf)

Ale przyznaje się bez bicia, za cholerę nie wiem jak się do tego dobrać
Z tekstu w książce zrozumiałem, że ona powinna pobrać całą "ramkę" aż do znaku LF, czyli trzeba by to wrzucić do jakiejś tablicy tak?
Tylko albo z winy wrodzonej głupoty, albo 31C u mnie w warsztacie, nie potrafię za bardzo wymyśleć jak to zrobić.
Próbowałem rozgryźć to przeglądając obsługę eventów w ostatnim programie UART ascii AT, ale nie potrafię dojść do jakichkolwiek wniosków :(.

Niestety wykorzystania callback w ogóle nie biorę pod uwagę, bo tego to już całkiem nie rozumiem ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lip 2012, o 14:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No ale tak - sama funkcja uart_get_str() działa tak, że :

1. wywołujesz ją z argumentem, w którym podajesz wskaźnik do buforka do którego chcesz wczytać odebraną linię przez RS232

2. jako rezultat funkcji dostajesz ten sam wskaźnik - czyli na początek bufora i już siedzi w nim cała linijka

czyli odpal sobie terminal w windows

napisz jakiś tekst np: testuje sobie rs232 ;)

i kliknij KLAWISZ - ENTER

w tym momencie możesz w pętli głównej wciąż wywoływać tą funkcję - ona przecież sprawdza czy pojawiła się nowa linia w buforze ;) .... więc jeśli nie to przelatuje jak woda przez maszynkę do mięsa ..... a jeśli się pojawiła linia, bo klepnąłeś ENTER w terminalu to od razu masz tekścik w buforze

no dobra ale pewnie zapytasz - a jak sprawdzać czy coś w końcu przyszło czy nie?

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


tak mi się zdaje .... bo hmmm aż szkoda nie wykorzystywać zdarzenia :(

przecież aby wykorzystać zdarzenie wystarczy tylko:

1. napisać jakąś własną funkcyjkę która będzie obrabiać to co przyleci, linia po linii np:

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


sam ją sobie piszesz i nikt ci nie narzuca co w niej ma być - czy to nie wygodne ?

2. no tak tylko teraz musisz powiedzieć tej bibliotece: hej - dzieńdobry pani biblioteko, czy mogę zarejestrować u ciebie moją własną funkcję, i jak przyjdzie do mnie jakaś przesyłka to proszę ją wywołać OK ? będę wdzięczny. A pani biblioteka mówi - nie ma sprawy, wypełnij pan tylko kartę rejestracyjną - bo przecież mogę mieć kilku takich natrętnych klientów jak pan, poniżej karta rejestacyjna do biblioteki ;) czyli funkcja:

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


czy to trudne narazie albo niezrozumiałe ? jak coś to pytaj ;)

3. ty sobie idziesz dalej i piszesz swój program jak ci się żywnie podoba, tylko dostajesz od pani bibliotekarki ZDARZENIE, oraz prostą instrukcję obsługi. Oto ona:

- wstaw pan sobie do swojej pętli głównej nasze narzędzie o tak:

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


- i teraz - jak tylko pani bibliotekarka ;) dzięki temu narzędziu ZDARZENIU zobaczy że jest dla ciebie przesyłka, to sama WYWOŁA funkcję, którą wcześniej zarejestrowałeś w bibliotece ;)

4. czyli program w pętli głównej sobie lata jak wariat - ty masz tylko raz na obieg pętli wywoływać EVENT, a jak coś to przepięknie wywołana zostanie "do tablicy" twoja funkcja, a w niej ;) .... już masz pewność, że w zmiennej przekazanej jako argument siedzi tekst który nadleciał w linijce ;)

czyż to nie piękne ???? i teraz możesz go bach np na lcd

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


- czy teraz chociaż troszkę się rozjaśniło ? popróbuj tego - a jak coś to dopytaj bo to na prawdę super mechanizmy. Jak raz użyjesz to potem nie puścisz - ja ci mówię - to trochę tak jak ja miałem z tym grotem "minifala" - tak własnie jest z callbackami i zdarzeniami w C ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lip 2012, o 14:32 

Pomógł: 0

Spróbuję coś dziś wieczorem sklecić, na razie z zdarzeń jestem totalnie zielony, a i z samego C nie błyszczę mądrością.
Wielkie dzięki za wytłumaczenie, mam jeszcze problem z zrozumieniem wielu rzeczy.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lip 2012, o 15:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

rezasurmar napisał(a):
Spróbuję coś dziś wieczorem sklecić, na razie z zdarzeń jestem totalnie zielony, a i z samego C nie błyszczę mądrością.
Wielkie dzięki za wytłumaczenie, mam jeszcze problem z zrozumieniem wielu rzeczy.


Z jednej strony jestem twoim dłużnikiem za tą minifalę, z drugiej strony jesteś na właściwym forum, więc jak coś nieteges - to molestuj mnie programistycznie na maxa ;) z chęcią podpowiem

a dodam, że bardzo mi zależy na tym, żeby przybliżyć wszystkim te callbacki

więc jeśli się wywiąże jakiś fajny temat na forum z pytaniami i odpowiedziami to wielu ludzi skorzysta ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 09:30 

Pomógł: 0

Próbuję właśnie coś spłodzić ;), ale nie bardzo jeszcze wiem, jak się dobrać do UART_RX_STR_EVENT(bufor)

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


Połączenie są napewno sprawne, wgrywam inny program (który działa, tj. wyświetla i na LCD i na LED masę itp). Nie wiem, czy trzeba w głównym pliku dopisać register_uart_str_rx_event_callback( czytaj_dane_z_rs232 ); bo rozumiem, że tego brakuje, ale jak odczytać te dane, używając UART_RX_STR_EVENT(bufor),
bufor jak widać jest zadeklarowany jako tablica 64bajtowa;
Funkcja parse_uart_data(char * pBuf), jest dla mnie niezrozumiała jak to przełożyć na obsługę czytaj dane z rs232.

Po przeanalizowaniu Mirku tego co napisałeś kolejny raz wyszło mi 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.


Nadal nie działa, ale wiem, że coś robię źle w funkcji czytaj_dane_z_rs232.

Wrzucam jeszcze działającego main, stara wersja która nie jest odporna na błędy, oraz na dane o zmiennej szerokości
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Może łatwiej będzie zrozumieć zamysł. Działająca wersja, jest sprzężona z "starymi" bibliotekami obsługi rs-a, z niewielką zmianą, dołożone są dwie flagi LF i CR. Zapalane jak przychodzą dane.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 10:27 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No ok ja rozumiem, że funkcja parse_uart_data() może być na razie niezrozumiała. Ale zastanawiam się dlaczego uparcie próbujesz wciąż w tej pętli głównej while(1) wyświetlać 300 tys razy na sekundę zawartość mybuf skoro tam nawet nic się nie pojawi. Pomijam już oczywiste sprawy jak inicjalizacje itp ale czemu nie zrobisz tego tak?


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


sam zobacz ;) .... wtedy jak tłumaczyłem wyżej w pętli głównej działa tylko obsługa zdarzenia tak? Wyobraź sobie że ta funkcja EVENT może być wykonywana bez obaw milion razy na sekundę ponieważ ona w ogóle nie blokuje działania pętli głównej i dzięki temu możesz tam dokładać jeszcze inny kod.

No ale jak nadleci coś z RS232 czyli cała linia danych, to ten EVENT sam wywoła tą twoją funkcję. Czyli wykona się ona TYLKO i WYŁĄCZNIE wtedy gdy coś nadleci rozumiesz? a przy okazji dostajesz wskaźnik do bufora ;) Po co zatem mnożyć te bufory albo wywoływać na darmo cały czas to wyświetlanie na LCD? Po to masz właśnie tą swoją funkcję do obsługi RS232 - i dzięki temu od razu możesz to co nadleciało analizować albo ot tak jak chcesz wysłać na LCD. Ale to wykona się tylko raz - wtedy kiedy trzeba - teraz troszkę jaśniej ? Jak nie to śmiało pytaj dalej bez żadnego zażenowania.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 48 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO