私は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
役に立つようです。