将数据发送到通过 USB 连接的扫描仪以模拟扫描的条码

将数据发送到通过 USB 连接的扫描仪以模拟扫描的条码

我有 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似乎可以解决问题。

相关内容