Модем зависает во время последовательной связи
-
12-09-2019 - |
Вопрос
У меня есть GSM-модем Wavecom Supreme.Я написал простое приложение, которое взаимодействует с модемом и считывает текстовые сообщения, которые он получает.
Мое приложение запрашивает у модема информацию о количестве сообщений, которые он хранит в своей памяти, и если это число больше 0, оно считывает сообщения, удаляя их из памяти модема.Я запрашиваю модем таким образом каждые несколько секунд.
Однако, к сожалению, модем зависает каждые несколько минут и не отвечает ни на какие AT-команды, которые я ему отправляю.Единственное решение, которое я придумал, чтобы разблокировать связь, - это закрыть последовательный порт и открыть его заново.Затем все в порядке в течение следующих нескольких минут, после чего последовательный порт должен быть снова открыт, когда модем зависает.
Конечно, это может быть ошибка модема, но мне интересно, подходит ли мне способ общения с ним.
Прежде всего, я открываю последовательный порт модема для асинхронных операций.Затем я установил структуру DCB следующим образом:
GetCommState(PortHandle, DCB);
DCB.BaudRate := 115200;
DCB.ByteSize := 8;
DCB.Parity := NOPARITY;
DCB.StopBits := ONESTOPBIT;
DCB.EvtChar := #13;
SetCommState(PortHandle, DCB);
SetCommMask(PortHandle, EV_RXFLAG);
//the modem does not respond without setting these:
EscapeCommFunction(PortHandle, SETDTR);
EscapeCommFunction(PortHandle, SETRTS);
И тогда все, что я делаю, это отправляю AT-команды и жду ответа модема.Я не использую никакого управления потоком.Все, что я делаю, это жду события comm, считываю данные из очереди последовательного порта, когда модем отвечает, и пишу несколько AT-команд, за которыми следует символ # 13, чтобы запросить у модема сообщения.
Я думаю, что, возможно, я неправильно настроил структуру DCB, поскольку, как вы можете видеть, я не изменяю некоторые из его полей.Поскольку моих знаний о последовательном порту недостаточно, я не знаю, как настроить управление RTS и DTR (включено / отключено / рукопожатие / переключение).
Если вы заметили какие-то очевидные ошибки в этом способе обращения с модемом, я был бы признателен, если бы вы объяснили мне, что я сделал не так.С другой стороны, если все в порядке, может быть, у вас есть идея, почему зависает модем?
Заранее благодарю вас.
Решение
Обычно настройки DCB - это первое, что вы должны проверить.В документации к модему должны быть указаны настройки последовательного порта.Если нет, поищите в Интернете номер модели вашего модема.
Другие советы
Убедитесь, что управление потоком в диспетчере устройств, модеме и программе настроено одинаково.Я не знаю Delphi, но я думаю, что в DCB должно быть поле "Flags".Попробуйте установить его на 24 для управления аппаратным потоком.