开发平台:Qt 6.3
编译环境:MinGW 11.2.0 64bit
源码免费下载方式在文末!部分功能参照源码学习使用!
一、继承QSerialPort类创建子类Serial(serial.h)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32#ifndef SERIAL_H #define SERIAL_H #include <QObject> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QStringList> #include <QString> #include <QByteArray> class Serial : public QSerialPort { Q_OBJECT public: explicit Serial(); // 数据缓存区 QByteArray dataBuf; // 串口描述内容 QStringList serialDescription; // 串口扫描函数 QStringList serialScan(void); bool serialOpen(QString serialName, int baudRate); void ReadData(); void sendData(QByteArray sendData); void serialClose(); signals: void readSignal(void); public slots: }; #endif // SERIAL_H
二、实现串口打开,扫描,关闭和读写函数(serial.cpp)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#include "serial.h" #include <QDebug> Serial::Serial() { } QStringList Serial::serialScan(void) { QStringList serialPortList; serialDescription.clear(); // 每次扫描先清除串口描述信息 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { this->setPort(info); serialPortList.append(this->portName()); serialDescription.append(info.description()); //qDebug() << this->portName(); //qDebug() << info.description(); } return serialPortList; } bool Serial::serialOpen(QString serialName, int baudRate) { this->setPortName(serialName); if(this->open(QIODeviceBase::ReadWrite)) { this->setBaudRate(baudRate); this->setDataBits(QSerialPort::Data8); this->setParity(QSerialPort::NoParity); this->setStopBits(QSerialPort::OneStop); this->setFlowControl(QSerialPort::NoFlowControl); // 下位机发送数据会响应这个槽函数 connect(this, &QSerialPort::readyRead, this, &Serial::ReadData); // 下位机发送数据会触发这个信号 connect(this, &QSerialPort::readyRead, this, &Serial::readSignal); return true; } return false; } // 读数据 void Serial::ReadData() { dataBuf = this->readAll(); } // 写数据 void Serial::sendData(QByteArray sendData) { this->write(sendData); } // 关闭串口 void Serial::serialClose() { this->clear(); this->close(); }
三、创建windows事件过滤类,重写QAbstractNativeEventFilter类下的虚函数(SerialEvent.h)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68#ifndef SERIALEVENT_H #define SERIALEVENT_H #include <QObject> #include <QAbstractNativeEventFilter> #include <QDebug> #include <windows.h> #include <dbt.h> class SerialEvent : public QObject, public QAbstractNativeEventFilter { Q_OBJECT public: bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) { (void)result; if(eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG") { MSG* msg = reinterpret_cast<MSG*>(message); int msgType = msg->message; if(msgType == WM_DEVICECHANGE) { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam; switch (msg->wParam) { case DBT_DEVICEARRIVAL: // qDebug() << "DBT_DEVICEARRIVAL:" << lpdb->dbch_devicetype; if(lpdb->dbch_devicetype == DBT_DEVTYP_PORT) { PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb; QString portName = QString::fromWCharArray(lpdbv->dbcp_name); // qDebug() << "device arrival:" << portName; emit comDevArriaval(portName); } break; case DBT_DEVICEREMOVECOMPLETE: // qDebug() << "DBT_DEVICEREMOVECOMPLETE:" << lpdb->dbch_devicetype; if(lpdb->dbch_devicetype == DBT_DEVTYP_PORT) { PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb; QString portName = QString::fromWCharArray(lpdbv->dbcp_name); // qDebug() << "device remove complete:" << portName; emit comDevRemoveComplete(portName); } break; case DBT_DEVNODES_CHANGED: break; default: break; } } } return false; } signals: // 串口插入了 void comDevArriaval(QString devName); //串口拔掉了 void comDevRemoveComplete(QString devName); }; #endif // SERIALEVENT_H
四、 在应用程序中注册 a.installNativeEventFilter(w.mySerialEvent);并连接信号与处理函数(Widget.cpp)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25// 串口插入处理 connect(mySerialEvent, &SerialEvent::comDevArriaval, this , [=](){ ui->serial_port_C->clear(); serialNameList = serial_main->serialScan(); ui->serial_port_C->addItems(serialNameList); }); // 串口拔出处理 connect(mySerialEvent, &SerialEvent::comDevRemoveComplete, this , [=](QString devName){ // 打开串口时串口变化 如果处于打开状态的端口被拔出则重置串口状态 if(!serial_ONOFF_P_flag) { if(ui->serial_port_C->currentText() == devName) { ui->serial_ONOFF_P->setText("打开串口"); ui->serial_ONOFF_L->setPixmap(QPixmap(":/IMG/OFF.png")); serial_ONOFF_P_flag = true; serial_main->close(); this->setComboboxStatus(false); QMessageBox::warning(this, "串口连接错误", "<font size="4">当前串口已关闭</font>"); } } ui->serial_port_C->clear(); // 清空串口复选框 serialNameList = serial_main->serialScan(); // 扫描串口 ui->serial_port_C->addItems(serialNameList); // 添加串口名 });
界面仍采用的32位版本界面!
64位版本源码下载地址:https://download.csdn.net/download/m0_50669075/85234856
32位版本源码下载地址:(102条消息) 使用Qt5UI设计开发的串口助手多功能工具源码文件和安装包_qt串口程序-QT文档类资源-CSDN文库
END
最后
以上就是爱笑蜜蜂最近收集整理的关于Qt6串口多功能助手64位版本上位机源码的全部内容,更多相关Qt6串口多功能助手64位版本上位机源码内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复