"Czekanie na enter" nie jest najszczęsliwszym rozwiązaniem. Standard hayesa definiuje 3 standardowe wzorce odpowiedzi:
1) [cr][lf][wyrazenie][cr][lf]
2) [cr][lf][wyrazenie]=[wartosc](,[wartosc],[wartosc],...)[cr][lf]OK[cr][lf]
3) [cr][lf][wyrazenie]=[wartosc](,[wartosc],[wartosc],...)[cr][lf][plaintext][cr][lf]OK[cr][lf]
W przypadku URC:
1) [cr][lf][wyrazenie[cr][lf]
2) [cr][lf][wyrazenie]=[wartosc](,[wartosc],[wartosc],...)[cr][lf]
3) [cr][lf][wyrazenie]=[wartosc](,[wartosc],[wartosc],...)[cr][lf][plaintext][cr][lf]
Roznica miedzy URC a responsem, to ten wlasnie OK, ktory idzie w responsie, a w URC juz nie. Sam response moze byc rowniez 'zaskakujacy', czyli zamiast tresciwej odpowiedzi dostajemy chamski ERROR. I na to trzeba się przygotować, np. próbując ręcznie zarejestrować modem w roamingowej sieci, albo wykonać attach GPRS jak nie ma zasiegu GPRS ;] Magiczny ERROR może przyjść zawsze...
Pod kategorię 1 podpadają wyrazenia typu OK, ERROR
Pod kategorię 2 podpadają wyrazenia z parametrem, typu +CGATT=1
Pod kategorię 3 podpadają wyrażenia transportujące plaintext, np. SMSy (niezaleznie od tego, czy PDU, czy ASCII), jak +CBM=[costam],[costam],...[cr][lf]ToJestTekstBroadcastMessage[cr][lf]
Co do dwóch niezależnych automatów - zgodzę się, i chyba nie ma innej sensownej drogi na około. Jednak do parsera bym sie przyczepił ;] Ja robię to tak:
- mam tablice kojarzącą wyrazenie z handlerem
Zaloguj się, aby zobaczyć kod
Nastepnie tablica:
Zaloguj się, aby zobaczyć kod
Parser jest 3etapowy:
1) wycinanie danych z fifo do liniowego bufora miedzy dwoma [cr][lf]
2) po otrzymaniu tego drugiego [cr][lf] odpala sie preparser ktory za pomoca xorowania całych 32bitowych slow (taki moj patent

) porownuje ciagi znakow i szuka handlera w exprTable
3) nastepnie odpala się handler podajac mu jako argument index w fifo bezposrednio za znakiem '=' (o ile on istnieje).
Zrobiłem tak, gdyż w moim przypadku aplikacja wymaga w miarę płynnej konwersacji z modemem i faktyczną reakcję na to, co on odpowiada. Np. URC na utrate połączenia GPRS powoduje lawinowe wstrzymanie 2 wątków, a trzeci (supervisor modemu) najpierw robi deattach GPRS, potem pyta o zasięg, obecność karty SIM, itp itd, i w zaleznosci od odpowiedzi na te pytania podejmuje odpowiednie akcje; czyli jak wystąpił zonk karty SIM, to modem dostaje cykl zasilania, i wykonuje się jego rozbiegówka.
Dlatego mam parser który interpretuje argumenty response'a osobno - zamiast czekać na "+CPIN=READY", a jak przyjdzie coś innego niż "READY" to zonk, i nie wiemy co to jest; to dynamicznie rozpatruję to, co zwraca CPIN...
BTW, bazując na URC +CMT mozna bez odpytywania w kółko, odbierać esemesy prost po UARTcie - wystarczy ustawić:
Zaloguj się, aby zobaczyć kod