Модем зависает при последовательной связи - PullRequest
0 голосов
/ 11 июля 2009

У меня есть Wavecom Supreme GSM модем. Я написал простое приложение, которое связывается с модемом и читает текстовые сообщения, которые он получает.

Мое приложение запрашивает у модема информацию о количестве сообщений, которые оно хранит в своей памяти, и, если число превышает 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-команды и жду ответа модема. Я не использую никакого контроля потока. Все, что я делаю, - это ожидаю события связи, читаю данные из очереди последовательного порта, когда модем отвечает, и записываю несколько AT-команд, за которыми следует символ # 13, чтобы запросить у модема сообщения.

Я думаю, что я, возможно, неправильно установил структуру DCB, поскольку, как вы можете видеть, я не изменяю некоторые из его полей. Поскольку моих знаний о последовательном порту недостаточно, я не знаю, как настроить управление RTS и DTR (включено / отключено / рукопожатие / переключение).

Если вы заметили некоторые очевидные ошибки в этом способе работы с модемом, я был бы признателен, если бы вы объяснили мне, что я сделал неправильно. Если все в порядке, с другой стороны, может быть, у вас есть идея, почему модем зависает?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 июля 2009

Убедитесь, что управление потоком в диспетчере устройств, модем и программа настроены одинаково. Я не знаю Delphi, но я думаю, что в DCB должно быть поле «Флаги». Попробуйте установить его равным 24 для аппаратного управления потоком.

1 голос
/ 11 июля 2009

Обычно настройки DCB - это первое, что вы должны проверить. В документации модема должны быть указаны настройки последовательного порта. Если вы не ищете в Интернете номер модели вашего модема.

...