USB-HID与上位机通信整理

上位机通过QT开发工具开发界面,调用hidapi库,下载网址https://github.com/signal11/hidapi

调用hid_write和hid_read时,通过Bus Hound实际件事发现,单独监视USB输入设备和单独监视HID-Compliant 时得到的结果有细微的不同:

   当读取数据,即调用hid_read时,单独监视USB输入设备发现并无数据返回,尽管下位机的InReport中已经有数据;而当勾选上HID-Compliant 设备时,总线上才有InReport的数据。

    当写数据时吗,即调用hid_write,单独监视USB输入设备和单独监视HID-Compliant设备时总线都有OutReport的数据,但是USB输入设备上的OutReport数据比HID上的数据少一个字节,HID的OutReport数组的第一个字节是HID报告描述符中的输出Report ID。在我的HID报告描述符中没有设置Report ID,因此默认是0。

下位机编程使用USB库和HID库时,其中就有usbuser.c和hiduser.c两个用于给用户填充自己的代码的文件,而在usbuser.c的端点响应事件中和hiduser.c中的 HID_SetReport和HID_GetReport中都有调用用户自行编写的GetInReport和SetOutReport函数,都是对于发送数据和接收数据的处理。

 如下图所示,在使用Bus Hound监视总线上的数据时,也能发现对于USB输入设备(即下图的device编号为18的设备)是有显示其使用的端点号(在这里我设置使用的端点号为4),而对于HID-Compliant设备是没有显示端点号的。

关于Report ID和hidapi的联系

    之前在QT程序中直接调用hid_read和hid_write函数总是不成功,返回值总是为-1,,后来查阅hidapi.h中对两个函数的说明得知这两个函数需要配合HID的Report ID来使用,具体说明如下:

    int hid_read(hid_device *device, unsigned char *data, size_t length)通过中断IN端点返回一个HID设备的输入报告,其返回的报告的第一个字节就包含了HID设备的输入ReportID(如果在配置描述符时有设置的话),第3个参数length在实际的函数调用中也应该是sizeof(InReport)+1,用于容纳Report ID,函数的返回值是实际读取的数据的字节数。

   int hid_write(hid_device *device, const unsigned char *data, size_t length)向HID设备写入数据,要写入的数据存放在data数组中,需要注意的是,data []的第一个字节必须包含报告ID对于仅支持单个报告的设备,必须将其设置为0x0, 其余字节包含报告数据。 由于报告ID是必需的,因此对hid_write的调用将始终包含比报告包含的字节多一个字节。 例如,如果hid的OutReport长度为64字节,则必须将65个字节传递给hid_write(),即第一个字节是Report ID,其余64个字节是实际要传输的数据。

猜你喜欢

转载自blog.csdn.net/yhl_sophia/article/details/82801322