Parsowanie komend AT

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
danielos
Newb
Newb
Posty: 69
Rejestracja: sobota 02 sty 2016, 15:06
Lokalizacja: Pawłowice, Silesia.
Kontaktowanie:

Re: Parsowanie komend AT

Postautor: danielos » niedziela 20 mar 2016, 17:21

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)
Można wszystko osiągnąć, wystarczy chcieć.

Awatar użytkownika
Federerer
Posty: 9
Rejestracja: wtorek 15 gru 2015, 21:43

Re: Parsowanie komend AT

Postautor: Federerer » wtorek 22 mar 2016, 23:18

spróbuj zamiast strncasecmp użyć strcasecmp (jesli masz):
https://en.wikibooks.org/wiki/C_Programming/C_Reference/nonstandard/strcasecmp

Awatar użytkownika
acid3
User
User
Posty: 466
Rejestracja: czwartek 03 wrz 2015, 22:42
Lokalizacja: Kłopoty-Stanisławy
Kontaktowanie:

Re: Parsowanie komend AT

Postautor: acid3 » czwartek 24 mar 2016, 07:45

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.


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości