调制解调器在串行通信期间挂起

时间:2009-07-11 13:12:44

标签: delphi communication modem

我有一个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控制(启用/禁用/握手/切换)。

如果你注意到这种处理调制解调器的方式有一些明显的错误,如果你向我解释我做错了什么,我将不胜感激。如果一切都很好,另一方面,也许你已经知道调制解调器挂起的原因了吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

通常,DCB设置是您应该验证的第一件事。调制解调器文档应该提到串行端口设置。如果没有使用调制解调器的型号在线搜索。

答案 1 :(得分:1)

确保设备管理器,调制解调器和程序中的流量控制都设置相同。我不知道Delphi,但我认为DCB应该有一个“Flags”字段。尝试将其设置为24以进行硬件流控制。