响应USB接口为串口类型的拔插事件
项目场景:
做了一个解析USB接口的GPS接收机报文的插件,界面如下:
由于,插件只有在整个软件打开时才会初始化,中途不会析构,那么使用过程中如果,GPS接收机拔出再插入另一接口,所有功能将失效,因为端口为自动解析的,并且是在初始化时,获取所有可用串口,如果想功能正常必须重启软件,肯定影响使用。
问题描述
基于项目背景,需要寻找一个响应USB接口拔插的事件。
解决方案:
直接在Widget类里使用nativeEvent方法即可。
GPSPositionWidget.h文件如下:
#ifndef GPSPositionWidget_H
#define GPSPositionWidget_H#include <QWidget>QT_BEGIN_NAMESPACEnamespace Ui {class CGPSPositionWidget;}
QT_END_NAMESPACEclass CGPSPositionWidget
{Q_OBJECTpublic:CGPSPositionWidget(QWidget *parent = 0);~CGPSPositionWidget();public:/*** @fn Initialize * @brief 初始化窗体* @param * @return */void Initialize();protected:bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;//监控Windows系统事件(硬件热插拔);private:Ui::CGPSPositionWidget* ui;QSerialPort *m_pserial;
};#endif // GPSPositionWidget_H
GPSPositionWidget.cpp如下:
#include "GPSPositionWidget.h"
#include "ui_GPSPositionWidget.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include "qdebug.h"
#include <windows.h>
#include "dbt.h"CGPSPositionWidget::CGPSPositionWidget(QWidget *parent): CustomWidget(parent), m_pserial(NULL), m_bIsShowPoint(false), m_bIsSaveTra(false), m_pGPSMapEventHandler(nullptr)
{ui = new Ui::CGPSPositionWidget();ui->setupUi(panel);setTitle(ConvertCharArrayToQString("GPS定位"));Initialize();
}CGPSPositionWidget::~CGPSPositionWidget()
{delete ui;ui = nullptr;
}void CGPSPositionWidget::Initialize()
{ui->portComboBox->clear();ui->baudComboBox->clear();ui->dataBitsComboBox->clear();ui->stopBitsComboBox->clear();ui->parityComboBox->clear();ui->flowControlComboBox->clear();ui->modeComboBox->clear();//状态栏清空ui->statusLabel->clear();//获取计算机上所有可用串口并添加到comBox中QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();if(infos.isEmpty()){ui->portComboBox->addItem(ConvertCharArrayToQString("无串口"));return;}else{m_pserial = new QSerialPort;}foreach (QSerialPortInfo info, infos) {ui->portComboBox->addItem(info.portName());qDebug() << info.portName();}//设置三种波特率QStringList strBaud;strBaud<<ConvertCharArrayToQString("4800")<<ConvertCharArrayToQString("9600")<<ConvertCharArrayToQString("115200");ui->baudComboBox->addItems(strBaud);ui->baudComboBox->setCurrentIndex(1);//设置四种数据位QStringList strData;strData<<ConvertCharArrayToQString("5")<<ConvertCharArrayToQString("6")<<ConvertCharArrayToQString("7")<<ConvertCharArrayToQString("8");ui->dataBitsComboBox->addItems(strData);ui->dataBitsComboBox->setCurrentIndex(3);//设置三种停止位QStringList strStop;strStop<<ConvertCharArrayToQString("1")<<ConvertCharArrayToQString("1.5")<<ConvertCharArrayToQString("2");ui->stopBitsComboBox->addItems(strStop);ui->stopBitsComboBox->setCurrentIndex(0);//设置五种校验位QStringList strParity;strParity<<ConvertCharArrayToQString("None")<<ConvertCharArrayToQString("Odd")<<ConvertCharArrayToQString("Even")<<ConvertCharArrayToQString("Mark")<<ConvertCharArrayToQString("Space");ui->parityComboBox->addItems(strParity);ui->parityComboBox->setCurrentIndex(0);//设置四种流控QStringList strFlowControl;strFlowControl<<ConvertCharArrayToQString("None")<<ConvertCharArrayToQString("Hardware")<<ConvertCharArrayToQString("Software");ui->flowControlComboBox->addItems(strFlowControl);ui->flowControlComboBox->setCurrentIndex(0);//设置三种定位模式QStringList strMode;strMode<<ConvertCharArrayToQString("推荐定位")<<ConvertCharArrayToQString("GPS定位")<<ConvertCharArrayToQString("北斗定位");ui->modeComboBox->addItems(strMode);ui->modeComboBox->setCurrentIndex(0);
}bool CGPSPositionWidget::nativeEvent( const QByteArray &eventType, void *message, long *result )
{MSG* msg = reinterpret_cast<MSG*>(message);if(msg->message == WM_DEVICECHANGE) // 通知应用程序设备或计算机的硬件配置发生更改。{PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;switch (msg->wParam){case DBT_DEVICEARRIVAL: // 插入{if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) // 设备类型为串口{PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb;QString strName = QString::fromWCharArray(lpdbv->dbcp_name); //插入的串口名qDebug() << strName;Initialize();ui->statusLabel->setText(ConvertCharArrayToQString("设备插入!"));}break;}case DBT_DEVICEREMOVECOMPLETE: // 拔出{if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) // 设备类型为串口{PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb;QString strName = QString::fromWCharArray(lpdbv->dbcp_name); //拔出的串口名qDebug() << strName;//如果串口打开的过程中拔出先关闭串口if (m_pserial != NULL){m_pserial->close();}//恢复设置功能ui->switchButton->setText(ConvertCharArrayToQString("打开串口"));Initialize();ui->statusLabel->setText(ConvertCharArrayToQString("设备拔出!"));}break;}default:break;}}return false;
}
注意:使用nativeEvent方法,.cpp文件里必须添加#include <windows.h>,#include "dbt.h"两个头文件。
ConvertCharArrayToQString()自定义格式转换方法。
最终效果如下:
响应USB接口为串口类型的拔插事件相关推荐
- linux u盘插入事件,Linux 下监控USB设备拔插事件
Linux 下监控USB设备拔插事件 发布时间:2018-01-29 00:00, 浏览次数:1111 , 标签: Linux USB * 使用Netlink来实现 这是一个特殊的socket,可以接 ...
- Android耳机拔插事件流程
Android所有的input设备都会在/dev/input目录下生成对应的设备节点,一旦有任何输入事件产生,便会将事件写到这些节点下,同时对于外部输入设备(鼠标键盘等)的插拔还会引起这些节点的创建和 ...
- 8.5.3耳麦拔插事件调用流程分析
目录 回顾 input系统方法 回顾 在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者 ...
- 08.音频系统:第003课_Linux音频驱动程序:第003节_耳麦拔插事件调用流程分析
在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者消除耳麦的图标,这节视频我们讲解耳麦插 ...
- Linux 下监控USB设备拔插事件
使用Netlink来实现 这是一个特殊的socket,可以接受来自内核的消息 代码如下: 运行结果如下: 当有USB设备插入时: 当有USB设备拔出时: 2.使用udev的规则来实现 自2.6 核心开 ...
- USB HID学习:MFC检测USB拔插事件
MFC具备检测设备的消息,但需要手动添加.针对USB设备,需要注册对应的GUID方可.本文对此进行简单记录. 本省略对MFC机制的描述,仅描述主要的模块代码. 一.步骤 Dbt.h头文件引用 在std ...
- 秒懂所有USB接口类型,USB接口大全
请问,有数据线吗? 话说,小编的座位在办公区第一排的位置,对面就是公司最豪华.使用率最高的会议室.高到什么程度呢?就是预定会议室就像抢购火车票一样--提前两天开放预订,晚半分钟都订不到的那种~ 因此, ...
- 秒懂所有USB接口类型,USB接口大全;Type-A、Type-B、Type-C、miniUSB、microUSB区分
我们来聊一聊USB接口.由于USB-IF标准制定命名的混乱,大多数人都搞不清楚USB的各种版本命名,这里我们就好好捋一捋... 一.USB传输标准 自1996年USB-IF(USB Implement ...
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...
最新文章
- pytorch统计矩阵非0的个数_PyTorch常见的12坑
- “新一代城市大脑建设与发展“专家研讨会
- 三维视觉传感器的类型
- SqlServer高级特性--存储过程
- 为多网络请个“交警”
- python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)
- mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间
- mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码
- vue根据数组对象中某个唯一标识去重
- python decorator. decorator_Python中decorator使用实例
- java应用程序多态_java – 多态和n层应用程序
- 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?
- Android系统中用C语言来编写服务程序并且开机自启动运行服务
- 使用gatling做压力测试与负载测试
- HighNewTech:基于人工智能的自动驾驶技术的前世今生之Why、What、How最强分析与总结(包括自动驾驶L5个分级详细标准,非常建议收藏)
- 微信无法直接打开淘宝链接是怎么回事?
- Validation 参数校验
- python数字转unicode_python2.7响应数据中unicode转中文
- 2019天津市二级计算机考试,天津市2019年9月计算机等级考试都有哪些考点可以报名?...
- 阿里云ACP认证 VPC专项练习