qt单独创建一个线程进行数据接收,需要完成发送bin文件数据,指定0x2802地址进行发送,发送16字节,进行分段发送
时间: 2024-05-02 22:17:50 浏览: 93
以下是一个示例代码,可以单独创建一个线程进行数据接收,并使用Qt的QSerialPort类发送bin文件数据。本示例将使用0x2802地址进行发送,并将数据分成16字节的块进行发送。
```cpp
#include <QThread>
#include <QFile>
#include <QSerialPort>
class DataReceiver : public QThread
{
Q_OBJECT
public:
DataReceiver(QObject *parent = nullptr) : QThread(parent) {}
void run() override {
// 打开串口
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口号
serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率
serialPort.setDataBits(QSerialPort::Data8); // 设置数据位数
serialPort.setParity(QSerialPort::NoParity); // 设置校验位
serialPort.setStopBits(QSerialPort::OneStop); // 设置停止位
if (!serialPort.open(QIODevice::ReadWrite)) {
emit error(serialPort.errorString());
return;
}
// 打开bin文件
QFile file("data.bin");
if (!file.open(QIODevice::ReadOnly)) {
emit error(file.errorString());
return;
}
// 分段发送数据
const int blockSize = 16; // 每次发送的字节数
while (!file.atEnd()) {
QByteArray data = file.read(blockSize);
if (data.size() < blockSize) { // 不足16个字节时,补0
data.resize(blockSize);
data.fill(0);
}
QByteArray frame;
frame.append(char(0x02)); // SOH
frame.append(char(0x28)); // 地址高字节
frame.append(char(0x02)); // 地址低字节
frame.append(data); // 数据
frame.append(char(0x03)); // EOT
serialPort.write(frame); // 发送数据
serialPort.waitForBytesWritten(-1); // 等待数据发送完成
msleep(100); // 暂停100毫秒
}
// 关闭文件和串口
file.close();
serialPort.close();
}
signals:
void error(const QString &msg);
};
```
该线程可以通过以下方式启动:
```cpp
DataReceiver *receiver = new DataReceiver;
connect(receiver, &DataReceiver::error, this, &MyClass::onError);
receiver->start();
```
其中,onError函数用于处理错误信息:
```cpp
void MyClass::onError(const QString &msg)
{
qDebug() << "Error: " << msg;
}
```
阅读全文