我在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中这样做。
任何人都可以帮忙吗???
答案 0 :(得分:2)
您必须始终在特定的给定串行接口上明确启用要侦听的所有不同UR代码。如果您打开了多个串行接口并在其中一个上运行AT+CNMI=2
,则不能认为+CNMI: ...
将出现在运行AT + CNMI命令的任何其他接口上。假如你打开,关闭然后重新打开,就不会记住任何事情。
因此,在上面的代码中,添加一个调用以使用您想要的模式编写AT + CNMI,然后read and parse从模式返回的所有内容,直到获得OK
最终结果代码在继续使用期望接收+CNMI: ...
UR代码的代码之前。 (顺便说一句,你应该使用readLine
而不是readAll
,因为AT命令响应总是应该逐行处理。)