关于USB设备的配置问题

我有一个USB设备,在WINDOWS XP下被识别为USB键盘,然后我用51和CH375芯片做了一个USB主机,目的是处理从此设备得到的数据(此设备为读码器,将读码器插到PC后,任意打开一个文档编辑器,然后扫描一个条码,就会在文档编辑器里面自动输入条形码的值最后带个回车)。 但是问题是,我做的这个主机可以正确地识别从USB键盘得到的数据,却不能正确得到从此设备发来的数据,不知道问题出在哪里?我是用驱动USB键盘的程序驱动此USB设备的。

我的USB键盘配置如下: 12 01 10 01 00 00 00 08 3c 41 03 20 00 02 01 02 00 01 config 09 02 22 00 01 01 04 a0 23 config 2 09 02 22 00 01 01 04 a0 23 09 04 00 00 01 03 01 01 05 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 18 set idle report 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 01 75 05 91 01 95 06 75 08 15 00 26 ff 00 05 07 19 00 2a ff 00 81 00 c0 set report /*下面是得到的键盘码*/ 00 00 1e 00 00 00 00 00 //'1' 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 00 00 //'2' 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 //'3' 00 00 00 00 00 00 00 00 00 00 21 00 00 00 00 00 //'4' 00 00 00 00 00 00 00 00 //顺便问一下,这是什么编码形式?为何和ASC码、Unicode码都对不上?

我的USB设备配置如下: 12 01 00 01 00 00 00 08 b4 04 00 01 01 00 01 02 00 01 config 09 02 22 00 01 01 04 a0 32 config 2 09 02 22 00 01 01 04 a0 32 09 04 00 00 01 03 01 01 05 09 21 00 01 00 01 22 3f 00 07 05 81 03 08 00 0a set idle report 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 05 75 01 05 08 19 01 29 05 91 02 95 01 75 03 91 01 95 06 75 08 15 00 25 ff 05 07 19 00 29 ff 81 00 c0 set report /*下面是发来的数据,本应该是一个14字节长度的数据,但是却只收到了8个0*/ 00 00 00 00 00 00 00 00

之后我又用bushound抓取了与PC连接时的数据:

USB键盘的如下(字符“1”的数据流): Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------------------------------------------------------------------------------------ ---------------- ------------------ 25 LEN 09 00 00 00 9 1.1.0 25 DI 00 00 00 1e 00 00 00 00 00 ......... 1.2.0 25 IRP 06 00 48 01 f8 59 47 87 00 00 00 00 00 00 00 00 08 3b 4f 87 08 3b 4f 87 00 00 00 00 09 00 00 00 1.3.0 25 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 bd aa 88 18 b7 bf 88 9a ad 79 a9 READ 1.4.0 25 LEN 09 00 00 00 9 2.1.0 25 DI 00 00 00 00 00 00 00 00 00 ......... 2.2.0 25 IRP 06 00 48 01 f8 59 47 87 00 00 00 00 00 00 00 00 08 3b 4f 87 08 3b 4f 87 00 00 00 00 09 00 00 00 2.3.0 25 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 bd aa 88 18 b7 bf 88 9a ad 79 a9 READ 2.4.0

下面是USB设备一次发来的数据流(每次都发送14字节有效数据,如下例中的‘23 26 1f 21 26 22 21 1e 20 27 24 1f 23 28’): Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------------------------------------------------------------------------------------ ---------------- ------------------ 27 LEN 09 00 00 00 9 1.1.0 27 DI 00 00 00 23 26 1f 21 26 22 ...#&.!&" 1.2.0 27 IRP 06 00 48 01 48 dc b1 88 00 00 00 00 00 00 00 00 48 22 50 87 48 22 50 87 00 00 00 00 09 00 00 00 1.3.0 27 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d8 d4 61 89 48 c9 c7 88 9a ad 79 a9 READ 1.4.0 27 LEN 09 00 00 00 9 2.1.0 27 DI 00 00 00 00 00 00 00 00 00 ......... 2.2.0 27 IRP 06 00 48 01 48 dc b1 88 00 00 00 00 00 00 00 00 48 22 50 87 48 22 50 87 00 00 00 00 09 00 00 00 2.3.0 27 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d8 d4 61 89 48 c9 c7 88 9a ad 79 a9 READ 2.4.0 27 LEN 09 00 00 00 9 3.1.0 27 DI 00 00 00 21 1e 20 27 24 1f ...!. '$. 3.2.0 27 IRP 06 00 48 01 48 dc b1 88 00 00 00 00 00 00 00 00 48 22 50 87 48 22 50 87 00 00 00 00 09 00 00 00 3.3.0 27 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d8 d4 61 89 48 c9 c7 88 9a ad 79 a9 READ 3.4.0 27 LEN 09 00 00 00 9 4.1.0 27 DI 00 00 00 00 00 00 00 00 00 ......... 4.2.0 27 IRP 06 00 48 01 48 dc b1 88 00 00 00 00 00 00 00 00 48 22 50 87 48 22 50 87 00 00 00 00 09 00 00 00 4.3.0 27 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d8 d4 61 89 48 c9 c7 88 9a ad 79 a9 READ 4.4.0 27 LEN 09 00 00 00 9 5.1.0 27 DI 00 00 00 23 28 00 00 00 00 ...#(.... 5.2.0 27 IRP 06 00 48 01 48 dc b1 88 00 00 00 00 00 00 00 00 48 22 50 87 48 22 50 87 00 00 00 00 09 00 00 00 5.3.0 27 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d8 d4 61 89 48 c9 c7 88 9a ad 79 a9 READ 5.4.0 27 LEN 09 00 00 00 9 6.1.0 27 DI 00 00 00 00 00 00 00 00 00 ......... 6.2.0 27 IRP 06 00 48 01 48 dc b1 88 00 00 00 00 00 00 00 00 48 22 50 87 48 22 50 87 00 00 00 00 09 00 00 00 6.3.0 27 STAK 03 00 00 e0 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d8 d4 61 89 48 c9 c7 88 9a ad 79 a9 READ 6.4.0

本人刚开始读USB协议,只是略懂点皮毛,分析配置描述符还是很困难的,所以还请有经验的前辈给我指一条路,我该如何配置我的这个设备? 实验做下来,我知道完全按照USB键盘的配置是行不通的,但就是找不到关键的配置点。 希望版主能指点一下此USB设备该如何配置!多谢了! 期待前辈指点中。。。[Emot]19[/Emot]

我的邮箱:个人信息保护,已隐藏,如方便可以邮件交流,谢谢!


1:这个是键码,不是什么编码.就是固定的值. 2:按照你的数据和描述符分析,就应该是8个字节,您怎么来判断是14个字节呢? 您分析错了,不是这样的, 00 00 00 23 26 1f 21 26 22 这是一包数据8个字节 00 00 00 00 00 00 00 00 00 另外一包,表示断码,就是按键放开 00 00 00 21 1e 20 27 24 1f 一包数据 00 00 00 00 00 00 00 00 00

按键放开 这个是一个正确的数据流,没什么问题的.不可能一次发送14个字节的,协议是8个.


我明白你的意思,是我没说清楚。 对于USB键盘,按下‘1’,发送的是“00 00 00 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00”,每次发送8个字节的通码和断码,这样才会在文本编辑器里面显示字符“1”;而我这个读码器每次(逻辑上的‘次’) 读码后会在文本编辑器里面显示14个字符对应条码的14个数字,如果按照USB键盘驱动的规定,应该是发送16*14=224个字节才能显示14个字符的,对吧。 但是,这个读码器却只发送了如下6包的字符: 00 00 00 23 26 1f 21 26 22 00 00 00 00 00 00 00 00 00 00 00 00 21 1e 20 27 24 1f 00 00 00 00 00 00 00 00 00 00 00 00 23 28 00 00 00 00 00 00 00 00 00 00 00 00 00 当中三包通码中有效字符为:23 26 1f 21 26 22 21 1e 20 27 24 1f 23 28,对应13个条码的数字:6914954130716和最后一个回车符。这些字符会随着扫描不同的编码而相应地改变,以此来实现条码读取后传送数据的功能。 这个读码器能够把要传送的字符安排到通码包的4-9个字符位,说明他是需要特殊配置的吧?应该和USB键盘的配置有所区别,而且此驱动还是WINDOWS通用的驱动,不需要另外安装的。最上面我贴了此读码器的设备和配置信息,现在的问题就是我该如何用51通过ch375来配置它呢?

