读取从/ dev/hidraw1设备连接到linux系统

问题描述:

我有一个QR /条码扫描器连接到我的Linux系统,它作为/ dev/hidraw1设备来。 如果我做ls -la /dev/hidraw*我得到读取从/ dev/hidraw1设备连接到linux系统

crw------- 1 root root 248, 0 May 5 10:18 /dev/hidraw0 
crw------- 1 root root 248, 1 May 5 11:05 /dev/hidraw1 

每当我尝试使用cat /dev/hidraw1命令我与编码数据一起获得了大量的垃圾数据的这种设备来读取也不会在一个格式化的方式出现。这里是一个QR码的输出

68<,? 
      .4xml ve7'rsion4="1 

..0"4 encod-%in4876g= 
            "UTF-8"?><PrintLetterB, 
                     .arcod4e&D!'ata"&% ' uid=$"12345,.678",name= 
                                     "Rohit 4Ka, 
poo.44r,."4 gend&& er=4"M,."4 yob=8"319,93" co 
                   ="S 

                    ,/O: 
                     Mukesh 4, 

为什么它没有连续可读的字符串,改变波特率也没有任何区别。 Here is the screenshot attached

你的是HID设备,而不是RS-232设备。它使用的协议是二进制的。您每次从设备上获得的read()都是HID报告,而不是文本行。

报告的格式因设备而异。 HID规范要求设备发布描述报告格式的HID报告描述符。这是...复杂的,但如果你只想使用这个特定的设备,你可以看看阅读报告,并试图推断它的意思。

根据我的经验,条码扫描仪通常包含一个小标题,然后是有效载荷数据。标题通常包含条形码类型和数据长度的字段。由于报告大小是固定的,但条形码长度很长,因此长条形码会分成多个报告,因此也有标志可以表示是第一个,连续还是最后一个块。

如果你想发布设备的转储,进一步分析,请不要使用cat。使用hexdump -Cod -tx1或类似的东西显示正确的二进制数据。

+0

我不需要二进制数据。我想要一个可读的字符串。我面临的问题是每当我拔下设备,我得到的结果是正确可读的字符串,但是当我连续扫描时,我得到它在上面显示的格式。 – user7345878

+0

@ user7345878:我真的怀疑当你_unplug_设备时,你会得到任何东西...... – rodrigo

+0

@ user7345878:啊,那是因为你的扫描器是在模拟“模拟键盘”模式下配置的。阅读'hidraw'你正在获得标准键盘 HID报告,就好像键盘输入一样。内核将它视为一个键盘,并将键入的文本发送到控制台,但控制台忙于使用“cat”,因此当数据回显到屏幕并与二进制数据混杂在一起时,它也被缓冲在标准输入。然后,当'cat'最终被杀死时,所有的stdin缓冲区都会以纯文本的形式被转储。 – rodrigo

大多数扫描仪可以配置为HID设备或USB CDC设备。查看扫描仪的手册,例如“USB Interface Configuration”,看它是否可以设置为USB CDC(或USB Com Port Emulation)。如果可以,它将作为/ dev/ttyACM *附加在linux上,并将数据作为串行流提供,这样更易​​于阅读。