请使用QT帮我写一个多线程持续读取串口数据的并保存的程序,不用写UI部分
时间: 2024-03-05 08:51:07 浏览: 22
好的,下面是一个简单的多线程读取串口数据并保存的程序示例,使用了QT的串口通信库QSerialPort:
```c++
#include <QCoreApplication>
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QFile>
#include <QMutex>
#include <QThread>
// 串口配置信息
const QString SERIAL_PORT_NAME = "COM1"; // 串口名称
const qint32 SERIAL_BAUD_RATE = QSerialPort::Baud9600; // 波特率
const QSerialPort::DataBits SERIAL_DATA_BITS = QSerialPort::Data8; // 数据位
const QSerialPort::Parity SERIAL_PARITY = QSerialPort::NoParity; // 校验位
const QSerialPort::StopBits SERIAL_STOP_BITS = QSerialPort::OneStop; // 停止位
// 保存数据的文件名
const QString DATA_FILE_NAME = "data.txt";
// 读取串口数据的线程
class SerialReadThread : public QThread
{
public:
SerialReadThread(QObject *parent = nullptr) : QThread(parent) {}
void run() override
{
QFile dataFile(DATA_FILE_NAME);
if (!dataFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
{
qDebug() << "Failed to open data file!";
return;
}
QSerialPort serialPort;
serialPort.setPortName(SERIAL_PORT_NAME);
serialPort.setBaudRate(SERIAL_BAUD_RATE);
serialPort.setDataBits(SERIAL_DATA_BITS);
serialPort.setParity(SERIAL_PARITY);
serialPort.setStopBits(SERIAL_STOP_BITS);
if (!serialPort.open(QIODevice::ReadOnly))
{
qDebug() << "Failed to open serial port!";
return;
}
QMutex mutex;
while (!isInterruptionRequested())
{
QByteArray data = serialPort.readAll();
if (!data.isEmpty())
{
mutex.lock();
dataFile.write(data);
mutex.unlock();
}
msleep(1);
}
serialPort.close();
dataFile.close();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 查找可用的串口
QList<QSerialPortInfo> serialPortInfos = QSerialPortInfo::availablePorts();
if (serialPortInfos.empty())
{
qDebug() << "No available serial port!";
return -1;
}
// 输出可用的串口信息
qDebug() << "Available serial ports:";
for (const QSerialPortInfo &serialPortInfo : serialPortInfos)
{
qDebug() << " " << serialPortInfo.portName();
}
// 启动读取线程
SerialReadThread readThread;
readThread.start();
return a.exec();
}
```
在上面的示例中,SerialReadThread 类是一个继承自 QThread 的子类,用于在新的线程中读取串口数据并保存到文件中。在 run() 函数中,首先打开文件,然后打开串口,然后循环读取串口数据并写入文件中,直到线程被请求中断。注意,在写入文件时需要使用 QMutex 进行线程同步,以保证线程安全。
在 main() 函数中,先查找可用的串口列表,然后启动 SerialReadThread 线程进行读取。注意,在退出程序时,需要等待读取线程结束,以免出现文件写入冲突。