最近,我一直致力于通过串行连接(USB 电缆)将数据从 Arduino Micro 发送到我的计算机,我正在尝试使用 QSerialPort 访问它,以便我可以实时绘制数据图表。虽然大部分数据行都很好,但当我使用 readLine() 或 readAll() 读取它们时,有些数据被截断,导致数据丢失。这是一个问题,因为当我实时绘制两个变量时,它无法读取第二个变量,我的图形结果会受到影响。此外,丢失的数据随后会被添加到后面的数据行中,这会使一切变得更加困惑。需要明确的是,Arduino 正在正常发送数据,因为使用串行监视器显示所有数据行都是完整的。
这是一个从 Micro 读取数据并将其输出到文件的程序的主要部分(这也是获取数据错误,并且是一个更清晰的程序来发现错误的原因)。
#include "mainwindow.h"
#include <QApplication>
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QString>
#include <QMessageBox>
#include <QFile>
QT_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSerialPortInfo info("COM6");
// Check info of the port
qDebug() << "Name : " << info.portName();
qDebug() << "Manufacturer: " << info.manufacturer();
qDebug() << "Busy: " << info.isBusy() << endl;
// Initialize Serial
QSerialPort serial;
serial.setPortName("COM6");
serial.open(QIODevice::ReadWrite);
serial.setBaudRate(QSerialPort::Baud9600);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
QFile file("C:\\Users\\Keenan\\Documents\\serialTest\\arduinoData.txt");//open file
if(!file.exists())
{
qDebug()<<"File Doesn't Exist";
}
if (!file.open(QIODevice::WriteOnly|QIODevice::Text))
{
QMessageBox::information(0, "error", file.errorString());
};
QTextStream stream(&file);
while (serial.isOpen())
{
serial.waitForReadyRead(-1);
QString data;
data = serial.readAll();
qDebug() << "Data has been found: " << data <<endl;
stream << data << endl;
}
file.close();
qDebug() << "Done" << endl;
return a.exec();
}
这是每 2 秒发送一次的 Arduino 注释代码(我用常量值替换了变量以使错误更清楚):
Serial.print("1");
Serial.print(",");
Serial.print("2");
Serial.print(",");
Serial.print("3");
Serial.print(",");
Serial.print("4");
Serial.print(",");
Serial.println("5");
当我运行程序时,这是我读入我的文本文件的内容:
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1
,2,3,4,5
1
,2,3,4,5
1,
2,3,4,5
1,2,
3,4,5
1,2,3,
4,5
1,2,3,4
,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
如您所见,1,2,3,4,5 在最后搞砸了,但最终由于未知原因自行修复。 Arduino 的波特率是 9600,这与我设置的相符。忽略这段代码的原始性,有谁知道为什么它会这样截断数据?几天来我一直坚持这个尝试不同的事情,我真的很想克服这个问题。提前致谢。
最佳答案
使用 QSerialPort::readAll()
它只是读取串行端口上可用的任何内容,有时不会是整个输出字符串,我之前处理它的方式是读取所有将数据放入 QString
缓冲区,然后当行结束字符(\n
或 \r
)位于缓冲区中时使用 split ('\n')
获取实际的数据行。
关于qt - 通过 QSerialPort 访问来自 Arduino 的串行数据时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964012/