从gsm调制解调器接收CMTI信号时应用程序崩溃

时间:2014-03-28 13:41:38

标签: qt serial-port at-command

我在Qt creator c ++和linux os工作,我正在尝试创建读取和发送短信的程序。一切正常,但是当我尝试读取发出新消息的cmti信号时,它会刹车并且os发给我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中这样做。

任何人都可以帮忙吗???

1 个答案:

答案 0 :(得分:2)

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

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