# UsbComm
这是一个使用Qt框架开发的USB应用层通信组件,内部对libusb的常用api接口进行了二次封装,方便开发使用。主要实现了两大功能:++与usb设备端进行通信数据传输(UsbComm)++ 和 ++负责对usb设备热插拔监测(UsbMonitor)++。
注:在项目的3rdparty目录下提供了libusb-1.0的头文件和库,这里是我用的Ubuntu16.04平台通过"apt install libusb-1.0-0-dev"命令安装,版本是1.0.20,对于不同的平台和环境只需要替换头文件和库即可。
## 功能概述
UsbComm组件目前由三个类组成:`UsbComm`、`UsbMonitor`和`UsbEventHandler`,为了方便移植,三个类统一声明/定义在usbcomm.h和usbcomm.cpp中。
### 1.UsbComm
USB通信主类,该类主要实现与usb设备端的通信数据传输。内部按需封装libusb的方法接口,并维护着当前打开的设备句柄列表和声明的接口列表,所以对于设备句柄和接口的相关操作尽量都使用该类的方法处理,不要在外边单独使用原生libusb接口,避免造成内部维护的列表失效而产生异常。
```
void findUsbDevices();//探测系统当前接入的usb设备,打印设备详细信息(调试用)
/*设备初始化*/
bool openUsbDevice(QMultiMap<quint16,quint16> &vpidMap);//打开指定设备(可能有多个)
void closeUsbDevice(libusb_device_handle *deviceHandle);//关闭指定设备
void closeAllUsbDevice();//关闭所有设备
bool setUsbConfig(libusb_device_handle *deviceHandle,int bConfigurationValue=1);//激活usb设备当前配置
bool claimUsbInterface(libusb_device_handle *deviceHandle,int interfaceNumber);//声明usb设备的接口
void releaseUsbInterface(libusb_device_handle *deviceHandle,int interfaceNumber);//释放usb设备声明的接口
bool setUsbInterfaceAltSetting(libusb_device_handle *deviceHandle,int interfaceNumber,int bAlternateSetting);//激活usb设备接口备用设置
bool resetUsbDevice(libusb_device_handle *deviceHandle);//重置usb设备
/*数据传输*/
int bulkTransfer(libusb_device_handle *deviceHandle,quint8 endpoint, quint8 *data,
int length, quint32 timeout);//(批量(块)传输)
/*设备查询*/
int getOpenedDeviceCount(){return deviceHandleList.size();}//获取当前打开的设备数量
/*该类中所有方法的函参(libusb_device_handle *deviceHandle)必须通过以下getDeviceHandleFrom*方法获取*/
libusb_device_handle *getDeviceHandleFromIndex(int index);//通过索引获取打开的设备句柄
libusb_device_handle *getDeviceHandleFromVpidAndPort(quint16 vid,quint16 pid,qint16 port);//通过vpid和端口号获取打开的设备句柄
```
### 2.UsbMonitor
USB热插拔监测类,该类可以用来定义成"全局"(有较长的生命周期)对象,实现对指定的usb设备进行热插拔监测。
```
//注册热插拔监测服务
bool registerHotplugMonitorService(int deviceClass=LIBUSB_HOTPLUG_MATCH_ANY,
int vendorId=LIBUSB_HOTPLUG_MATCH_ANY,
int productId=LIBUSB_HOTPLUG_MATCH_ANY);
//注销热插拔监测服务
void deregisterHotplugMonitorService();
signals:
void deviceHotplugSig(bool isAttached);//设备插拔信号
```
### 3.UsbEventHandler
USB事件处理类,该类继承自QThread,重写run()方法,在子线程中轮询处理挂起的事件(主要是USB设备的热插拔事件),进而触发热插拔的回调函数。目前该类单纯是配合UsbMonitor的热插拔监测接口使用,相关处理已经封装在接口内,其他地方无需使用。
## 小结
该组件的设计初衷是为了实现在嵌入式Linux平台连接USB热敏打印机打印小票的需求。因为使用的打印机不提供Linux系统的驱动,而Linux系统通用usblp驱动跟设备不匹配,所以最终只能使用libusb这种'免驱'设计,在应用层直接与usb设备建立通信,使用ESC/POS指令控制打印机。为了日后能够应对其他USB设备的通信,故将usb通信部分单独提取出来封装成该组件,方便使用。
而之后又遇到一个与USB接口相机通信取图的需求,所以在原来组件的基础上进行了一些修改,将热插拔监测功能从UsbComm中分离出去,单独成类。而UsbComm只负责通信数据传输,内部维护设备句柄列表,实现对多个设备(包括相同vpid的设备)的访问。
## 参考资料
1. [libusb官网](https://libusb.info/)
2. [libusb源代码(Github)](https://github.com/libusb/libusb)
3. [libusb源代码(Sourceforge)](https://sourceforge.net/projects/libusb/)
4. [libusb-1.0-api接口文档](http://libusb.sourceforge.net/api-1.0/)
5. [巨人的肩膀之QtUsb](https://github.com/fpoussin/QtUsb)
6. [巨人的肩膀之QUSB](https://github.com/bimetek/QUSB)
## 作者联系方式
**邮箱:[email protected]**
**新浪微博:@为-何-而来**
使用Qt框架开发的USB应用层通信组件,内部对libusb的常用api接口进行了二次封装.zip
需积分: 0 159 浏览量
更新于2023-12-27
收藏 74KB ZIP 举报
在本文中,我们将深入探讨如何使用Qt框架开发一个USB应用层通信组件,特别是涉及对libusb库的常用API接口进行二次封装的过程。我们理解Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,提供了丰富的图形用户界面(GUI)工具和功能。
Qt框架的强大之处在于它的模块化设计,允许开发者根据项目需求选择特定的功能模块。在这个USB通信组件中,我们可以利用Qt的事件驱动模型和线程管理来实现与USB设备的高效交互。同时,Qt的信号和槽机制使得代码结构更加清晰,便于维护和扩展。
libusb是一个开源的库,它为开发者提供了底层USB通信的API,支持多种操作系统。这个组件的核心就是将libusb的复杂接口包装成更易于理解和使用的Qt对象和方法。常见的libusb API接口如`libusb_init()`, `libusb_open()`, `libusb_claim_interface()`, `libusb_bulk_transfer()`等,都需要被适配到Qt的编程风格中。
在二次封装的过程中,我们可以创建一个`UsbDevice`类来代表USB设备,其中包含初始化、打开、关闭设备,以及发送和接收数据的方法。例如,`init()`方法对应libusb_init(), `openDevice()`对应libusb_open(), `claimInterface()`对应libusb_claim_interface(),而`bulkTransfer()`则用于执行批量传输,封装了libusb_bulk_transfer()。
为了提高代码的可读性和可维护性,我们可以在Qt的信号和槽机制下设计事件驱动的通信流程。例如,当数据传输完成时,可以发射一个信号通知上层应用,然后由应用层处理接收到的数据。这使得USB通信逻辑与UI更新逻辑分离,遵循了软件设计的单一职责原则。
在实际开发中,还需要考虑错误处理和异常安全。libusb的API通常会返回错误代码,这些错误需要被适当地转化为Qt的异常,通过抛出异常的方式告知调用者。此外,由于USB操作可能涉及到多线程环境,因此要确保线程安全,避免数据竞争和死锁。
除了基本的USB通信功能,还可以扩展此组件以支持设备枚举、设备描述符解析、设备状态监控等功能。例如,可以创建一个`UsbHub`类来管理多个连接的USB设备,并提供枚举和查找特定设备的接口。
这个基于Qt和libusb的USB应用层通信组件是一个实用的工具,它简化了USB设备的访问和管理,使得在Qt应用程序中实现与USB设备的通信变得更加便捷。通过合理地封装libusb API,开发者能够专注于上层业务逻辑,而不必关心底层通信细节,提高了开发效率和代码质量。

白话Learning
- 粉丝: 4775
最新资源
- 花店业务全流程信息化管理系统_集客户管理_订单管理_花材管理_员工管理_基础数据设置于一体的综合性解决方案_包含来电日志登记_客户资料维护_订单录入查询_花材库存管理_员工考勤考核.zip
- 基于瑞芯微RK3588芯片的智能电站巡检机器人系统_融合视觉感知与自主平衡控制的电站巡检解决方案_用于提升电站巡检效率与智能化水平_采用ROS2机器人操作系统_集成深度学习模型检测.zip
- 面向对象软件设计模式学习与实践项目_包含23种GOF设计模式详解及代码示例_工厂模式_单例模式_建造者模式_原型模式_适配器模式_桥接模式_组合模式_装饰器模式_外观模式_享元模式.zip
- wuhao9714_LinuxKernel_29388_1755583692235.zip
- 医疗器械销售全流程智能管理系统_医疗器械销售管理_采购管理_验收入库管理_销售出库管理_退货管理_库存管理_有效期提醒_过期产品锁定_供商资质管理_首营企业管理_首营产品管理_采购.zip
- ThinkPHP51长期支持版PHP框架_基于容器管理和Facade设计模式的高性能MVC开发框架_支持注解路由和跨域请求的轻量级企业级解决方案_提供独立配置目录和二级配置体系_.zip
- 基于敏捷超级个体实践框架的需求分析与规划MCP工具_提供结构化工作流程和引导式对话模板_集成产品愿景画布和用户故事模板_包含业务目标获取到迭代计划制定的完整流程_内置核心提问清单和.zip
- 电费管理系统-阶梯年收费_山东省天津市上海市年累计电量分档电价核算电费_电力收费管理软件_基本信息管理_抄表收费管理_历史数据查询_用电统计分析_基础设置_台区管理_用户管理_.zip
- 家电售后维修全流程管理信息系统_家电维修工单派工配件库存财务管理客户回访_用于家电维修企业实现从客户报修到工单派发维修反馈配件采购库存管理财务结算的全流程数字化管理_基于宏达数据库.zip
- 擦鞋修鞋店铺全流程智能管理系统_专业版_基于宏达数据库信息管理开发平台_包含基础信息管理_员工考勤管理_会员密码消费管理_库存产品管理_消费记录查询_考勤记录查询_入库出库查询_当.zip
- 基于最优剪枝深度优先搜索算法的二维空间障碍物规避最短路径规划系统_工业软件竞赛参赛项目_三维空间路径规划简化版_包含完整源代码和可视化展示_用于教学演示和算法研究_JavaScri.zip
- 计件工资管理系统_基于宏达数据库信息管理开发平台开发的企业级计件工资核算软件_包含公司信息管理部门管理员工管理工序管理产品管理工资项目管理等基础信息模块_支持生产登记计.zip
- enha-rs_Notes_29388_1755583796141.zip
- linyunbb_tui_7244_1755583799446.zip
- 供热收费管理专业系统_供热部门收费管理软件_单位收费管理_蒸汽热能换热器热水器费用计算_批量收费清单生成_基础设置模块_热费收费模块_信息查询模块_数据统计模块_收费标准设置_站区.zip
- 采土场出库综合管理系统_山场石渣山皮石混料粘土开采管理_出库单登记财务管理油料管理设备租赁_员工考核供货方车辆品名签卡人设备信息_现金支出工资爆破钻井收入预收款回款_油料进油加油库.zip