Linux 上的串行通信连接

Posted

技术标签:

【中文标题】Linux 上的串行通信连接【英文标题】:Serial Comm Connection on Linux 【发布时间】:2014-04-12 05:09:17 【问题描述】:

我有一个RedBee RFID Reader。它的用户文档仅适用于 windows,我在 ArchLinux 上。我唯一一次通过 USB 端口进行串行通信是针对Arduino,那是通过他们的 GUI 环境,所以我从未接触过金属。所以我有这个 RFID 阅读器,您可以通过 USB 端口上的串行通信与之交互。波特率为9600,设备连接到/dev/bus/usb/004/004ls -l /dev/bus/usb/004/004 的输出为:

crwxrwxrwx 1 root root 189, 387 Mar  8 19:14 /dev/bus/usb/004/004

lsusb 的输出是

Bus 004 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-
Serial (UART) IC
Bus 004 Device 003: ID 0cf3:3005 Atheros Communications, Inc. AR3011 Bluetooth
...

lsusb -s 004:004 -v 的输出为:

Bus 004 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x0403 Future Technology Devices International, Ltd
  idProduct          0x6001 FT232 USB-Serial (UART) IC
  bcdDevice            6.00
  iManufacturer           1 FTDI
  iProduct                2 FT232R USB UART
  iSerial                 3 A900DGX9
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower               90mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              2 FT232R USB UART
      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
Device Status:     0x0000
  (Bus Powered)

这是dmsg | grep -i tty的输出

[    0.000000] console [tty0] enabled
[    7.226118] systemd[1]: Starting system-getty.slice.
[    7.226397] systemd[1]: Created slice system-getty.slice.
[   10.535204] usb 4-1.7: FTDI USB Serial Device converter now attached to ttyUSB0
[ 6372.435916] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[ 7961.660760] usb 4-1.7: FTDI USB Serial Device converter now attached to ttyUSB0
[ 7964.716225] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[ 8282.582961] usb 4-1.7: FTDI USB Serial Device converter now attached to ttyUSB0

我尝试过的事情:

我尝试使用 putty 的(为 linux 编译)串行选项连接到 /dev/bus/usb/004/004,但它的响应是:

Unable to open connection to:
Unable to configure serial port

【问题讨论】:

显示 dmesg | grep -i tty 好电话。添加它,现在看到我需要连接到/dev/ttyUSB0 【参考方案1】:

解决方案是使用dmesg | grep -i tty 获取设备已连接的 TTY。就我而言,我需要连接到 /dev/ttyUSB0 而不是 /dev/bus/usb/004/004

更多信息

dmesg

【讨论】:

【参考方案2】:

这样您可以自动检测您应该使用哪个设备(将 FT232R_USB_UART 替换为型号):

   #!/bin/sh

   PORT=""

   for i in /dev/ttyUSB* ; do
       if [ "x`udevadm info $i | grep 'ID_MODEL=FT232R_USB_UART'`" != "x" ] ; then
           PORT=$i
       fi
   done

   if [ "x$PORT" = "x" ] ; then
       echo "No FT232R_USB_UART port found!" 1>&2
       exit 1
   fi

   echo "PORT = $PORT"

【讨论】:

以上是关于Linux 上的串行通信连接的主要内容,如果未能解决你的问题,请参考以下文章

没有与连接的串行端口通信?

Linux下的虚假串行通信

串行通信 C++

Raspberry Pi 上的 Tornado 使用 websockets 以及监控串行端口 Arduino 通信

如何在 Linux 上通过 C++ 中的串行接口与 Arduino 通信?

串行通信 C++ ReadFile()