Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信_ubuntu向hid设备写数据-程序员宅基地

技术标签: HIDUSB  HID  通信  

转自https://www.cnblogs.com/ChYQ/p/5383828.html

 

一、背景:
      最近在做的一个项目需要使用USB传递数据,对USB理解不是很深,USB的系统驱动编写则更是天方
    夜谭,因此将设备配置成HID类设备成为了首选。其最大的好处在于,LINUX/Windows系统中均自带HID
    设备驱动,免除了USB系统驱动的困扰,同时HID配置为高速设备与全速设备时,其每笔事务传输的最大
    字节大小分别为64bytes、1024bytes,亦符合当前开发需求。

二、正文:  
        安装及使用方法在"HIDAPI"文件夹中的"Readme"有了详细说明,在此仅做个大致说明以及记录在使
    用该库函数时所碰到的一些问题。
  Windows:
      在Windows中,其使用"VS"工具来编译,HIDAPI以两种情况存在在项目中:一种是,将“"hid.c"、
    "hid.h"和自己的源码一起编译到项目中;另一种则是将其编译成".dll",".lib",以动态链接库的形式
    存在于项目中。推荐第一种,第一种方法你就可以很方便跟"hidapi"源代码。
      在Windows中使用
        "int hid_write(hid_device *device, const unsigned char *data, size_t length);"
    这个函数时,一定要注意!写入的数据大小一定要再加1bytes,首字节用来存放REPORT ID,并且写入
    的数据大小"length"只能固定为设备对应ReportID定义的OUT报告的大小!
      举个例子,若是USB设备只有一个Report ID,该Reprot ID对应的OUT Report大小配置为OUT_cnt
    bytes。那么buf[0]应该保存Report ID,buf的大小应该设置为(OUT_cnt bytes + 1bytes(report id)),
    写入的字节参数"length"无论多少,用"Bus hound"工具会发现,下传的数据大小一律为Out_cnt bytes,
    在下位机读取到的USB数据大小通过串口返回,也可证实,下位机读取到的数据大小也为Out_cnt bytes.
    至于原因,该库函数作者Alan也做出了一些回答,意思在Windows系统中系统会根据首字节的Report ID
    来寻找正确的发送端口,若有兴趣可以搜索作者在该github中Issues的问答。
      同样,在Windows中使用
        "int hid_read(hid_device *device, unsigned char *data, size_t length);"
    这个函数时,"length"的值一定要为下位机定义的IN Report大小。并且这个函数要和函数   "hid_set_nonblocking(...)"使用,设置为堵塞或者非堵塞。跟进"hid_read(..)"函数内,会发现其   最终调用的函数还是
    "int hid_read_timeout(... int milliseconds)"
    若是设置为堵塞模式,则参数"milliseconds"设置为"-1",设置为非堵塞模式,则参数"milliseconds"设置
    为"0"。
      其它的勿用多说,Readme和头文件中已经写的非常详细。
      补充一点,已证实"HIDAPI"非线程安全操作,即读和写一定要在一个线程内操作,而不能在两个线程
    内操作。2016-12-6 

  Linux:
      在Linux中,其同Windows一致,亦是以两种形式存在,且Linux系统对传输的字节数更加宽容,没有
    Windows那么严格,因此"HIDAPI"在Linux系统使用中没有hid_wrte/hid_read在Windows出现的麻烦,写入
    低于设备设定字节限定大小的任意字节皆可,读亦如此,不会遭遇读写失败的境遇。
      具体的编译方法及使用方法亦在Readme和头文件中已经写的非常详细,在此不再赘述。

三、下载及参考链接:
  hidraw设备介绍:
    https://www.kernel.org/doc/Documentation/hid/hidraw.txt
  HIDAPI介绍:
    https://valelab.ucsf.edu/svn/3rdpartypublic/hidapi/hidapi-3a66d4e513/README.txt
  HIDAPI下载页面:
    https://github.com/signal11/hidapi
    

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhaopeizhaopeipei/article/details/107338713

智能推荐

Oracle EBS值集_flex_value setiame-程序员宅基地

文章浏览阅读5.4k次。1、从值集中取值SELECT ffv.flex_value, ffv.description FROM fnd_flex_values_vl ffv, fnd_flex_value_sets ffs WHERE ffv.flex_value_set_id = ffs.flex_value_set_id AND ffs.flex_value_set_name_flex_value setiame

基于UDP协议的实时影像传输程序_udp图像传输源码-程序员宅基地

文章浏览阅读600次,点赞3次,收藏4次。声明:本文仅作为个人创作成果过程备份,不具有专门的教育作用。程序还未完成,无法顺利运行是正常现象本人为非计算机相关专业大一学生,学习c语言仅为个人爱好,如有技术性错误请各位轻喷,欢迎大家提出任何具有建设意义的建议客户端(基于Linux平台):#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/socket._udp图像传输源码

