У меня есть 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 (включено / отключено / рукопожатие / переключение).
Если вы заметили некоторые очевидные ошибки в этом способе работы с модемом, я был бы признателен, если бы вы объяснили мне, что я сделал неправильно. Если все в порядке, с другой стороны, может быть, у вас есть идея, почему модем зависает?
Заранее спасибо.