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



Teraz jest 24 kwi 2026, o 08:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 24 sie 2014, o 11:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Witam od 2 tygodni męczę się z programem do otwierania drzwi za pomocą karty RFID
,wałkowałem BB i GB oraz tematy na forum zwłaszcza topic968-90.html
,nic nie pomogło :(

Wszystko rozbija się o wrzucenie stringa do tablicy i porównanie ze wzorcem ,nie mogę sobie z tym poradzić.

Dane odbiornika RFID:

Format przesyłanych danych: xx xx xx xx xx CR LF (gotowy odbiornik transmisja 9600 8n1 )

,mój kod karty w terminalu Putty: F5BA4F0577

Korzystam z Mirkowych bibliotek usart z Green Booka.


Poniżej program:

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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 11:32 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 135
Pomógł: 11

Witam

Tak na pierwszy rzut oka:
-tablica z wzorcem ma dlugość 11 bajtów (inicjujesz ją przez cudzysłowy"", więc jest uznawana za "string" i dodawany do niej jest znak '\0'; nie jest to powód błędu, ale wyglada, że nie zwróciłeś na to uwagi
-warunek w "else if (XXXXXX)" nie jest potrzebny (elementy są sobie równe (to sprawdzasz poprzednio), a w innym przypadku nie są sobie równe)
-polecenie "i=0" jest w obydwóch warunkach; więc jest wykonywane zawsze, więc można je umieścić poza instrukcją warunkową
-W każdym obiegu pętli głównej pobierasz string i zaczynasz go porównywać; może spróbuj pobrać string, a następnie w pętli (na przykład for(i=0,i++,i<10)) porównać kolejne elementy tablic
-jeżeli nadal będziesz miał z tym problem, to po 19.00 wrzucę działający kod (-: (-: .

Pozdrawiam


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 11:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 mar 2012
Posty: 72
Pomógł: 5

Może to nie jest przyczyną Twoich problemów ale:

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


lepiej zapisać to 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 dlaczego? niebieska "biblia" strona 147 i 148

Edit: Kolega mnie ubiegł.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 11:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 mar 2012
Posty: 72
Pomógł: 5

Oooooo...

( http://pl.wikibooks.org/wiki/C/strcmp )



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 12:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Ok ,poprawiłem troszkę jak zasugerował kolega JanuszT z inicjowaniem tablic, faktycznie 10 to za mało ,niestety dalej nic :( Nie wiem za bardzo jak wcisnąć ten warunek z pętla

FOR ,możesz rozjaśnić troszkę bardziej co masz na myśli. O coś takiego chodziło?


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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 12:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Przecież ta pętla nie wykona się ani razu ('j' nigdy nie jest większe lub równe 12).
Najlepiej użyj funkcji o której pisałem (trzeba dołączyć bibliotekę "string.h"). Oczywiście za pomocą pętli również się da, ale jest to ponowne odkrywanie koła...

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

Można też użyć zmiennej w formie flagi (u Ciebie "status_porownania"), ale w powyższy sposób zachowujesz 1 bajt RAM'u ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 12:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Poprawiłem pętlę for i nic. Spróbowałem sposobu z porównaniem stringów i też bez efektu.

Jedyne co działa poprawnie ,to steroweanie jednym znakiem za pomocą

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


,ale nie o to mi chodzi ,bo tutaj jest string z karty RFID i aż 10 znaków

poniżej kod z strcmp. Też nie działa :(


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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 12:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Spróbuj sobie wysłać zawartość "tab1" przez UART i zobacz co zawiera. Może są to małe litery, a nie duże...
Można użyć "stricmp", która nie rozróżnia wielkości liter.

Nie wiem jak działa funkcja "uart_get_str", ale może czeka na odebranie znaku '\0', którego nigdy nie otrzymuje?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 13:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Teraz mi się przypomniało ,że lekko poprawiłem warunek Case dla przerwania
ISR( USART_RXC_vect ) w bibliotece USART ,dlatego że oryginał miał uciążliwe WARNINGI dotyczące
braku instrukcji break ,podobno można wyłączyć w eclipse ,ale postanowiłem poprawić
warunek mam nadzieję ,że go nie sknociłem?

Nie zamieszczam pliku z wiadomych powodów ,jedynie mój kawałek po zmianach
,każdy kto ma książkę ma możliwość porównać:

Wygląda tak po moich zmianach:

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



Teraz dałeś mi zagłostkę jak wysłać tablicę :)
poprzez funkcję uart_puts() da się ???

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 13:12 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 135
Pomógł: 11

Witam

W tej chwili niezbyt mam dostęp do AVR-a, dlatego kod jest przetestowany na PC.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Statrałem się pisać tak, abyś mógł łatwo przenieść na AVR. Dobrze by było, gdybyś go sibie uruchomił na PC. Przy przenoszeniu na AVR oczywiście dołącz odpowiednie pliki "*.h" i nie używaj funkcji "printf"; ona jest tutaj tylko po to, aby kod (przy uruchamianiu na PC" wyświetlał "ładnie" :D :D przebieg obliczeń. Zmienna "status_chwilowy" nie jest konieczna, można łatwo napisać bez niej, ale tak jest chyba jaśniej. Wieczorem będę miał dostęp do AVR-a, wtedy jeżeli będziesz potrzebował mogę wrzucić "gotowca" :D :D .

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 13:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Aś mnie załatwił ,zwłaszcza tym

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


,nie mam pojęcia jak to przerobić :)


Równie dobrze mogłoby być po chińsku :) ,dzięki za wsparcie ,widzę że masz dużą wiedzę ,ale ja z tej funkcji nie rozumiem za wiele :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 13:30 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 135
Pomógł: 11

Witam

Linie z "printf" po prostu skasuj ;) ;) .
W nawiasach klamrowych obejmujących linię 25 wpisz to, co ma być wykonane, jeżeli tablice są zgodne (czyli jeżeli wczytano właściwy kod).

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 16:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Kolejne 2 godziny ,ale udało mi się wreszcie chyba zrozumieć w czym rzecz ,sama funkcja get_str() jest temu winna ,bo nie zwraca stringa tylko jakiś wskażnik.

Spróbowałem na funkcji uart_get_c() i działa ,ale tylko jedna literka i tablica na niej oparta.

Wiem już ,że porównywanie stringów strcmp jest OK ,dioda pięknie zapala się i gaśnie jak wciskam "s"

Niestety nie przyda mi się funkcja getstr() ,więc muszę oprzeć to na tej z pojedynczym znakiem.

Pytanie jeszcze czy sam bufor cykliczny czegoś nie psuje?

Taka postać działa ,niestety tablica tylko 1 elementowa :(

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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 17:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Działa wpisywanie do tablicy!!! :) ,oraz potem za pomocą przycisku wywołuję po kolei jej zawartość na terminalu ,jedno kliknięcie - jedna litera.

Działa wprowadzanie znaków i odczyt.

Kod poniżej:

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






Niestety nie działa strcmp :( diodka nie mruga po wpisaniu wzorca ,w tym przypadku "togg"

Ale czuję ,że jestem już blisko!!!

Czegoś jeszcze nie zauważam ,ale czego?

------------------------ [ Dodano po: 27 minutach ]

Wybaczcie ,że post pod postem ,ale wreszcie działa jak chciałem!!! ;)

Diodka reaguje na string!!!

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




teraz tylko przerobić na klucz 10 znaków i można się cieszyć własnym "parsowaniem stringu" i zamkiem RFID ,choć muszę to przerobić na coś bardziej czytelnego ,powyrzucam co się da do funkcji ,zobaczymy co z tego wyjdzie. Ważne ,że działa i wiem już jak podchodzić do tych Mirkowych bibliotek ,bo jednak nie są takie złe ;)

Jakby ktoś jeszcze zauważył jakiegoś babola to będę wdzięczny za zwrócenie uwagi.

Teraz biorę się za usprawnienie kodu ,potem wrzucę końcowy :) ,jeszcze raz dziękuję za pomoc wszystkim. Tak naprawdę kręciliśmy się w kółko przez funkcję uart_get_str().

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2014, o 17:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Witam ,na zakończenie tematu obiecny,poprawiony i działający kod ,może się komuś przyda :)

Zmieniłem jedynie bibliotekę USART ,wyrzuciłem to co zbędne zostawiając tylko to co potrzebne w tym programie ,zostawiłem tylko
funkcję get_c() ,załączenie tylko odbiornika ,bufor na 32.
i poprawiłem warunek case w przerwaniu ,by odbierać znak CR , potrzebny u mnie do synchronizacji stringa
wyrzuciłem zmienną asciiline++; Na Mirkowych oryginalnych też działa ,ale po co zajmować tyle flasha ,jak i tak nie korzystamy tutaj
z większości funkcji i nadajnika ,a zwłaszcza buforu na nadajnik.

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







Podziękowania i pochwały dla kolegów Atmel (za pętlę FOR) :) i Janusz T (za zwrócenie uwagi na c-stringa)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2014, o 18:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Widzę że Kolega lubi sobie niesamowicie utrudniać sprawę :shock:

Skoro jednak funkcja "uart_get_str" się nie sprawdziła to warto byłoby znaleźć przyczynę dlaczego tak jest i ewentualnie przystosować ją do swoich zastosowań, a wtedy to już z górki :)

Dla "uart_getc":

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2014, o 18:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Zerowanie tablicy nie jest zbędne. Bo jeśli ciągle będą sobie równe to będzie dioda LED będzie migać za sprawą toggle, chodzi mi by stan zmieniał się przy każdym przyłożeniu karty. Więc po przyrównaniu tablic i wykonaniu toggle bita ,trzeba zmienić jej zawartość ,nie muszą to być akurat zera to fakt ,ale po tej operacji muszą się różnić.