另外有个疑问: 根据您的回复,“00 00 00 23 26 1f 21 26 22”明明是9个字节,可您为什么说“这是一包数据8个字节 ”呢?有点疑惑。我也知道协议说是8个字节一包,但是为什么用bushound抓取的却是一包9个字节呢?而且对于我这个读码器来说,通码包最后多出的一个字节还是有用的数据,这个该如何去分析呢? 感谢红桃六前辈的指点,希望您能继续不吝赐教!


不需要的其他配置,例如: 00 00 00 23 26 1f 21 26 22 从23开始就是有效数据,在打包的时候,填入数据就可以了和普通的键盘是一样的,你可以实验一下,在键盘上你一次按6个键是可以传上去的,超过6个就报错了. 另外不推荐这样做,这样做的话如果有重复的按键,有可能不能计算机识别到的,还是一个键一个键的上传比较稳定. 00 00 00 23 26 1f 21 26 22 这个数据包其实是八个,只是你在BUSHOUND里选择设备的时候选择的是设备上一级的HUB口,第一个字节00,其实不是读卡器发上来的,是由WINDOWS驱动自己添加的,代表的是REPORT ID,当ID为0时,由驱动自己添加.由于不是读卡器发上来的数据,可以认为该数据无效.


哦,关于“一包9个字节”问题的疑惑终于解开了,非常感谢~:) 剩下的就是如何配置此读码器的问题了,如下的数据: 12 01 00 01 00 00 00 08 b4 04 00 01 01 00 01 02 00 01 config 09 02 22 00 01 01 04 a0 32 config 2 09 02 22 00 01 01 04 a0 32 09 04 00 00 01 03 01 01 05 09 21 00 01 00 01 22 3f 00 07 05 81 03 08 00 0a set idle report 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 05 75 01 05 08 19 01 29 05 91 02 95 01 75 03 91 01 95 06 75 08 15 00 25 ff 05 07 19 00 29 ff 81 00 c0 set report 是我用“USB键盘、鼠标例程”后,从PC里接收到的数据,应该是CH375读出此读码器的设备和配置信息吧?那么我在程序里面应该怎么对它进行配置呢?现在是按照USB键盘、鼠标进行配置的,结果是不能正常读取数据,每次都是8个0。


不需要什么配置. USB鼠标键盘的数据可以正常获取到吗?读码器是你自己做的还是在市面上购买的?


非常非常非常非常非常非常非常感谢红桃六的帮助~我的问题解决了,不是配置的问题,配置是正确的。 问题出在51向CH375读取数据的程序那里,今天突然想到个问题,为什么只能收到8个0呢,原来例程里面的中断函数是不断的读取CH375的缓存数据,全部读取完了才从串口输出8位数据,这样对键盘鼠标操作是没有问题的,但是此读码器是一次性的发送6包数据到375的缓存里,结构造成最后读完数据51的缓存区只存了最后读取的8个数据,因此只能看到最后一包断码的8个0了。

键盘、鼠标大部分可以正确配置,而鼠标有的配置会出错,但是却可以正常接收到鼠标的数据……无语 读码器是买的产品。


对了,另外说一下 CH375做主机控制USB键盘鼠标的例程里面似乎有个BUG,就是当拔出USB设备后再次插上的时候,就死机了,系统不会在此识别并连接USB设备。


这个你可以在中断函数里加一个全局变量,把获取到的中断状态赋给全局变量,检测当变量为断开时就重新等待设备连接.


了解,我已经这么做了,呵呵


只有登录才能回复,可以选择微信账号登录