找回密码
 立即注册
查看: 99|回复: 6

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:237
  • 最近打卡:2025-12-17 02:32:37
已绑定手机

23

主题

190

回帖

1582

积分

金牌会员

积分
1582
发表于 2025-11-15 04:05:28 | 显示全部楼层 |阅读模式
情况介绍:

在做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];
可是发多少信息是变化的,为何固定为64?
还看到ai_usb.h中还有定义:extern BYTE xdata UsbInBuffer[64];
UsbOutBuffer和UsbInBuffer与输入输出缓冲是如何对应的?有什么关系?
按说用:USB_SendData(UsbOutBuffer, OutNumber);做的工作是MCU接收到的数据原路返回,接收的数据进入UsbInBuffer,用USB_SendData从UsbInBuffer中取数据感觉才合理。
我知道所有程序显示的实际情况与我预想不一致一定是我对逻辑框架不了解造成的。
谁能给指导一下,先谢谢您了!


学习MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-12-17 08:54:40
已绑定手机

97

主题

3863

回帖

8332

积分

荣誉版主

无情的代码机器

积分
8332
发表于 2025-11-15 14:10:13 | 显示全部楼层
记这个问题之前搜索过,大概是这个原因,所以固定发64字节也就不需要OutNumber:
负载如果不足64字节,一定要补齐64字节,否则Windows ReadFile()和WriteFile()会失败
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:237
  • 最近打卡:2025-12-17 02:32:37
已绑定手机

23

主题

190

回帖

1582

积分

金牌会员

积分
1582
发表于 2025-11-15 21:56:06 | 显示全部楼层
erci*** 发表于 2025-11-15 14:10
记这个问题之前搜索过,大概是这个原因,所以固定发64字节也就不需要OutNumber:
“负载如果不足64字节,一 ...

谢谢您的回复。
正在看Ai8051U芯片手册,“3.3 USB库函数简介”,“3.5 USB库函数的详细说明”,有些说明,只是提醒固定成64。
关于USB库函数的详细说明,不知STC开发部门能否放出一点USB逻辑关系框图之类的开发文档?
另外谢谢您在我前几天给您回帖时的送花。
学习MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:237
  • 最近打卡:2025-12-17 02:32:37
已绑定手机

23

主题

190

回帖

1582

积分

金牌会员

积分
1582
发表于 2025-11-15 22:37:35 | 显示全部楼层
erci*** 发表于 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下数据的回送,难道无法实现了?


点评

首先拿USB库压缩包里例程配合HID助手就可以很轻松的实现HID通讯报文回传。 其次,你仅仅只是在MCU侧编程,通讯是双端行为,另一端的收发逻辑首先取决于底层驱动。 虽然没有微软HID驱动实现源码,那可以黑盒测试嘛  详情 回复 发表于 2025-11-16 09:43
学习MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:237
  • 最近打卡:2025-12-17 02:32:37
已绑定手机

23

主题

190

回帖

1582

积分

金牌会员

积分
1582
发表于 2025-11-15 22:45:05 | 显示全部楼层
哪位坛友有示波器或分析仪(我对硬件了解不多,设备可能说的不对。),能帮着看看HID设备的通信波形或什么实时图形,例如:键盘(HID设备)的通信逻辑时序,是每次都发送64字节吗?
恳请有设备的坛友帮一下忙,在此先谢谢您!
学习MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-12-17 08:54:40
已绑定手机

97

主题

3863

回帖

8332

积分

荣誉版主

无情的代码机器

积分
8332
发表于 2025-11-16 09:43:04 | 显示全部楼层
我心*** 发表于 2025-11-15 22:37
细想一下不对吧?
你说的是Windows环境下的WriteFile()往HID设备中写数据吧,在这里应该是HID-助手这个程 ...

首先拿USB库压缩包里例程配合HID助手就可以很轻松的实现HID通讯报文回传。


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

截图202511160942593719.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:102
  • 最近打卡:2025-12-17 00:03:22
已绑定手机

7

主题

136

回帖

768

积分

高级会员

DIY玩家

积分
768
发表于 2025-11-16 10:00:04 | 显示全部楼层
有些接口固定数据格式和长度
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-17 13:21 , Processed in 0.112464 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表