qt - 通过 QSerialPort 访问来自 Arduino 的串行数据时遇到问题

标签 qt

最近,我一直致力于通过串行连接(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/

相关文章:

c++ - 从 C++ 中的多个线程调用 Qt 中小部件类的信号函数是否安全?

qt - 如何在 Qt Creator src 中获取和移动 EditorManager 的父窗口?

python - PyQT 中显示 QDialog 后执行代码的惯用方法是什么?

c++ - 从表单的小部件收集值

c++ - 通过远程桌面运行 qt creator

macos - 在 Mac 上构建 openCV 3.0.0 时出错

c++ - 将 JSON 文件添加到插件 qmake 项目

c++ - 初始化类 - 未解析的外部符号

c++ - 如何使用 QtCreator 将内部库添加到构建中

python - 如何在 Tornado 中通过 websocket 传输 .png 或 .jpg 文件