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 * " 总是适用?
为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?
fedora10系统里,安了qt creator,想用qt自带的qt库。在tools_>options里配置qmake的时候,为啥总是叉