打印

USB--HID的不解

[复制链接]
2873|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuntian|  楼主 | 2013-2-21 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了一个HID固件,在BUS HOUND下可以发指定长度的数据,在监视里可以看到不断有数据传入PC,

我的固件是定时20mS发送8个字节的,固件只是把数据送到USB发送缓冲区中,是不是BUS HOUND自动读上来的?USB都是主机为主动的啊.

是不是说我在PC端的软件可以读到不定长度的数据?只要采用异步READFILE就可以了?读的时候看下OVERLAPPED实际接到的字节数?

相关帖子

沙发
john_lee| | 2013-2-21 17:56 | 只看该作者
hid 是 INTERRUPT 类型端点,枚举成功后,host 就会按 endpoint descriptor 中定义的 bInterval 时间间隔不断地发出 IN/OUT token,而不管是否有程序使用这个 hid,所以你看到的 IN DATA packet,并不是 bushound 搞的动作。host 读到的 report,都会保存到 hid 驱动为此 hid 设备开辟的缓冲,我记得缓冲区默认的大小是 32 个 report 的长度,应用程序调用 ReadFile 读取 hid 时,就是读取这个缓冲中存储的 report,一次 ReadFile 读出的数据长度,是不定的,但总是(report 长度 + 1 字节)的整数倍,表示读到了几个 report。

使用特权

评论回复
板凳
yuntian|  楼主 | 2013-2-21 19:19 | 只看该作者
回复得很详细,楼上对USB很熟了,非常感谢.

另外再问个问题哦,我的这个应用是根据固件的UART收到的不定长度的数据包,但最大长度不超过64个字节,固件的程序不管收到的数据帧有多少个字节,每收到一帧数据,都会把整帧数据发到USB发送缓冲区中,这样是否就不能读到单独的帧?而是若干个帧合成的?如果是这样的话,有没有什么办法不断的定时读,读到每一个不超过64字节的不定长帧数据?

使用特权

评论回复
地板
john_lee| | 2013-2-21 20:03 | 只看该作者
ReadFile 所读出的数据格式是,{ report ID(1字节)+ report } * n,n >= 1。
ReadFile 读出的数据,不会在一个 report 中分段。数据一定是包含了整个 report 的内容,如果你的 UART 收到的数据包,能完整地保存在一个 report 中,那么 PC 程序一次 ReadFile 就可以收到完整的数据包。但 report 中的数据包,要靠你自己分离出来。

上位机程序一般是开一个线程来不断地(异步)读 hid,读到数据后,把数据封装一下,发一个带参数(就是数据的地址)的自定义消息通知主 UI 线程,然后回头继续读 hid。这个线程建议采用 UI 线程,好处是可以接收到 USB 的插入和拔出消息。

使用特权

评论回复
5
yuntian|  楼主 | 2013-2-21 22:32 | 只看该作者
明白了,如果UART帧数据不够一个包长度--64字节,那么最好是填充成64字节,可以在首字节加一个字节数标识,这样就可以提取出数据出来了.非常感谢.

使用特权

评论回复
6
yuntian|  楼主 | 2013-2-23 09:24 | 只看该作者
不过有点搞不明白的是,BUSHOUND是怎么做到有多少读多少的呢?

使用特权

评论回复
7
john_lee| | 2013-2-23 10:05 | 只看该作者
bushound 在设备上安装了一个驱动。
windows 允许一个设备有多个驱动,有些驱动只是想当于一个过滤器,其它驱动收发的数据都要在它那里过一下,于是它就具有了数据捕捉的功能。

使用特权

评论回复
8
yuntian|  楼主 | 2013-2-25 12:49 | 只看该作者
哦,明白了,也就是如果采用相同的驱动手段,完全可以不用按最大字节这种方式传输数据的.

使用特权

评论回复
9
一般首席| | 2013-3-18 22:21 | 只看该作者
有人学过AVRUSB吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

178

帖子

1

粉丝