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

时间:2015-11-27 19:50:44

标签: 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,与我设定的相匹配。忽略这段代码的原始性,有谁知道为什么会截断这样的数据?我已经被困在这几天,现在尝试不同的事情,我真的很想过去。提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用QSerialPort::readAll()它只是读取串口上可用的内容(有时不是整个输出字符串),我以前处理它的方式是读取所有数据进入QString缓冲区,然后当行结束字符(\n\r)在缓冲区中时使用split('\n')来获取实际的数据行。