#1 2018-02-11 00:53:04

alex_dol
Участник
Зарегистрирован: 2015-12-28
Сообщений: 177

Как отключить незапрашиваемые уведомления на Sim800?

Модули данной серии шлют незапрашиваемые уведомления (Unsolicited Result Codes), подробно описаны в разделе 19.3 даташита по АТ командам. Иногда они накладываются на ответы на АТ команды - получается каша.
Может кто сталкивался и знает как отучить модуль их слать?

#2 2018-02-11 20:04:31

alex_dol
Участник
Зарегистрирован: 2015-12-28
Сообщений: 177

Re: Как отключить незапрашиваемые уведомления на Sim800?

У меня проблема не в отлавливании интересующего, а в том что иногда незапрашиваемое уведомление встревает перед ответом на посланную ранее АТ команду. Например я посылаю "AT+SAPBR=1,1", для установки GPRS соединения, в ответ должно прийти "ОК" или "ERROR...". А можно получить "SMS READY OK", где "SMS READY" - незапрашиваемое уведомление. Иногда незапрашиваемое уведомление частично сходно с ожидаемым от модуля ответом, вот тут начинается самое интересное...
В общем пошел я писать парсер...

#3 2018-02-12 11:16:59

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,401

Re: Как отключить незапрашиваемые уведомления на Sim800?

[ 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",  	              ""},                 //

Редактировался NoName (2018-02-12 11:50:54)

#4 2018-02-12 14:19:10

alex_dol
Участник
Зарегистрирован: 2015-12-28
Сообщений: 177

Re: Как отключить незапрашиваемые уведомления на Sim800?

Это все я могу, просто не хотелось повторять команду в случае если ответ не подходит под ожидаемый шаблон. Это надо ее в цикл пихать и т.д. Просто это загрузчик - объем ограничен, там есть еще что делать, кроме общения с модемом.

NoName, я с модулем работаю так: отослал команду, очистил входной буфер, в ответ должно прийти, например, 5 символов, ждем прихода 5 символов, пришли - обрабатываем. Причем в момент очистки входного буфера я могу обрезать часть незапрашиваемого уведомления, которое в этот момент приходит, и тогда бывает что вместо ожидаемого приходит х.з. что.

Ладно, это лирика, я уже начал парсер писать.

#5 2018-02-12 14:46:01

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,401

Re: Как отключить незапрашиваемые уведомления на Sim800?

мой опыт подсказывает никогда ничего не чистить во входном буфере )  хотя  грешу таким )
парсер лучше свой написать

есть такой вариант из детства )   с очисткой входного буфера )

//--------------------------------------------------------------------
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);
}

#6 2018-02-12 18:13:56

alex_dol
Участник
Зарегистрирован: 2015-12-28
Сообщений: 177

Re: Как отключить незапрашиваемые уведомления на Sim800?

Что-то подобное я для себя и написал, только я оперирую не "ОК", а циферными кодами и с отключенным эхом (ATE0V0+CMEE=0), удобнее.

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела