PL2303/PL2303X USB 串行驱动程序

PL2303/PL2303X USB 串行驱动程序

操作系统:Linux Mint 19 Tara(也在 Ubuntu 18.04 LTS 和 Ubuntu 14.04 LTS 上进行了测试)

核心:4.15.0-20-generic

我有一个带有 PL2303X 芯片的 USB 串行适配器,用于将硬件连接到 Linux 主机。该设备显示为通过 已连接lsusb,但我无法发送和接收数据。我尝试使用moserial和发送/接收数据putty;当尝试发送命令时,没有返回响应数据,并且我注意到dmesg或没有变化/var/log/syslog

相同的 USB 串行适配器可连接并在运行 Windows 10 的相同戴尔笔记本电脑型号上运行;在 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 串行设备)。

我注意到消息“不是 MTP 设备”和“未处理的操作‘绑定’” /var/log/syslog

kernel: [ 7436.378438] usb 1-2: new full-speed USB device number 18 using xhci_hcd
kernel: [ 7436.528244] usb 1-2: New USB device found, idVendor=067b, idProduct=2303
kernel: [ 7436.528250] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
kernel: [ 7436.528253] usb 1-2: Product: USB-Serial Controller
kernel: [ 7436.528256] usb 1-2: Manufacturer: Prolific Technology Inc.
kernel: [ 7436.529219] pl2303 1-2:1.0: pl2303 converter detected
kernel: [ 7436.530024] usb 1-2: pl2303 converter now attached to ttyUSB0
mtp-probe: checking bus 1, device 18: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-2"
mtp-probe: bus: 1, device: 18 was not an 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]: unhandled action 'bind' on /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: new full-speed USB device number 18 using xhci_hcd
[ 7436.528244] usb 1-2: New USB device found, idVendor=067b, idProduct=2303
[ 7436.528250] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 7436.528253] usb 1-2: Product: USB-Serial Controller
[ 7436.528256] usb 1-2: Manufacturer: Prolific Technology Inc.
[ 7436.529219] pl2303 1-2:1.0: pl2303 converter detected
[ 7436.530024] usb 1-2: pl2303 converter now attached to ttyUSB0

也看到了error sending break = -19下面的消息,但我无法复制它:

[ 1382.828306] usb 1-2: new full-speed USB device number 6 using xhci_hcd
[ 1382.977353] usb 1-2: New USB device found, idVendor=067b, idProduct=2303
[ 1382.977357] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1382.977360] usb 1-2: Product: USB-Serial Controller
[ 1382.977363] usb 1-2: Manufacturer: Prolific Technology Inc.
[ 1382.978125] pl2303 1-2:1.0: pl2303 converter detected
[ 1382.978753] usb 1-2: pl2303 converter now attached to ttyUSB0
[ 1481.678435] usb 1-2: USB disconnect, device number 6
[ 1481.678645] pl2303 ttyUSB0: error sending break = -19
[ 1481.678821] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0
[ 1481.678859] pl2303 1-2:1.0: device disconnected

答案1

(编辑:根据@dirkt的评论更新。谢谢)

我找到了该设备的旧手册,其中解释了“通常的通信电缆仅使用 3 个引脚(RXD、TXD 和 GND)。该设备有一个硬件复位引脚,由来自主机的 DTR 信号控制。”

DTR = 1通过运行确认sudo statserial /dev/ttyUSB0

    设备:/dev/ttyUSB0
    
    信号引脚 引脚方向 状态 Full
    姓名 (25) (9)(计算机)姓名
    ----- --- --- --------- ------ -----
    FG 1 - - - 框架接地
    TxD 2 3 输出 - 发送数据
    RxD 3 2 英寸 - 接收数据
    RTS 4 7 out 1 请求发送
    CTS 5 8 合 0 清除发送
    DSR 6 6 合 0 数据集就绪
    GND 7 5 - - 信号地
    DCD 8 1 合 0 数据载波检测
    DTR 20 4 出 1 数据终端就绪
    RI 22 9合0环形指示灯

然后我修改了我的 C 代码以通过添加以下内容来设置 DTR = 0:

#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的帮助,也感谢大家的观看。]

相关内容