78 Linux libusb库USB HID应用编程笔记

2024-08-26 23:04

本文主要是介绍78 Linux libusb库USB HID应用编程笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 前言

        这几天搞另外一个项目,基于Ubuntu开发一个小的应用程序,就是通过USB HID与设备通信。因此需要在Linux环境编写对应USB HID通信应用。

        目前libusb库已经很好的支持USB相关应用的开发,库中提供了丰富的USB接口,用户可以直接调用其提供的API,实现快速开发。

        本文对USB HID应用开发进行了简要记录,方便日后自己查看复习。

2 libusb库准备

(1)获取libusb库源码

下面链接是libusb库的源码下载地址。

libusb库源码:https://github.com/libusb/libusb/releases

(2)编译libusb库

获取到源码之后,需要对库进行编译,下面记录了自己编译的指令。

cd libusb-1.0.26/
#配置
./configure --prefix=/home/libusbinstall --build=x86_64-linux --disable-udev
#编译
make
#安装
make install

(3)安装目录

安装之后可以看到目标目录存在两个文件夹:include/ 和 lib/

3 应用示例

下面直接上代码,无需多言,看代码即可(代码风格及规范进行了简化,实际上没那么丑的)。

头文件:hidusb.h

#include <stdint.h>#include "libusb.h"int hidUSB_write(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *pDataIn, int nDataLen, int ntimeout);
int hidUSB_read(libusb_device_handle *dev_handle,unsigned char endpoint, unsigned char *pDataRcv, int nDataLen, int ntimeout);
int hidUSB_open(libusb_device_handle **dev_hdlout, uint16_t vendor_id, uint16_t product_id);
int hidUSB_close(libusb_device_handle *dev_handle);void hidUSB_DeInit(void);
int hidUSB_Init(void);

源文件:hidusb.c

#include <stdio.h>
#include <stdint.h>
#include <string.h>#include "hidusb.h"static libusb_context 			*gUSBCtx = NULL;int hidUSB_write(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *pDataIn, int nDataLen, int ntimeout)
{int ret = -1;int transferred = 0;ret = libusb_interrupt_transfer(dev_handle, endpoint, pDataIn, nDataLen, &transferred, ntimeout);if(ret<0){perror("failed to write\n");return 0;}return transferred;}int hidUSB_read(libusb_device_handle *dev_handle,unsigned char endpoint, unsigned char *pDataRcv, int nDataLen, int ntimeout)
{int ret = -1;int transferred = 0;ret = libusb_interrupt_transfer(dev_handle,endpoint, pDataRcv, 64, &transferred, ntimeout);if(ret!=0){perror("failed to read\n");return 0;}return transferred;}int hidUSB_open(libusb_device_handle **dev_hdlout, uint16_t vendor_id, uint16_t product_id)
{int ret = -1;libusb_device_handle *tdev_handle = NULL;//打开指定pid和vid的设备tdev_handle = libusb_open_device_with_vid_pid(NULL, vendor_id, product_id);if(tdev_handle == NULL){perror("Cannot open device\n");return -1;}//内核驱动激活与分离(这一句我没怎么搞懂为啥需要,懂的朋友欢迎留言告诉我)if(libusb_kernel_driver_active(tdev_handle, 0) == 1){ printf("Kernel Driver Active\n");if(libusb_detach_kernel_driver(tdev_handle, 0) == 0){printf("Kernel Driver Detached!\n");}}ret = libusb_claim_interface(tdev_handle, 0);if(ret < 0) {perror("Cannot Claim Interface\n");goto iExit;}*dev_hdlout = tdev_handle;return 0;iExit:	if(tdev_handle)libusb_close(tdev_handle);return -1;
}int hidUSB_close(libusb_device_handle *dev_handle)
{int ret = -1;if(dev_handle){ret = libusb_release_interface(dev_handle, 0);if(ret!=0){	perror("Cannot libusb_release_interface\n");return -1;}libusb_close(dev_handle);}return 0;
}void hidUSB_DeInit(void)
{libusb_exit(gUSBCtx);
}int hidUSB_Init(void)
{int ret = -1;ret = libusb_init(&gUSBCtx); if(ret < 0) {perror("libusb_init failed\n");return -1;	} return 0;
}

主程序:main.c

#include <stdio.h>
#include <unistd.h>
#include "hidusb.h"//设备的标识号
#define HT232_USB_VID 			0x5548
#define HT232_USB_PID 			0x6666//这个需要看设备所使用的ep
#define HT232_USB_HID_EPOUT		0x01
#define HT232_USB_HID_EPIN		0x81int main(void)
{int ni = 0;int nRet = -1;uint8_t ucSndBuf[256] = {0};uint8_t ucRcvBuf[256] = {0};uint8_t ucSndLen = 0;uint8_t ucRcvLen = 0;libusb_device_handle *dev_handle = NULL;nRet =  hidUSB_Init();if(nRet != 0){perror("hidUSB_Init failed\r\n");return -1;}nRet = hidUSB_open(&dev_handle, HT232_USB_VID, HT232_USB_PID);if(nRet != 0){perror("hidUSB_open failed\r\n");return -1;}while(1){ucSndBuf[0] = 0x01;ucSndBuf[1] = 0x02;ucSndBuf[2] = 0x03;ucSndBuf[3] = 0x04;ucSndLen = 4;nRet =  hidUSB_write(dev_handle, HT232_USB_HID_EPOUT, ucSndBuf, ucSndLen, 1000);if(nRet == 0){perror("hidUSB_write failed\r\n");goto iSleep;}ucRcvLen =  hidUSB_read(dev_handle, HT232_USB_HID_EPIN, ucRcvBuf, sizeof(ucRcvBuf), 1000);if(ucRcvLen == 0){perror("hidUSB_read failed\r\n");goto iSleep;}for(ni=0; ni<ucRcvLen; ni++){printf("%02X ", ucRcvBuf[ni]);}printf("\r\n");
iSleep:sleep(1);}nRet = hidUSB_close(dev_handle);if(nRet != 0){perror("hidUSB_open failed\r\n");}hidUSB_DeInit();return 0;
}

上述即为Linux环境下USB HID应用编程demo。

4 结束语

知识分享,共同进步。

over!

--------------------------------------------------------------------------------------------------------------

卖个广告:ble、4G、lora、wifi等门禁设备,各种读卡器模块、成品都有,若有需要,可私信。

这篇关于78 Linux libusb库USB HID应用编程笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109937

相关文章

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#