qtserialport:Readall不会产生所有数据,没有新的readyread信号
-
21-12-2019 - |
题
我正在从USB串口读取,但有时我有问题,那个数据被“卡住”。 在收到的消息上,我发送新消息并再次等待答案。
我在Windows 7上使用Qt 5.2.1在异步模式下用QtSerialPort。过了一会儿,我的程序被困,因为我无限期地等待答案。 (这是一种瞬态虫子,但如果你走得足够长,它会发生。 使用调试器,我能够看到我只接收了消息的片段。在进一步调查中,我可以看到QSerialPort在其“ReadChunkBuffer”中具有整个消息。
这是我的“readyread”处理程序:
void ModuleCommunicator::onReadyRead()
{
if (port->bytesAvailable() > 0) {
QString msg = QString(port->readAll());
msgBuffer->append(msg);
//qDebug() << "onReadyRead: msg: " << msg;
if (msg.endsWith("\n")) {
msg = msgBuffer->join("").trimmed();
msgBuffer->clear();
msgBuffer->append(msg.split("\r\n"));
} else {
return;
}
for (int i = 0; i < msgBuffer->size(); i++) {
msg = msgBuffer->at(i);
qDebug() << "MSG: " << msg << endl;
if (isResponse(msg)) {
handleMsg(msg);
}
}
msgBuffer->clear();
}
}
.
我也尝试了“while(port-> bytesavailiable()”。但是我只看到msgbuffer中的一部分消息,但整个一个在qserialports缓冲区中。不确定qserialport何时发出信号,并且当它实际上看到整个时消息。
也许这也是一些Windows驱动程序缓冲区问题?我困扰着我的是,如果我杀了我的申请并启动腻子并发送换行符,我得到了剩下的消息。 请注意,这可能不是我的串行通信“合作伙伴”,BC的问题。它通过Putty等工作,我可以在“ReadChunkBuffer”中看到MSG。
解决方案 2
结果是软件通过串行端口通信的嵌入式设备软件中的错误。:/
其他提示
问题可以在代码中的某个地方。因为readyRead()不能保证您会立即收到整个信息;消息可以通过以下readyRead()呼叫零件来源。
我也紧张:
QString msg = QString(port->readAll());
msgBuffer->append(msg);
.
为什么要从qbytearray转换为qstring,然后qtring到qbytearray两次?
您可以为qdebug()提供调试输出:
void ModuleCommunicator::onReadyRead()
{
...
QByteArray ba = port.readAll();
qDebug() << ba;
...
}
.
当你“卡住”?
不隶属于 StackOverflow