UART 到 Qt 软件错误 - 为啥数据总是分裂?

Posted

技术标签:

【中文标题】UART 到 Qt 软件错误 - 为啥数据总是分裂?【英文标题】:UART to Qt software error - why data always split?UART 到 Qt 软件错误 - 为什么数据总是分裂? 【发布时间】:2015-05-22 22:36:11 【问题描述】:

我正在尝试在我的 Qt 应用程序上显示通过 UART 接收的数据。 我一次从我的微控制器发送我的所有数据,但我的 qt 应用程序接收到多个部分,为什么?

这是我得到的:http://imgur.com/kLXRvU5 而不是:http://imgur.com/h2yNZjl

所以每次我收到数据时,我的插槽函数都会被调用,因此是“收到的数据”。但是我的数据分为两部分。请问为什么?

我的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//, mijnAnimatie(new animatie())
  

    serialPort->setPortName("COM13");
        serialPort->setBaudRate(QSerialPort::Baud115200);

       // serialPort->setDataBits(QSerialPort::Data8);
       // serialPort->setParity(QSerialPort::NoParity);
       // serialPort->setStopBits(QSerialPort::OneStop);


        if (!serialPort->open(QIODevice::ReadWrite))
        
         qDebug("some error when opening\n");
        
        connect(serialPort, SIGNAL(readyRead()), this, SLOT(updateReceivedData()));



void MainWindow::updateReceivedData()

    qDebug("received data\n");
    QString m_readData;

    ui->receiveLabel->setText(m_readData);


      QByteArray result = serialPort->readAll();
      QString command(result); //to convert byte array to string
      qDebug()<<result;
      ui->receiveLabel->setText(command);

【问题讨论】:

因为它是数据流,而不是数据包。发送字节需要时间,而且您的接收机器速度非常快,以至于您可能在发送其他字节之前就已经读取了一些字节。您在代码中进行了缓冲,这意味着消息之间的分隔符或在消息数据之前发送消息大小,以便您知道它有多大。 就像我的函数中的一个静态变量,一旦它接收到一个“\n”,它就会分析数据?但这是 C++,所以我不能做 if(result[i]=="\n") break; 之类的事情。什么是正确的方法? ***.com/questions/17703605/qt-qserialport-buffering 您需要使用规范模式来调用行规,例如读取 lines 而不是字节 按照@DarkFalcon 提供的链接。 【参考方案1】:

流连接,如 TCP/IP 或串行端口,为您提供关于如何将数据分割成片段的保证。如果你想要数据包,你必须自己在流连接之上实现它们。

【讨论】:

以上是关于UART 到 Qt 软件错误 - 为啥数据总是分裂?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Qt 样式表 "Foo:hover * " 总是适用?

为啥 UART w/DMA 只接收发送数据的最后一个字节?

为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?

为啥服务器访问总是出现500错误?

fedora10系统里,安了qt creator,想用qt自带的qt库。在tools_>options里配置qmake的时候,为啥总是叉

uart接收和发送数据