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

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项