Strona 1 z 1

Re: Parsowanie komend AT

: niedziela 20 mar 2016, 17:21
autor: danielos
Dodanie dodatkowego warunku sprawdzającego ilość znaków wpisanej komendy z komendą w pamięci może by rozwiązało problem z AT+.

np.:

Kod: Zaznacz cały

if ( 0 == strncasecmp_P(pBuf, polecenia_at[i].polecenie_at, strlen(pBuf)) && (strlen(pBuf) == strlen(pgm_read_word(polecenia_at[i].polecenie_at) )) {// <--- tutaj jest dodatkowe sprawdzenie ilosci znakow wpisanej komendy z komenda zapisana w pamieci programu
               if( pgm_read_word(polecenia_at[i].at_service)  ) {  //<- tutaj był błąd
                  _at_srv = (void *)pgm_read_word( &polecenia_at[i].at_service );
                  if( _at_srv) _at_srv(2,0);
               }
               break;
            }


możliwe że przy sprawdzeniu ilości znaków w stringu z pamięci programu będzie trzeba zrobić rzutowanie - powyższe piszę z głowy. Jest to modyfikacja w części która wykonuje komendę bez parametrów, czyli w warunku ostatnim.

Dodatkowa w kodzie co podałeś jest błąd

ma być

Kod: Zaznacz cały

pgm_read_word(polecenia_at[i].at_service)
a jest

Kod: Zaznacz cały

pgm_read_word(polecenia_at[i].polecenie_at)

Re: Parsowanie komend AT

: wtorek 22 mar 2016, 23:18
autor: Federerer
spróbuj zamiast strncasecmp użyć strcasecmp (jesli masz):
https://en.wikibooks.org/wiki/C_Programming/C_Reference/nonstandard/strcasecmp

Re: Parsowanie komend AT

: czwartek 24 mar 2016, 07:45
autor: acid3
A więc tak ... Moim zdaniem brakuje tu jeszcze "stopnia" weryfikacji komendy. Funkcja strncasecmp jest fajna ale nie idealna i w pewnych przypadkach "stwierdza" , że obydwa stringi są identyczne, choć tak na prawdę nie są.

Moim pomysłem na rozwiązanie problemu AT+ jest sprawdzenie i porównanie długości komendy (wpisanej do tej z listy dostępnych), a w przypadku AT= sprawdzenie czy po '=' jest ciąg znaków inny niż pusty.

Na początek dodałem zmienną pomocniczą

Kod: Zaznacz cały

int tmp
na początku funkcji

Kod: Zaznacz cały

void parse_uart_data


Następnie w sekcji : // ustawienia układu w postaci: AT+CMD=parametry
po sprawdzeniu długości

Kod: Zaznacz cały

cmd_wsk

dodałem funkcję porównującą:

Kod: Zaznacz cały

tmp = strcmp ( "", reszta );

i rozszerzyłem warunek

Kod: Zaznacz cały

 if ( len && 0 == strncasecmp_P(cmd_wsk, polecenia_at[i].polecenie_at, len) )
o

Kod: Zaznacz cały

tmp != 0 &&


i obsługa komendy AT= wydaję się być teraz obsłużona prawidłowo. :)

W dalszej części funkcji parse, w sekcji : // obsługa poleceń AT bez parametrów
w pętli zwiększającej numer komendy w strukturze :

Kod: Zaznacz cały

for(i=0;i<AT_CNT;i++) {

dodałem

Kod: Zaznacz cały

tmp = strncasecmp( command_at[i].command_at, pBuf, strlen(pBuf));
jednocześnie usuwając komendę strncasecmp z warunku IF. Wynikiem tej funkcji jest przybranie przez zmienną tmp wartości 0,1,2. Zero oznacza, że stringi są identyczne i niestety dla tego przypadku(AT+) takową wartość ta funkcja zwraca.
W związku z tym sprawdzamy czy nazwa funkcji znajdująca się w pBuf jest takiej samej długości jak ta w strukturze.

Kod: Zaznacz cały

if ( strlen(pBuf) != strlen( command_at[i].command_at ) ) tmp = 1;

i jeśli nie jest takiej samej długości to dla zmiennej tmp podstawiamy wartość różną od 0, ja wstawiłem 1.

No i wspomniany wcześniej warunek IF teraz wygląda tak :

Kod: Zaznacz cały

if ( 0 == tmp ) {


Jak na razie rozwiązuje to opisany problem i pewnie "niechcący" zabezpiecza przed innymi , nieznalezionymi jeszcze bugami.