Pobawie się to funkcją get(str) jak znajdę trochę czasu, próbuję też opanować Eventa z Green booka ,jak narazie bezskutecznie. Bardzo zawiły ten kod.

Testowałem swój programik na wiele sposobów i jak według mnie działa bez zarzutu.

Fakt ,gdyby chcieć sterować np. silniczkiem ,komendami "stop " ,"start" ,"lewo" , "prawo" to ten algorytm się nie sprawdzi ze względu na różną długość stringów. Porównywanie też by się rozbudowało i to sporo :)

Ale karta RFID ma stałą długość stringa i wysyła znak CR na końcu ,który w razie czego wszystko zsynchronizuje u mnie i następny string wpisuje sie w tabeli pod adres 0 ,więc nie wydarzy się nic złego.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2014, o 18:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Zerowanie jest zbędne ;), ponieważ wyrażenie warunkowe zawiera dodatkowo porównanie wartości zmiennej 'i' do 11 i jeśli to prawda to późniejsze jej zerowanie, które uniemożliwi wykonywanie tego kodu, aż do otrzymania kolejnej odpowiedniej sekwencji znaków.

Jeśli działa i jesteś zadowolony z efektów to OK :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2014, o 16:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Możesz wyjaśnić isalnum
oraz toupper ,co to jest i co robi?

Ciekawa funkcja memset(tab1, 0, 10);

Brakuje jeszcze #include ,domyślam się że standardowa biblioteka <string.h> ?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2014, o 17:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

"isalnum" sprawdza czy znak podany w parametrze jest znakiem alfanumerycznym (cyfrą lub wielką/małą literą) - http://cpp0x.pl/dokumentacja/standard-C/isalnum/249
Każdy inny znak traktowany jest jako błędny lub niepożądany i jeżeli takowy wystąpi wtedy przerywane jest działanie pętli (odczyt kolejnych bajtów - identyfikatora).

Funkcja "toupper" zamienia małą na dużą literę, pozostawiając bez zmian pozostałe znaki - http://cpp0x.pl/dokumentacja/standard-C/toupper/261
Tutaj służy ujednoliceniu zapisu liczb hexadecymalnych tzn. niezależnie od wysłanej litery (dużej lub małej) i tak do tablicy "tab1" zapisywane są wielkie litery, co ułatwia późniejsze porównanie ze znakami w "tab3".

Zgadza się zapomniałem tego dopisać - należy dołączyć bibliotekę <string.h>.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2014, o 17:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Ok ,dzięki. Na pewno się kiedyś przyda w jakimś projekcie :) ,no i link do stronki z C/C++ też. :)

_________________
sig off ;(



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: 22 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Bing [Bot] i 15 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