Ви не увійшли.
Что-то подобное я для себя и написал, только я оперирую не "ОК", а циферными кодами и с отключенным эхом (ATE0V0+CMEE=0), удобнее.
мой опыт подсказывает никогда ничего не чистить во входном буфере ) хотя грешу таким )
парсер лучше свой написать
есть такой вариант из детства ) с очисткой входного буфера )
//--------------------------------------------------------------------
TFunctionStatus SearchSTR_USER( char* STR )
{
int foo;
int ok;
int len_original;
len_original = strlen_my(STR);
ok = 0;
for ( foo = 0; foo < RXBuffSize; foo++ )
{
if ( MODEM.RXBuffer[foo] == STR[ok] ) ok++;
else ok = 0;
if ( ok == len_original )
return ( OK );
}
return (ERR);
}
TFunctionStatus Analize_Modem_incoming_data ( void )
{
SystemCore.Event &= ~BitMask_ModemAnswer;
//------------------------------------------
if ( SearchSTR_USER("RING") == OK )
{ // incomming Call
SEND_AT_COMMAND ("ATA");
}
else if ( SearchSTR_USER( "NO CARRIER") == OK )
{
SET_Status_Modem( Close_Gate_mode );
}
#ifdef DEBUG_INFO_DEVPORT
SEND_VT100_STRING ("Incomming data");
SEND_VT100_STRING ((char*)MODEM.RXBuffer);
#endif
//------------------------------------------
crear_buffer_modem_RX();
return (OK);
}
Это все я могу, просто не хотелось повторять команду в случае если ответ не подходит под ожидаемый шаблон. Это надо ее в цикл пихать и т.д. Просто это загрузчик - объем ограничен, там есть еще что делать, кроме общения с модемом.
NoName, я с модулем работаю так: отослал команду, очистил входной буфер, в ответ должно прийти, например, 5 символов, ждем прихода 5 символов, пришли - обрабатываем. Причем в момент очистки входного буфера я могу обрезать часть незапрашиваемого уведомления, которое в этот момент приходит, и тогда бывает что вместо ожидаемого приходит х.з. что.
Ладно, это лирика, я уже начал парсер писать.
[ add ] пример на решение Вячеслава Азарова
alex_dol, я для таких вещей на каждую комманду устанавливаю свое время ожидания и 2 допустимых ответа. корректный ответ -
дальше, ошибка - на обработку. любой иной - игнор
в примере ожидание только корректного ответа )
SAT_Command AT_Search_Init_Modem[] =
{
{ Default , NO_WAIT_Anser ,WaitAT_Answer, "ATE0", ""}, //
{ Default , NO_WAIT_Anser ,WaitAT_Answer, "ATE0Q0", "OK"}, //
{ Default , NO_WAIT_Anser ,WaitAT_Answer, "AT+IFC=0,0", "OK"}, //
{ Default , Default ,WaitAT_Answer, "AT&C0", "OK"}, //
{ Default , Default ,WaitAT_Answer, "AT", "OK"}, //
{ Default , Default ,WaitAT_Answer, "ATS0=0", "OK"}, //
{ Default , Default ,WaitAT_Answer, "AT", "OK"}, //
{ Default , Default ,WaitAT_Answer, "AT&D0", "OK"}, //
{ Default , NO_WAIT_Anser ,WaitAT_Answer, "AT&S1", "OK"}, //
{ Default , NO_WAIT_Anser ,WaitAT_Answer, "AT\\Q0", "OK"}, //
{ Default , NO_WAIT_Anser ,WaitAT_Answer, "AT+CBST=71,0,1", "OK"}, //
{ SWITCH_1, SWITCH_1 ,WaitAT_Answer, "AT+IPR=9600", "OK"}, //
{ Default, Default ,WaitAT_Answer, "AT", "OK"}, //
{ END, Default ,WaitAT_Answer, "END", ""}, //
У меня проблема не в отлавливании интересующего, а в том что иногда незапрашиваемое уведомление встревает перед ответом на посланную ранее АТ команду. Например я посылаю "AT+SAPBR=1,1", для установки GPRS соединения, в ответ должно прийти "ОК" или "ERROR...". А можно получить "SMS READY OK", где "SMS READY" - незапрашиваемое уведомление. Иногда незапрашиваемое уведомление частично сходно с ожидаемым от модуля ответом, вот тут начинается самое интересное...
В общем пошел я писать парсер...
Модули данной серии шлют незапрашиваемые уведомления (Unsolicited Result Codes), подробно описаны в разделе 19.3 даташита по АТ командам. Иногда они накладываются на ответы на АТ команды - получается каша.
Может кто сталкивался и знает как отучить модуль их слать?