【问题标题】:Application crashes when receiving CMTI signal from gsm modem从 gsm 调制解调器接收 CMTI 信号时应用程序崩溃
【发布时间】:2014-03-30 23:10:51
【问题描述】:

我正在使用 Qt creator c++ 和 linux 操作系统,我正在尝试创建读取和发送短信的程序。一切正常,但是当我尝试读取表示收到新消息的 cmti 信号时,它会刹车并且操作系统向我发送 SIGBUS、总线错误。

我的代码很简单:

port->setPortName(s);

bool status = port->open(QSerialPort::ReadWrite); 

if(status)
{
    port->setBaudRate(115200, QSerialPort::AllDirections);
    port->setDataBits(QSerialPort::Data8);
    port->setParity(QSerialPort::NoParity);

    QByteArray in;

    if(port->waitForReadyRead(300)) 
        {
            in = port->readAll();
            while (port->waitForReadyRead(64))
            {
                in += in->readAll();
            }
        }

    //...
}

当调制解调器发送 cmti 并且端口在 port->watiForReadyRead() 中获得该信号时,它给了我错误并且永远不会到达 port->readAll()。此外,当发生此错误时,它会更改调制解调器的 ttyUSB 端口。

我最好的猜测是调制解调器阻止了端口,因此我的应用程序可以读取。在寡妇的c#中,我通过在串口上设置读取超时来解决这个问题,但我不能在qt中这样做。

有人可以帮忙吗???

【问题讨论】:

    标签: qt serial-port at-command


    【解决方案1】:

    您必须始终明确启用您想在特定给定串行接口上​​收听的所有不同 UR 代码。如果您打开了多个串行接口并在其中一个上运行AT+CNMI=2,则您不能假设+CNMI: ... 将出现在运行 AT+CNMI 命令的接口之外的任何其他接口上。假设如果您打开、关闭然后重新打开,则不会记住任何内容。

    因此,在您上面的代码中,添加一个调用以使用您想要的模式编写 AT+CNMI,然后 read and parse 您从调制解调器返回的所有内容,直到您获得 OK 最终结果代码,然后再继续期望收到+CNMI: ... UR 代码的代码。 (顺便说一句,您应该使用 readLine 而不是 readAll,因为 AT 命令响应应始终逐行处理。)

    【讨论】:

    • 感谢指导,设置 AT+CNMI=2,1,0,0,0 有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多