저는 Raspberry Pi 4에서 Ubuntu 20.04를 사용하고 있으며 ftdi_sio 및 udev 규칙을 사용하여 직렬 포트로 부팅된 USB를 통해 다른 장치로부터 데이터를 수신하고 있습니다.
ACTION=="add", \
ATTRS{idVendor}=="0eb8", \
ATTRS{idProduct}=="ea02", \
RUN+="/usr/sbin/modprobe ftdi_sio" \
RUN+="/usr/bin/sh -c 'echo 0eb8 ea02 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"
ACTION=="remove", \
ATTRS{idVendor}=="0eb8", \
ATTRS{idProduct}=="ea02", \
RUN+="/usr/bin/sh -c 'echo usb-Mettler-Toledo_Seven_Excellence-if00-port0 > /sys/bus/usb/drivers/ftdi_sio/unbind'"
YAT 또는 minicom과 같은 몇 가지 터미널을 사용하여 Windows에서 테스트했는데 제대로 작동하고 데이터 형식이 잘 지정되었습니다. 하지만 리눅스에서는 실패합니다. 나는 62자마다 2자가 손실된다는 것을 발견했습니다. 또한 Python 대신 직접 스크린 소프트웨어를 사용해 보았습니다. 전원 공급 장치도 확인했는데 공식 raspi4 충전기를 사용하고 있습니다.
직렬 포트를 읽는 데 어떤 소프트웨어(screen, minicom, Python 등)를 사용하더라도 동일한 오류가 발생합니다.
dsrdtr, rtscts 및 xonxoff의 다양한 구성을 시도했습니다. 데이터를 보내는 다른 장치를 보면 규칙은 전송 속도 9600, 데이터 비트 8, 패리티 없음, xonxoff 활성화일 수 있습니다. (확실하지 않습니다. 장치의 다른 기능에서 이러한 매개변수를 찾았습니다.)
데이터 샘플이므로 62자마다 2개가 누락됩니다.
b'{misses '<?'}xml version="1.0" encoding="utf-8" standalone="yes" ?><Telegra{misses 'm '}xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http:/{misses '/w'}ww.w3.org/2001/XMLSchema-instance" xmlns="LancePlatform"><EndO{misses 'fM'}ethod><m_timestamp>2023-10-24T16:20:35.0000</m_timestamp><m_eA{misses 'na'}lysisStatus>1</m_eAnalysisStatus><m_uiJobId>2</m_uiJobId><m_us{misses 'er'}></m_user></EndOfMethod></Telegram>\r\n'
고쳐 쓰다
dmesg에서 유용한 로그를 찾았지만 포럼에는 실제 답변이 없습니다.
[ 7150.279471] ftdi_sio ttyUSB0: error from flowcontrol urb
[ 7151.045999] ftdi_sio ttyUSB0: ftdi_set_termios FAILED to set databits/stopbits/parity
[ 7151.054621] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to set baudrate
[ 7151.062250] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 7151.069459] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 7151.075976] ftdi_sio ttyUSB0: error from flowcontrol urb
[ 7258.303870] ftdi_sio ttyUSB0: ftdi_set_termios FAILED to set databits/stopbits/parity
[ 7258.312491] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to set baudrate
[ 7258.320253] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 7258.327452] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 7258.333835] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to set baudrate
[ 7258.341355] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 7258.347832] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 7264.638935] ttyUSB ttyUSB0: 1 input overrun(s)
[ 7268.853097] ttyUSB ttyUSB0: 32 input overrun(s)
[ 7275.768053] ttyUSB ttyUSB0: 4 input overrun(s)
[ 7323.578412] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 8465.312963] ftdi_sio ttyUSB0: ftdi_set_termios FAILED to set databits/stopbits/parity
[ 8465.321780] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to set baudrate
[ 8465.329355] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 8465.336715] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 8465.343213] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 8465.349976] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 8465.359343] ftdi_sio ttyUSB0: ftdi_set_termios FAILED to set databits/stopbits/parity
[ 8465.367975] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to set baudrate
[ 8465.375468] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 8538.369178] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 8564.307661] ftdi_sio ttyUSB0: ftdi_set_termios FAILED to set databits/stopbits/parity
[ 8564.316412] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to set baudrate
[ 8564.324032] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 8564.331160] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 8564.337661] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 8564.344415] ftdi_sio ttyUSB0: failed to get modem status: -32
[ 8564.353790] ftdi_sio ttyUSB0: ftdi_set_termios FAILED to set databits/stopbits/parity
[ 8564.362411] ftdi_sio ttyUSB0: ftdi_set_termios urb failed to
set baudrate
[ 8564.369917] ftdi_sio ttyUSB0: failed to set flow control: -32
[ 8586.585832] ftdi_sio ttyUSB0: failed to get modem status: -32
답변1
이 장치는 USB CDC 클래스 표준을 준수합니다. "일반" 직렬 장치를 직접 사용할 수 있습니다. rpi3 및 Debian bookworm에서 테스트한 결과 약 1.8kByte의 응답으로 포트가 열리고 장치 정보 메시지를 올바르게 읽을 수 있습니다.
ACTION=="add", \
ATTRS{idVendor}=="0eb8", \
ATTRS{idProduct}=="ea02", \
RUN+="/usr/sbin/modprobe usbserial" \
RUN+="/bin/sh -c 'echo 0eb8 ea02 > /sys/bus/usb-serial/drivers/generic/new_id'"
통나무
[ 6303.984478] usb 1-1.3: new full-speed USB device number 11 using dwc2
[ 6304.095741] usb 1-1.3: not running at top speed; connect to a high speed hub
[ 6304.116616] usb 1-1.3: New USB device found, idVendor=0eb8, idProduct=ea02, bcdDevice= 0.00
[ 6304.129901] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6304.139771] usb 1-1.3: Product: Seven Excellence
[ 6304.146830] usb 1-1.3: Manufacturer: Mettler-Toledo
[ 6304.154119] usb 1-1.3: SerialNumber: A000000000
[ 6304.162207] usbserial_generic 1-1.3:1.0: The "generic" usb-serial driver is only for testing and one-off prototypes.
[ 6304.175985] usbserial_generic 1-1.3:1.0: Tell [email protected] to add your device to a proper driver.
[ 6304.189463] usbserial_generic 1-1.3:1.0: generic converter detected
[ 6304.198137] usb 1-1.3: generic converter now attached to ttyUSB0
답변2
같은 문제가 있는 사람을 위해. 마지막으로 드라이버 문제가 있습니다. ftdi_sio가 이 장치에 적합하지 않은 이유와 무엇을 해야 할지 모르겠습니다.
유효한 드라이버는 다음과 같습니다. https://github.com/pyusb/pyusb.
파이썬을 사용하도록 강요하지만 적어도 작동합니다.