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



Teraz jest 28 gru 2024, o 22:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 29 kwi 2014, o 21:26 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 8
Pomógł: 0

Witam,

Zająłem się obsługą uart-a z lekcji biblioteki od Mirka z zielonego Booka.

Mam mały problem nie chodzi o komunikacje po RS nie ma żadnego problemu.

Problem który minie nurtuje to to że gdy wysyłam komendę AT do układu:
wysłany ciąg znaków >> otrzymana odpowiedź
AT >> OK
A >> OK
AT+L >> AT+LED = (0-1)
AT+LED >> AT+LED = (0-1)
itd.

Jak widać mimo podania nie pełnej komendy otrzymujemy poprawną odpowiedź. Co zauważyłem w przypadku nie pełnej komendy to to że wybierana jest pierwsza z zgodnym ciągiem znaków. I nie ma losowości, jeśli podamy tylko A to odpowie jako AT, a jeśli podamy AT+ to zostanie zrestartowane urządzenie. Zgodnie z poniższą tablicą

Kod:
      {"AT",       at_service},
      {"ATI",    ati_service},
      {"AT+RST",    at_rst_service},
      {"AT+IR",    at_ir_service},
      {"AT+LED",    at_led_service},
      {"AT+LCD",    at_lcd_service},


Jeśli pozmieniamy kolejność pozycji to wybierze pierwszą komendę pokrywając się.

Rozwiązanie jakie znalazłem żeby rozpoznawał pełne nazwy a nie po części.

Oryginalna część kodu z Blue Booka
Kod:
      else {
         for(i=0;i<AT_CNT;i++) {
            if ( 0 == strncasecmp_P(pBuf, polecenia_at[i].polecenie_at, strlen(pBuf)) ) {
               if( pgm_read_word(polecenia_at[i].polecenie_at) ) { // <--- UWAGA! w tekście książki zabrakło pgm_read_word()
                  _at_srv = (void *)pgm_read_word( &polecenia_at[i].at_service );
                  if( _at_srv) _at_srv(2,0);
               }
               break;
            }
         }
      }


Po moich zmianach

Kod:
      else {
         for(i=0;i<AT_CNT;i++) {
            if ( strlen(pBuf) == strlen(polecenia_at[i].polecenie_at) ){
               if ( 0 == strncasecmp_P(pBuf, polecenia_at[i].polecenie_at, strlen(pBuf)) ) {
                  if( pgm_read_word(polecenia_at[i].polecenie_at) ) { // <--- UWAGA! w tekście książki zabrakło pgm_read_word()
                     _at_srv = (void *)pgm_read_word( &polecenia_at[i].at_service );
                     if( _at_srv) _at_srv(2,0);
                  }
                  break;
               }
            }
         }
      }


Po pętli for wstawiłem dodatkowego if-a takie obejście robocze.

Ma ktoś pomysł jak to rozwiązać bardziej efektywniej.

Nie podaje pełnego kody gdyż nie jestem jej autorem. Autorem kodu jest Mirosław Kardaś.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 kwi 2014, o 21:32 
Offline
Moderator
Avatar użytkownika

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

No dokładnie trzeba to już sobie jakoś dopracować - ja chciałem przede wszystkim pokazać ideę jak parsować a nie wnikać w super mega szczegóły nie wiadomo jak optymalnego kodu i sprawdzającego WSZYSTKIE możliwe sytuacje ... jak widać akurat nie sprawdziłem tego że zareaguje na nie pełne komendy ;)

ty na szybko wymyśliłeś to:

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


i dobrze ale też może być kłopot jeśli będą np dwa takie polecenia

AT+LED
AT+LEM

prawda ? ;) ... bo w obydwu przypadkach zareaguje na AT+L ale tylko jedno z nich się wykona - to pierwsze .... trzeba nieco inaczej rozwiązać samo porównanie stringów i będzie po zawodach - a super optymalnością się nie przejmować bo to nie jakaś czasówka gdzie każda nanosekunda się liczy ;) ważne aby działało

_________________
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 2014, o 08:31 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 8
Pomógł: 0

Przepraszam kod pochodzi Green Book-a, a nie z Blue Book-a.

Chyba troszeczkę już przysypiałem.

Jeszcze nie testowałem w przypadku komend z parametrami, ale na to przyjdzie czas po "krótkim" weekendzie majowym.

Tak po za tym życzę słonecznego weekendy wszystkim forumowiczom. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 maja 2014, o 20:24 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 8
Pomógł: 0

Dokonałem modyfikacji procedury Mirka36 (mirekk36), żeby nie łapała skróconych nazw rozkazów wysyłanych przez uarta.

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

którego zadanie jest porównanie wprowadzonej komendy z wzorcem co do długości.
Nawet jeśli komendy są bardzo podobne
mirekk36 napisał(a):
i dobrze ale też może być kłopot jeśli będą np dwa takie polecenia

AT+LED
AT+LEM

to i tak wybierze właściwą to którą wprowadzimy.

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


Z drugiej strony jeśli chodzi o optymalizację w przypadku różne długości komendy to procedura nie będzie spowalniać, lecz nawet będzie szybciej wykonywana. Gdyż na początku sprawdzamy długość komendy i wzorca.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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