我心飞扬 发表于 2025-11-15 04:05:28

USB库的HID库中没有OutNumber变量。

情况介绍:

在做USB的printf_usb实验时,用到函数:USB_SendData(UsbOutBuffer, OutNumber);
这个函数中OutNumber变量在CDC库中有,但是HID库中没有。
参考HID库的样例程序发现,调用USB_SendData()时,HID的样例都是这样写的:USB_SendData(UsbOutBuffer, 64);
看到ai_usb.h中定义:extern BYTE xdata UsbOutBuffer;
可是发多少信息是变化的,为何固定为64?
还看到ai_usb.h中还有定义:extern BYTE xdata UsbInBuffer;
UsbOutBuffer和UsbInBuffer与输入输出缓冲是如何对应的?有什么关系?
按说用:USB_SendData(UsbOutBuffer, OutNumber);做的工作是MCU接收到的数据原路返回,接收的数据进入UsbInBuffer,用USB_SendData从UsbInBuffer中取数据感觉才合理。
我知道所有程序显示的实际情况与我预想不一致一定是我对逻辑框架不了解造成的。
谁能给指导一下,先谢谢您了!


ercircle 发表于 2025-11-15 14:10:13

记这个问题之前搜索过,大概是这个原因,所以固定发64字节也就不需要OutNumber:
“负载如果不足64字节,一定要补齐64字节,否则Windows ReadFile()和WriteFile()会失败”

我心飞扬 发表于 2025-11-15 21:56:06

ercircle 发表于 2025-11-15 14:10
记这个问题之前搜索过,大概是这个原因,所以固定发64字节也就不需要OutNumber:
“负载如果不足64字节,一 ...
谢谢您的回复。
正在看Ai8051U芯片手册,“3.3 USB库函数简介”,“3.5 USB库函数的详细说明”,有些说明,只是提醒固定成64。
关于USB库函数的详细说明,不知STC开发部门能否放出一点USB逻辑关系框图之类的开发文档?
另外谢谢您在我前几天给您回帖时的送花。

我心飞扬 发表于 2025-11-15 22:37:35

ercircle 发表于 2025-11-15 14:10
记这个问题之前搜索过,大概是这个原因,所以固定发64字节也就不需要OutNumber:
“负载如果不足64字节,一 ...
细想一下不对吧?
你说的是Windows环境下的WriteFile()往HID设备中写数据吧,在这里应该是HID-助手这个程序管理的输出缓冲区。
系统底层发送还是以数据流的形式从USB线上发给MCU。
MCU的硬件逻辑以数据流的形式收取数据并放到本地输入缓冲区。本地输入缓冲区是否有接收字节的计数呢?(有果有,正好可以当OutNumber这个变量。)
而且MCU编程不是Windows环境,受限制只能考虑MCU硬件USB逻辑在HID处理上与CDC处理有不同,CDC能取到每次的接收字节。
另外我用sizeof(UsbOutBuffer)代替64是,在HID-助手接收到的信息末尾,看到有其它信息,这也不应该啊。
本来想实现HID下数据的回送,难道无法实现了?


我心飞扬 发表于 2025-11-15 22:45:05

哪位坛友有示波器或分析仪(我对硬件了解不多,设备可能说的不对。),能帮着看看HID设备的通信波形或什么实时图形,例如:键盘(HID设备)的通信逻辑时序,是每次都发送64字节吗?
恳请有设备的坛友帮一下忙,在此先谢谢您!

ercircle 发表于 2025-11-16 09:43:04

我心飞扬 发表于 2025-11-15 22:37
细想一下不对吧?
你说的是Windows环境下的WriteFile()往HID设备中写数据吧,在这里应该是HID-助手这个程 ...
首先拿USB库压缩包里例程配合HID助手就可以很轻松的实现HID通讯报文回传。


其次,你仅仅只是在MCU侧编程,通讯是双端行为,另一端的收发逻辑首先取决于HOST侧底层驱动。
虽然没有微软HID驱动实现源码,那可以黑盒测试嘛,
使用HID范例,在声明bMaxPacketSize为64 前提下,将传输长度改为别的值看看是否有响应?


狂热主宰 发表于 2025-11-16 10:00:04

有些接口固定数据格式和长度
页: [1]
查看完整版本: USB库的HID库中没有OutNumber变量。