Цитата(zebrox @ Nov 22 2010, 17:02)

А как Вы получаете данные с сима?
При разборе ответом от модема поступаю таким образом:
1. модем отвечает эхом на команду - это можно детектировать как начало ответа
2. ответ на команду содержит специфические сообщения которые можно использовать как признак завершения ответа.
3. любая команда имеет ограниченный таймаут ответа оговоренный в документации
Пример команды AT+CREG?\r\n, таймаут ответа по докам - мгновенно (т.к. не связано с запросами в сеть) - реально даю 1 секунду
AT+CREG?\r\n CMD
AT+CREG\r\n ANS
\r\n
+CREG: 0,1\r\n
\r\n
OK\r\n
Ответ на команду начинается с эха, далее идёт ключевое слово +CREG и завершается команда OK.
В итоге чтобы найти ответ на команду достаточно выловить +CREG и OK в ответе.
Другие команды имеют больше вариантов ответов.
Для приёма ответов от модема у меня есть специальный буффер и задача которая выбирает символы из fifo uarta отвечающего за работу с модемом. Задача не анализирует сам ответ а только следит за тем тем чтобы таймаут с последнего принятого символа превышал определённое время (напр. 50 мС). Как только превысится это время вызывается задача которая послала ат-команду в модем а сам буффер переходит в режим ожидания. Если задача пославшая ат-команду нашла все ответы которые ожидала она переводит буффер в ждущий режим что даёт возможность другим задачам получить доступ к модему. Если ответ не найден то буффер переводится в режим ожидания данных - т.е. пытаемся дополучить ответ от модема на конкретную команду. И так до тех пор пока не получим полный ответ или не выйдет максимальный таймаут ожидания.
Сообщение отредактировал mempfis_ - Nov 23 2010, 15:58