2017-01-04 95 views
0

我已经在这里看过关于这个主题的几个问题,但没有提供给我一个解决方案。QT串行丢弃数据

通过VM测试,我有传入的数据,长度为47,80或31个字符。

串口的readyRead连接:

void MainWindow::readData(){ 
    QString buf; 
    myByteArray = serial->readAll(); 
    for(int i = 0; i < myByteArray.size(); ++i){ 
     if(myByteArray.at(i) == '\n'){ 
      buf.append(myByteArray.at(i)); 
      qDebug() << buf << endl; 
      buf.clear(); 
     else{ 
      buf.append(myByteArray.at(i)); 
     } 

我知道,每一个消息,一个结尾为“\ r \ n”,所以我们使用它作为一个点来结束当前的消息。

我遇到的问题是,我可能每隔50分钟就会收到一封干净的信息。它会左右拖放字符。我有一个文本文件显示消息是通过串口发送的,所以我可以比较接收到的消息,并且它很糟糕。

我试过readLine()以及其他线程中的其他一些建议,它总是相同的结果。

我的想法是检查收到的信息是否与我期望的长度一致,47,80或31个字符,然后忽略那些不匹配的信息。这个问题是,我会每隔2分钟收到一封实际的清洁邮件....也许。

如果我将所得到的数据转储出来,结果实际上与缓冲数据时没有什么不同。

我遇到的另一个问题是我收到的每封邮件,我完全想念约3-4。

有关如何更好地处理此问题的任何建议?

回答

1

readAll返回当前可用的任何东西。无法保证所有数据都已收到。我的猜测是,当你打电话时,你的数据仍在传输中。

您需要阅读数据直到您收到\r\n

根据您的需要,您可能会发现readLine更易于使用。

+0

唯一一致的是\ n字符的接收。我可以看到邮件的开头是收到的,最后,但是中间是字符丢失的地方。 我已经尝试了readAll和readLine,它的结果相对相同。 我知道完整的消息正在发送,我只是没有通过这个串口收到它。 我的下一线追索权是什么? – bauervision

+0

@bauervision这是一个重要的信息:它属于问题本身。您需要说服我们确实只接收部分消息:例如使用'qDebug()<< line.toHex();',其中行来自'readLine'。也许你没有使用流量控制,并且你在某个地方超出了缓冲区。最有可能的是,你需要展示一个演示问题的最小代码示例。 –

+0

波特率= 38400,数据位= 8,无奇偶校验,一站式,无流量控制 这些是从管理员给予我的设置,不确定是否在我的末端更改它会很重要,或者它会断开连接。只是还不够了解这个东西。 – bauervision