我有一个 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 命令并等待调制解调器的响应。我不使用任何流量控制。我所做的一切就是等待 comm 事件,当调制解调器响应时从串行端口的队列中读取数据,然后写一些 AT 命令,后跟 #13 字符来查询调制解调器的消息。
我想我可能没有正确设置 DCB 结构,因为如您所见,我没有修改它的某些字段。因为我对串口的了解不够,所以不知道如何设置RTS和DTR控制(启用/禁用/握手/切换)。
如果您在这种处理调制解调器的方式中发现了一些明显的错误,请您向我解释我做错了什么,我将不胜感激。另一方面,如果一切正常,也许您知道调制解调器为什么会挂起?
先感谢您。