реклама на сайте
подробности

 
 
> Обработка ответов от модема SIM900
Pavel V.
сообщение Jan 24 2012, 09:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Всем доброго времени суток!

Начал разбираться с модемом SIM900 и сейчас нахожусь на стадии написания кода для обмена данными. Интересует, как с технической точки зрения правильно организовать анализ данных, поступающих от модема.

Если бы работа с модемом велась только в формате запрос-ответ, проблем нет - отправил команду, подождал ответ, разобрал его и пошел дальше. Но часть команд приходит асинхронно (звонок, смс и т.п.). Получается, необходимо организовать непрерывный прием и разбор принимаемых данных?

Существует ли где-то перечень команд, которые модем может отправлять по собственной инициативе?

Или может быть их можно игнорировать, пользуясь только линией RI?

Как у вас организовано общение с модемом? Хотя бы в общих словах.

Спасибо!


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=F8=
сообщение Jan 24 2012, 12:43
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Очень просто. Примерно так-же как описал megajohn только с маленькой поправкой. В потоке который читает порт обрабатываем только необходимые незапрашиваемые коды и стандартные ответы, для обработки ответов спецефических для консретной команды добавляем указатель на функцию обработчик. В итого получаем примерно так:
Код
void *p_data = NULL;
void (*p_func)(char*, void*) = NULL;
BOOL buffer[BUFFER_SIZE+1];


void Parcer(char *buff)
{
   if(strcmp(buf, "OK")==0){....}
   else if(strcmp(buf, "ERROR")==0){....}
   else if(strncmp(buf, "+CME ERROR", 10)==0){....}
   ........................................................
  else if(p_func)if(p_func(buf, p_data)) p_func = NULL;//Тут обрабатываем спецефические ответы
}


BOOL csq_cb(char *buf, void *p)
{
  int *res = (int*)p;
  if(strncmp(buf, "+CSQ", 4)
  {//Обрабатываем ответ +CSQ.....
   .....................
   res=xxxx;
   return TRUE;
  }
  return FALSE;
}

int GetCSQ()
{
    int res = -1;
    p_data = &res;
    p_func = csq_cb;
    if(PutCommand("AT+CSQ", 1000)==OK_RES)//Отправляем команду AT+CSQ и ждем ответа OK или ERROR
   {
      p_func = NULL;
      return res;
   }
   p_func = NULL;
   return -1;
}


Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016