【问题标题】:QT Serial dropping data [duplicate]QT Serial丢弃数据[重复]
【发布时间】:2017-05-19 04:48:18
【问题描述】:

我已经在此处查看了有关此主题的几个问题,但没有任何问题可以为我提供解决方案。

在 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 条。

关于如何更好地处理这个问题有什么建议吗?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

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

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

    【讨论】:

    • 唯一一致的事情之一是接收 \n 字符。我可以看到收到消息的开头和结尾,但中间是字符丢失的地方。我已经尝试过 readAll 和 readLine ,结果相对相同。我知道正在发送完整的消息,我只是没有通过这个串行端口接收它。我的下一条追索权是什么?
    • @bauervision 这是一个重要的信息:它属于问题本身。您需要让我们相信您确实只收到了部分信息:例如使用qDebug() &lt;&lt; line.toHex();,其中行来自readLine。也许您没有使用流量控制并且您在某处超出了缓冲区。最有可能的是,您需要展示一个演示问题的最小代码示例。
    • Baudrate = 38400, DataBits = 8, No Parity,One Stop, No Flow Control 这些是管理员给我的设置,不确定我最终更改它是否重要,或者如果它会断开连接。只是对这些东西还不够了解。
    • 感谢@KubaOber,我没有意识到 readAll 的阅读速度很慢是我的问题,因此没有偶然发现建议帖子的标题。使用您建议的 while(canReadLine) 肯定会有所帮助。我现在收到干净的消息 > 80% 的时间,这比我早几年。仍然不是 100% 的时间,但目前这是可行的。截至目前,串口代码仍在主窗口中。您认为将其从小部件中移出会在剩下的过程中清理它吗?
    • 当然。关注点分离等等。将所有通信代码移动到一个通信控制器中,该控制器通过信号/插槽与代码的其他部分进行通信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2017-12-02
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多