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ś.