【问题标题】:How to read data using QSerialPort to write to a file using QFile?如何使用 QSerialPort 读取数据以使用 QFile 写入文件?
【发布时间】:2016-08-22 19:29:57
【问题描述】:

C++ 和 Qt 的新手,我正在尝试使用微控制器通过串行方式发送大量数据(由整数和逗号组成)以放入 .csv 文件中以在 Excel 中使用。到目前为止,我的 mainwindow.cpp 代码(我已将所有操作用于测试目的):

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <string>
#include <QtSerialPort/QSerialPort>
#include <QString>
#include <QTextEdit>
#include <QFile>
#include <QTextStream>

QSerialPort *serial;
using namespace std;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    serial = new QSerialPort(this);
    serial->setPortName("/dev/cu.usbmodemfa131");
    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    serial->open(QIODevice::ReadWrite);
    connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));

}

MainWindow::~MainWindow()
{
    delete ui;
    serial->close();
}

void MainWindow::serialReceived()
{
    QString filename = "/Users/me/Documents/myFile/datacollecting.csv";
    QFile file(filename);
    QTextStream out(&file);
    file.open(QIODevice::ReadWrite);
    QByteArray ba;
    ba = serial->readAll();
    out << ba;
    file.close();
}

然而,代码给了我一些问题。它根本不能可靠地工作,并且在生成的文件中它只存储最后 10 个左右(几千个)字符。我已经四处搜索,但没有找到一种通过串行方式正确存储大块数据的方法。有没有更好的方法来实现我上面想要做的事情?对此新手,任何帮助将不胜感激!

【问题讨论】:

  • 首先,REMOVE return 0 from SLOT int MainWindow::serialReceived()
  • 感谢您的评论,刚刚编辑了将serialReceived更改为无效的问题。
  • 您不想用QIODevice::ReadWrite|QIODevice::Append 追加到文件,而不是用QIODevice::ReadWrite 截断现有文件stackoverflow.com/a/13856845/487892

标签: c++ qt serial-port


【解决方案1】:

正如已经在 cmets 中编写的那样,您应该通过添加 QIODevice::Append 标志以追加模式打开输出文件,以便将所有数据写入文件末尾。

您还可以连接到error 信号,在那里您可以检查可能的错误。查看串口枚举here

connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(handleError(QSerialPort::SerialPortError)));

void MainWindow::handleError(QSerialPort::SerialPortError error)
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-05
    • 2013-06-12
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多