HTML5使用ul li做下拉列表_html下拉列表用ul-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏8次。<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> *{ padding: 0px; margin: 0px; } a{ ..._html下拉列表用ul

ROS学习-记录和回放数据_rosbag record 指定topic-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏11次。本博客将介绍怎么使用ROS系统来记录数据到一个.bag文件中,然后回放数据,在运行系统中产生类似的效果。记录数据(创建一个bag文件)从一个运行的ROS系统中记录topic数据,并存储到bag文件中。首先,打开一个Terminal窗口,运行roscore。roscore打开第二个Terminal窗口,运行turtlesim包中的turtlesim_node节点:rosrun turtlesim turtlesim_node打开第三个Terminal窗口,运行turtlesim包中的tu._rosbag record 指定topic

【Python&amp;GIS】Python实现批量导出面矢量要素(单个多面矢量->多个单面矢量)(1)-程序员宅基地

文章浏览阅读244次,点赞5次,收藏10次。之前发过很多文章都没有提到过环境配置,因为直接默认大家会使用Python了,今天这个博文加这个模块主要是因为我们使用的Python2.7!代码中有详细的注释。**变量就3个,第一个是arcpy的工作空间(没啥用),第二个就是想要拆分的矢量文件目录,第三个是输出矢量文件的文件夹。针对这个环境也不多说,你只要安装了ArcGIS就会有Python2.7,只要在Pycharm中将Python2.7的解释器加入到环境中即可。包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

大数据数据库之HBase:集群安装部署_hbase-env.sh-程序员宅基地

文章浏览阅读450次。文章目录前言1. HBase集群安装部署1.1 准备安装包1.2 修改HBase配置文件1.2.1 hbase-env.sh1.2.2 hbase-site.xml1.2.3 regionservers1.2.4 back-masters1.3 分发安装包1.4 创建软连接1.5 添加HBase环境变量1.6 HBase的启动与停止1.7 访问WEB页面1.8 停止HBase集群总结前言Hive的学习告一段落,接下来开始了解大数据主流NoSql数据库HBase,本文主要讲解HBase集群的安装部署,为_hbase-env.sh

随便推点

tf.nn.dropout和tf.keras.layers.Dropout的区别(TensorFlow2.3)与实验_tensorflow.keras.layers.dropout-程序员宅基地

文章浏览阅读4.4k次,点赞5次,收藏7次。这里写目录标题场景:dropout和Dropout区别问题描述:结论:深层次原因:dropout是底层API,Dropout是高层API场景:dropout和Dropout区别全网搜索tf.nn.dropout和tf.keras.layers.Dropout区别,发现好多都是错误的讲解,因此有必要进行一次实验和纠错。tf.nn.dropout和tf.keras.layers.Dropout的区别,看本文就足够了。问题描述:tf.nn.dropout和tf.keras.layers.Dropou_tensorflow.keras.layers.dropout

【组成原理-处理器】处理器的相关概念_平均指令周期计算公式-程序员宅基地

文章浏览阅读5.3k次,点赞22次,收藏137次。【组成原理-处理器】处理器的相关概念_平均指令周期计算公式

m基于BP神经网络的障碍物避障和路线规划matlab仿真_障碍物距离计算仿真-程序员宅基地

文章浏览阅读1k次。在BP神经网络中,隐含层数量对神经网络的性能有着至关重要的影响,如果隐含层数量过多,会大大增加BP神经网络的内部结构的复杂度,从而降低学习效率,增加训练时间;由于隐含层个数的设置没有明确的理论可以计算,通常情况下,采用逐次分析的方法获得,即通过对不同隐含层所对应的神经网络进行预测误差的仿真分析,选择误差最小情况下所对应的隐含层个数。BP神经网络的初始网络权值对网络训练的效率以及预测性能有着较大的影响,通常情况下,采用随机生成[-1,1]之间的随机数作为BP神经网络的初始权值。_障碍物距离计算仿真

微信小程序显示富文本内容图片溢出设置样式_小程序显示获取富文本图片样式-程序员宅基地

文章浏览阅读785次。微信小程序显示富文本内容,图片溢出问题_小程序显示获取富文本图片样式

react封装函数_封装React AntD的form表单组件-程序员宅基地

文章浏览阅读1.1k次。form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录、注册、修改个人信息、新增修改业务数据等的公司内部管理系统。而在使用时这些表单的样式如高度、上下边距、边框、圆角、阴影、高亮等等都大同小异、大差不差且表单的功能基本相似,所以很有必要对这些表单来一个简单的封装。其实,封装组件的意义我们在上一篇封装react antd的表格table组件中已经介绍过了,这里不再做过多的描述了,..._react and from 表单库函数封装

PyTorch学习笔记(5)——论一个torch.Tensor是如何构建完成的?_aten/aten.h-程序员宅基地

文章浏览阅读6.4k次,点赞14次,收藏25次。最近在准备学习PyTorch源代码,在看到网上的一些博文和分析后,发现他们发的PyTorch的Tensor源码剖析基本上是0.4.0版本以前的。比如说:在0.4.0版本中,你是无法找到a = torch.FloatTensor()中FloatTensor的usage的,只能找到a = torch.FloatStorage()。这是因为在PyTorch中,将基本的底层THTensor.h TH..._aten/aten.h