web-dev-qa-db-ja.com

PL2303 / PL2303X USB-シリアルドライバー

OS:Linux Mint 19 Tara(Ubuntu 18.04 LTSおよびUbuntu 14.04 LTSでもテスト済み)

カーネル:4.15.0-20-generic

ハードウェアをLinuxホストに接続するためのPL2303Xチップを備えたUSBシリアルアダプターを持っています。デバイスはlsusb経由で接続されているように見えますが、データを送受信できません。 moserialPuTTYを使用してデータを送受信しようとしました。コマンドを送信しようとすると、応答データが返されず、dmesgまたは/var/log/syslogに変更がないことに気付きました。

同じUSBシリアルアダプターがWindows 10と同じDellラップトップモデルに接続して動作します。 Windowsでは、コマンドを受信し、以下のポート設定で構成されたデータを返すことができます。

次のポート設定を使用したいのですが、moserialとPuTTYを使用して次のバリエーションを試しました(パリティなし、ボーレートの違い、ハードウェア/ソフトウェアのハンドシェイクなど)。

Device: /dev/ttyUSB0 (permissions 666, $USER added to `dialout` group)
Baud rate: 9600
Data bits: 8    
Stop bits: 1    
Parity: Even    
Handshake: none    
Access mode: read and write

Windowsは、上記の設定(つまり、パリティなし、7データビット、ボーレートの低下/上昇など)の変更にも対応しています。

コマンドを送信し、Windowsを使用したデバイスの動作と同様のデータを受信できるようにする必要があります。できれば、上記のポート設定を使用します。

これを修正またはデバッグする方法に関するアイデアはありますか?それは有り難いです。


より詳しい情報:

lsusb出力は、デバイスをBus 001 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Portとして識別します

に基づく

$ lsusb -v -d 067b:2303
bMaxPacketSize0 64

アダプタにはPL2303XではなくPL2303チップが搭載されていると思います(ソース: PL2303&Pl2303x usb serial device )。

/var/log/syslogに「MTPデバイスではありません」というメッセージと「未処理のアクション「バインド」」というメッセージが表示されます。

 
カーネル:[7436.378438] usb 1-2:xhci_hcd 
カーネルを使用した新しいフルスピードUSBデバイス番号18:[7436.528244] usb 1-2:新しいUSBデバイスが見つかりました、 idVendor = 067b、idProduct = 2303 
カーネル:[7436.528250] usb 1-2:新しいUSBデバイス文字列:Mfr = 1、Product = 2、SerialNumber = 0 
カーネル:[7436.528253] usb 1 -2:製品:USB-Serial Controller 
カーネル:[7436.528256] usb 1-2:製造元:Prolific Technology Inc。
カーネル:[7436.529219] pl2303 1-2:1.0:pl2303コンバーターが検出されました
カーネル:[7436.530024] usb 1-2:pl2303コンバーターがttyUSB0に接続されました
 mtp-probe:バス1、デバイス18をチェックしています: "/ sys/devices/pci0000:00/0000:00 :14.0/usb1/1-2 "
 mtp-probe:bus:1、device:18 was a MTP device 
 upowerd [1238]:unhandled action 'bind' on/sys/devices /pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0
 upowerd [1238]:/ sys/devices/pci0000:00/0000:00の未処理のアクション「バインド」 :14.0/usb1/1-2 
 

古いパッチを Prolific PL-2303X USB-シリアルアダプター用のLinuxカーネルモジュールパッチ で見つけましたが、メインのカーネルツリーには2.6.8以降のPL-2303Xサポートが含まれていると記載されています。

$ lsusb -v -d 067b:2303

Bus 001 Device 018: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x067b Prolific Technology, Inc.
  idProduct          0x2303 PL2303 Serial Port
  bcdDevice            3.00
  iManufacturer           1 
  iProduct                2 
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           39
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x000a  1x 10 bytes
        bInterval               1
      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
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0

dmesgデバイスを接続した後:

 
 [7436.378438] usb 1-2:xhci_hcdを使用した新しいフルスピードUSBデバイス番号18 
 [7436.528244] usb 1-2:新しいUSBデバイスが見つかりました、idVendor = 067b、 idProduct = 2303 
 [7436.528250] usb 1-2:新しいUSBデバイス文字列:Mfr = 1、Product = 2、SerialNumber = 0 
 [7436.528253] usb 1-2:製品:USB-Serialコントローラ
 [7436.528256] usb 1-2:製造元:Prolific Technology Inc。
 [7436.529219] pl2303 1-2:1.0:pl2303コンバーターが検出されました
 [7436.530024] usb 1-2 :pl2303コンバーターがttyUSB0に接続されました
 

以下のerror sending break = -19メッセージも見ましたが、再現に問題があります。

 
 [1382.828306] usb 1-2:xhci_hcdを使用した新しいフルスピードUSBデバイス番号6 
 [1382.977353] usb 1-2:新しいUSBデバイスが見つかりました、idVendor = 067b、 idProduct = 2303 
 [1382.977357] usb 1-2:新しいUSBデバイス文字列:Mfr = 1、Product = 2、SerialNumber = 0 
 [1382.977360] usb 1-2:製品:USB-Serialコントローラ
 [1382.977363] usb 1-2:製造元:Prolific Technology Inc。
 [1382.978125] pl2303 1-2:1.0:pl2303コンバーターが検出されました
 [1382.978753] usb 1-2 :pl2303コンバーターがttyUSB0 
に接続されました[1481.678435] usb 1-2:USB切断、デバイス番号6 
 [1481.678645] pl2303 ttyUSB0:エラー送信ブレーク= -19 
 [1481.678821 ] pl2303 ttyUSB0:pl2303コンバーターがttyUSB0から切断されました
 [1481.678859] pl2303 1-2:1.0:デバイスが切断されました
 
3
khe11e

「通常、通信ケーブルは3つのピン(RXD、TXD、およびGNDのみを使用します。このデバイスには、ホストからのDTR信号によって制御されるハードウェアリセットピンがあります。」を説明する古いマニュアルを見つけました。

確認しましたDTR = 1を実行してSudo statserial /dev/ttyUSB0

 
デバイス:/dev/ttyUSB0

信号ピンピンの方向ステータスフル
名前(25)(9)(コンピュータ)名前
 ----- --- --- --------- ------ ----- 
 FG 1---フレームグラウンド
 TxD 2 3 out-データの送信
 RxD 3 2 in-データの受信
 RTS 4 7 out 1送信要求
 CTS 5 8 in 0送信クリア
 DSR 6 6 in 0データセットレディ
 GND 7 5--信号グランド
 DCD 8 1 in 0データキャリア検出
 DTR 20 4 out 1データターミナルレディ
 RI 22 9 in 0 Ring Indicator 
 

次に、以下を追加して、Dコードを0に設定するようにCコードを変更しました。

#include <sys/ioctl.h>
...
// then on connect, added the following:
int DTR_flag = TIOCM_DTR;   // modem constant for DTR pin.
ioctl(fd, TIOCMBIC, &DTR_flag);   // sets DTR = 0

[@dirktをご利用いただきありがとうございます。

2
khe11e