Добрый день.
Есть несколько вопросов относительно правильной последовательности при общении AT командами с SIM800R?
1. В SIM800R была передана AT команда, но на неё нет ответа или пришел ошибочный (битый) ответ. Что делать по истечению определённого таймаута? Какое это должно быть время (хотя бы для команд независимых от сети)?
Предполагаю, что если нет ответа, то необходимо послать эту команду ещё раз, например через 1..5 секунд. Но этот метод не эффективный, т.к. на самом деле модуль задумывается (это уже выяснили почему) и даёт ответ потом на две команды подряд. Например:
Код
AT // Проверка связи и ждём 2 секунды ответа
AT // ответа нет, истёк таймаут, посылаю ещё раз
OK // ответа на 1-ую команду AT
AT+CBC // Запрос напряжения АКБ, т.к. я получил OK на предыдущую команду
OK // ответа на 2-ую команду AT [b]!!! Тут происходит коллизия[/b]
+CBC: 0,92,4136 // Ответ напряжения АКБ
OK // Ответ OK для запроса напряжения АКБ
В данном примере коллизию можно обойти т.к. я жду конкретный ответ для обработки +CBC
Но вот вариант с вклиниванием передачи данных, например по BT, смещает мой обработчик. Можно дописать ещё различных условий, но не считай, что так работать правильно.
Код
AT // Проверка связи и ждём 2 секунды ответа
AT // ответа нет, истёк таймаут, посылаю ещё раз
OK // ответа на 1-ую команду AT
+BTSPPDATA: 1,16,SIMCOMSPPFORAPP // Пришли данные по BT
AT+CBC // Запрос напряжения АКБ, т.к. я получил OK на предыдущую команду
OK // ответа на 2-ую команду AT [b]!!! Тут происходит коллизия[/b]
AT+BTSPPSEND=1,11 // Запрос на передачу по BT, т.к. я получил OK на предыдущую команду
+CBC: 0,92,4136 // Ответ напряжения АКБ
OK // Ответ OK для запроса напряжения АКБ
> SPP APP OK // Передаю по BT, т.к. я получил OK на предыдущую команду
SEND OK // Подтверждение передачи
2. Другой вариант - установить таймаут ожидания где-то 60 секунд, на любую команду (независимую от оператора) и если нет ответа, перегружать модуль.
Подскажите, кто как делал и какие есть рекомендации от производителя?