项目场景:

做了一个解析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接口为串口类型的拔插事件相关推荐

  1. linux u盘插入事件,Linux 下监控USB设备拔插事件

    Linux 下监控USB设备拔插事件 发布时间:2018-01-29 00:00, 浏览次数:1111 , 标签: Linux USB * 使用Netlink来实现 这是一个特殊的socket,可以接 ...

  2. Android耳机拔插事件流程

    Android所有的input设备都会在/dev/input目录下生成对应的设备节点,一旦有任何输入事件产生,便会将事件写到这些节点下,同时对于外部输入设备(鼠标键盘等)的插拔还会引起这些节点的创建和 ...

  3. 8.5.3耳麦拔插事件调用流程分析

    目录 回顾 input系统方法 回顾 在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者 ...

  4. 08.音频系统:第003课_Linux音频驱动程序:第003节_耳麦拔插事件调用流程分析

    在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者消除耳麦的图标,这节视频我们讲解耳麦插 ...

  5. Linux 下监控USB设备拔插事件

    使用Netlink来实现 这是一个特殊的socket,可以接受来自内核的消息 代码如下: 运行结果如下: 当有USB设备插入时: 当有USB设备拔出时: 2.使用udev的规则来实现 自2.6 核心开 ...

  6. USB HID学习:MFC检测USB拔插事件

    MFC具备检测设备的消息,但需要手动添加.针对USB设备,需要注册对应的GUID方可.本文对此进行简单记录. 本省略对MFC机制的描述,仅描述主要的模块代码. 一.步骤 Dbt.h头文件引用 在std ...

  7. 秒懂所有USB接口类型,USB接口大全

    请问,有数据线吗? 话说,小编的座位在办公区第一排的位置,对面就是公司最豪华.使用率最高的会议室.高到什么程度呢?就是预定会议室就像抢购火车票一样--提前两天开放预订,晚半分钟都订不到的那种~ 因此, ...

  8. 秒懂所有USB接口类型,USB接口大全;Type-A、Type-B、Type-C、miniUSB、microUSB区分

    我们来聊一聊USB接口.由于USB-IF标准制定命名的混乱,大多数人都搞不清楚USB的各种版本命名,这里我们就好好捋一捋... 一.USB传输标准 自1996年USB-IF(USB Implement ...

  9. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

最新文章

  1. pytorch统计矩阵非0的个数_PyTorch常见的12坑
  2. “新一代城市大脑建设与发展“专家研讨会
  3. 三维视觉传感器的类型
  4. SqlServer高级特性--存储过程
  5. 为多网络请个“交警”
  6. python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)
  7. mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间
  8. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码
  9. vue根据数组对象中某个唯一标识去重
  10. python decorator. decorator_Python中decorator使用实例
  11. java应用程序多态_java – 多态和n层应用程序
  12. 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?
  13. Android系统中用C语言来编写服务程序并且开机自启动运行服务
  14. 使用gatling做压力测试与负载测试
  15. HighNewTech:基于人工智能的自动驾驶技术的前世今生之Why、What、How最强分析与总结(包括自动驾驶L5个分级详细标准,非常建议收藏)
  16. 微信无法直接打开淘宝链接是怎么回事?
  17. Validation 参数校验
  18. python数字转unicode_python2.7响应数据中unicode转中文
  19. 2019天津市二级计算机考试,天津市2019年9月计算机等级考试都有哪些考点可以报名?...
  20. 阿里云ACP认证 VPC专项练习

热门文章

  1. 3.每天一个java小程序之累加累乘
  2. WAF网页应用防火墙详解(设计思路-防御恶意文件上传实例-厂商防御技术-Imperva WAF部分特色功能了解)
  3. VISIO画UML时,框图锁定保护不能调整大小
  4. 【网页设计】收入支出表
  5. 搜索引擎优化:常用的SEO六个指标
  6. 黑马量价启动副图指标 开始拉升出信号 超精致买入预警 通达信 源码分享
  7. redis过期策略与淘汰策略
  8. CGAL 3D Demo展示
  9. 运算放大器的datasheet参数介绍
  10. 计算机毕业设计-基于微信小程序的大学生心理预约咨询系统-心理测试小程序