스캔한 바코드를 시뮬레이션하기 위해 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도움이 되는 것 같습니다.

관련 정보