【问题标题】:Modem hangs during serial communication调制解调器在串行通信期间挂起
【发布时间】:2009-07-11 13:12:44
【问题描述】:

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

如果您在处理调制解调器的这种方式中发现了一些明显的错误,如果您能解释一下我做错了什么,我将不胜感激。另一方面,如果一切正常,也许您知道调制解调器为什么会挂起?

提前谢谢你。

【问题讨论】:

    标签: delphi communication modem


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多