私は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でテストしましたが、うまく機能し、データ型がうまくいきました。しかし、Linuxでは失敗します。私は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。
Pythonの使用を強制しますが、少なくとも動作します。