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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 15 lip 2025, o 01:25


    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: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    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ł: Brak zidentyfikowanych użytkowników i 3 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO