我有 Datalogic Magellan 1500i 制造的扫描仪。当我通过 USB 将其连接到我的机器时,我可以使用以下命令查看扫描仪读取的条形码:
cat -v /dev/ttyACM0
F4009900511513^M
当我们收到这些扫描仪时,我们希望根据我们的目的配置它们。此过程是通过扫描扫描仪手册中提供的条形码来完成的。
我想以编程方式执行此操作,将条形码的值直接发送到扫描仪,模拟它们已被扫描。我在这里阅读了一些问题并找到了一些建议,但我无法让扫描仪对我的事件做出反应。
我在一个终端中运行上面的命令,并在另一个终端中回显到同一个 tty 设备:
echo "test" > /dev/ttyACM0
但是,读取输出的终端中没有显示任何内容,并且扫描仪没有显示收到我发送的内容的迹象。
这就是我从中得到的lsusb -D /dev/bus/usb/001/039
Device: ID 05f9:4002 PSC Scanning, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x05f9 PSC Scanning, Inc.
idProduct 0x4002
bcdDevice 0.49
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 4
CDC Header:
bcdCDC 1.10
CDC ACM:
bmCapabilities 0x07
sends break
line coding and serial state
get/set/clear comm features
CDC Union:
bMasterInterface 0
bSlaveInterface 1
CDC Call Management:
bmCapabilities 0x01
call management
bDataInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
这是当我拔下设备并再次插入时在 Journalctl 中看到的内容:
kernel: usb 1-8: USB disconnect, device number 39
upowerd[1029]: unhandled action 'unbind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.1
upowerd[1029]: unhandled action 'unbind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0
upowerd[1029]: unhandled action 'unbind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8
kernel: usb 1-8: new full-speed USB device number 40 using xhci_hcd
kernel: usb 1-8: New USB device found, idVendor=05f9, idProduct=4002, bcdDevice= 0.49
kernel: usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 1-8: Product: Point of Sale Handable Barcode Scanner
kernel: usb 1-8: Manufacturer: Datalogic USA Inc.
kernel: usb 1-8: SerialNumber: E19I43871
kernel: cdc_acm 1-8:1.0: ttyACM0: USB ACM device
mtp-probe[7447]: checking bus 1, device 40: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-8"
mtp-probe[7447]: bus: 1, device: 40 was not an MTP device
snapd[748]: hotplug.go:199: hotplug device add event ignored, enable experimental.hotplug
upowerd[1029]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.1
upowerd[1029]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0
upowerd[1029]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-8
有什么办法可以实现我想要做的事情吗?我是不是找错地方了?
附加信息更新
检查用于 tty 的选项会产生以下结果:
$ stty -F /dev/ttyACM0
speed 115200 baud; line = 0;
eof = ^A; min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
扫描条形码时,代码以 ^M 结尾,搜索该代码会导致附加答案。我想这可能与我在回显到设备时没有发送正确的行结尾有关,但我不知道如何更改接受的行结尾或如何发送正确的行结尾。
进一步调试
尝试设置 eol、eof 并启用 icrnl:
stty eol 'x' eof 'x' -F /dev/ttyACM0 115200 -brkint icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
后者现在为扫描的每个代码打印一个新行:
$ cat -v /dev/ttyACM0
F4009900511513
F4009900511513
F4009900511513
根据建议尝试使用 printf 发送正确的数据,但终端读取设备没有结果:
printf 'F4009900511513\r' > /dev/ttyACM0
printf 'F4009900511513\r\n' > /dev/ttyACM0
最终解决方案
我给 Datalogic 发了电子邮件,以下内容似乎有效:
printf 'F400990051153\x0d' > /dev/ttyACM0
这导致终端读取输出以下内容:
$ cat -v /dev/ttyACM0
^F
答案1
最终解决方案
我给 Datalogic 发了电子邮件,以下内容似乎有效:
printf 'F400990051153\x0d' > /dev/ttyACM0
这导致终端读取输出以下内容:
$ cat -v /dev/ttyACM0
^F
不幸的是,我无法分享更多细节,但在答案的帮助下并像 printf 一样发送换行符\x0d
似乎可以解决问题。