none
АТ-команды, COM-порт RRS feed

  • Вопрос

  • Здравствуйте!

    Общаюсь с GSM/GPRS модемом (ПМ01) через RS-485 (COM-порт). Проблема заключается в том, что модем в произвольный момент может написать в COM-порт какое-нибудь уведомление: входящее СМС, звонок и пр.

    Я уже сломал себе весь мозг, каким способом можно написать "прямую" логику общения на АТ-командах. Если бы модем писал в порт только ответы на заданные ему команды/запросы, то все было бы очень просто. Однако, вместе с ответами известного формата бывает приходит всякий "мусор". 

    Дополнительная трудность заключается в том, что ответ (как и запрос) может пройти по каналу связи лишь частично. Что происходит в этом случае? Ведь обмен по COM-порту, на сколько мне известно, это обмен без обратной связи, это не TCP/IP какой-нибудь.

    В принципе, я сейчас написал элементарную логику: запрос / прием строгого ответа. Все работает. Но работает на честном слове.
    Если после моего запроса, скажем на чтение СМС из памяти, модем вместе с отчетом выдаст какое-нибудь асинхронное уведомление (RING или +CMTI:), то поведение программы будет непредсказуемым.

    Подскажите, как решить мою проблему. Или хотя бы в каком направлении копать. Я пишу на С++, поэтому программные возможности позволяют сделать практически любую "вертуху". Но вертуху делать не хотелось бы, не хотелось бы на каждый чих парсить пришедшие данные, прогоняя их через сотни и тысячи логических блоков.

    Есть ли какое-нибудь проверенное и надежное решение?

    Я пытался найти способ отключить незапрашиваемые уведомления. Все. Отчет о входящих СМС (SMS-DELIVER) отключит удалось. Но помимо уведомления о входящих СМс есть еще куча других уведомлений, тот же RING.
    • Изменено MGNeo 6 октября 2017 г. 12:52 Дополнил
    6 октября 2017 г. 12:49

Ответы

  • Обмен по COM порту может быть совершенно любым, в том числе и вариантом TCP/IP (например PPP). Но вы ведь не передачей данных занимайтесь, так что это не важно.

    В вашем случае скорее всего нужн будет конечный автомат который будет передвавать команду и переходить в режим ожидания конкретного ответа фильтруя все лишнее. Если ответа нет то переход по таймауту в состояние ошибки с последующим сбросом.

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


    This posting is provided "AS IS" with no warranties, and confers no rights.

    6 октября 2017 г. 23:20
    Модератор

Все ответы

  • Обмен по COM порту может быть совершенно любым, в том числе и вариантом TCP/IP (например PPP). Но вы ведь не передачей данных занимайтесь, так что это не важно.

    В вашем случае скорее всего нужн будет конечный автомат который будет передвавать команду и переходить в режим ожидания конкретного ответа фильтруя все лишнее. Если ответа нет то переход по таймауту в состояние ошибки с последующим сбросом.

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


    This posting is provided "AS IS" with no warranties, and confers no rights.

    6 октября 2017 г. 23:20
    Модератор
  • То есть, если я правильно понял, нет способа отключить незапрашиваемые уведомления? 
    Я все надеялся, что имеется какая-то команда или серия команд. Незапрашиваемых уведомлений довольно много, поэтому нет никакого тривиального способа построить логический автомат разбора ответного сообщения модема, потому что многие ответы состоят из нескольких строк, между которыми может вставиться одно из множества уведомлений, причем их может вставиться и несколько в том числе.

    9 октября 2017 г. 4:04
  • Чего не знаю того не знаю. Про отключение спрашивайте в форумах производителя конкретного устройства. Я исходил из того что нельзя.

    Конечно есть способ, на то он и конечный автомат (state machine). Если какой то ответ состоит из нескольких частей то он просто будет иметь больше состояний ожидая каждую из этих частей в отдельном состоянии. Ну а другие сообщения будут отбрасываться. Он, конечно, не совсем тривиален, но в то же время ничего особо сложного в конечных автоматах нет.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    9 октября 2017 г. 15:41
    Модератор