Модем зависает во время последовательной связи

StackOverflow https://stackoverflow.com/questions/1113688

  •  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 для управления аппаратным потоком.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top