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/004
。 ls -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 上的串行通信连接的主要内容,如果未能解决你的问题,请参考以下文章
Raspberry Pi 上的 Tornado 使用 websockets 以及监控串行端口 Arduino 通信