スキャンしたバーコードをシミュレートするために、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役に立つようです。

おすすめ記事