저는 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
도움이 되는 것 같습니다.