Linux串口设备查看全攻略:从基础命令到高级排查技巧

📅 2026/8/13 3:14:27
Linux串口设备查看全攻略:从基础命令到高级排查技巧
1. 项目概述为什么需要查看Linux串口在嵌入式开发、工控调试或者玩转树莓派这类单板计算机时串口Serial Port往往是工程师和爱好者们与硬件世界对话的第一道桥梁。无论是给单片机烧录程序、调试无显示界面的设备还是查看系统启动的原始日志串口通信都扮演着至关重要的角色。然而当你把一块USB转串口线插上运行Linux的电脑或者面对一台自带多个串口端口的工控机时第一个问题往往就是系统识别到这个设备了吗它被映射成了哪个设备文件这就是“查看本机串口”这个看似简单操作背后的核心需求。我遇到过不少新手朋友插上线后满世界找“我的电脑”里的COM3、COM4结果在Linux终端前束手无策。Linux系统将一切设备抽象为文件串口设备通常表现为/dev/ttyS*、/dev/ttyUSB*或/dev/ttyACM*这样的文件。弄清楚当前系统有哪些可用的串口以及它们的详细信息如设备节点、驱动类型、硬件地址等是进行任何后续串口操作如使用minicom、screen或编程调用的绝对前提。这个需求贯穿了从设备连接验证、驱动排查到应用配置的全过程。2. 核心思路多维度探查与信息交叉验证查看Linux串口绝非一个单一命令就能完全搞定的事情它更像是一个系统性的探查过程。一个合格的从业者不会只依赖一种方法而是通过多个维度的命令和工具进行交叉验证从而构建出完整的串口设备图谱。核心思路可以归纳为以下三点2.1 从设备文件系统直接列举最直接的方式就是查看/dev目录下与串口相关的设备文件。这是结果的直观呈现能快速告诉你系统“认为”有哪些串口设备节点存在。2.2 查询内核与硬件信息通过查询系统内核的日志、硬件列表和驱动模块信息可以了解串口设备的“身世”它是主板自带的UARTttyS还是USB转接的ttyUSB或者是CDC ACM类的USB设备ttyACM其对应的物理地址如I/O端口、USB总线号设备号是什么这个维度帮助我们理解设备的来源和硬件特性。2.3 检查系统资源与占用情况知道设备存在还不够有时还需要知道它是否被某个进程占用或者其配置参数如波特率当前是什么状态。这对于调试“设备突然无法打开”的问题至关重要。基于这个思路我们将方法分为几个层次快速查看、详细信息获取和高级诊断。3. 基础方法快速定位串口设备文件对于大多数快速验证场景我们首先需要知道设备插上后在/dev目录下生成了什么。3.1 使用ls命令直接列出这是最入门的方法。打开终端直接列出/dev目录下所有以tty开头的设备并通过grep进行过滤。ls /dev/tty*这条命令会列出所有tty设备包括虚拟终端和控制台信息比较杂。通常我们会结合grep来筛选常见的串口设备模式ls /dev/ttyS* /dev/ttyUSB* /dev/ttyACM* 2/dev/null命令解析ls /dev/ttyS*列出所有传统串口Serial通常是主板上的COM口在Linux中对应ttyS0、ttyS1等。ls /dev/ttyUSB*列出所有通过USB转串口芯片如PL2303、CH340、FT232创建的设备。ls /dev/ttyACM*列出所有CDC ACMAbstract Control Model设备常见于一些USB调制解调器或开发板如Arduino Leonardo/Micro的USB串口。2/dev/null这是一个重要的技巧。如果某个模式没有匹配到任何文件例如系统根本没有ttyACM设备ls命令会输出一个“No such file or directory”的错误到标准错误流stderr。2/dev/null的作用就是将标准错误流重定向到“黑洞”/dev/null从而抑制这些错误信息让输出界面更干净。实操心得 单纯使用ls命令你只能看到一个设备文件名列表。如果插上USB串口线后这里没有出现新的ttyUSB*设备那第一反应就应该是驱动问题。例如经典的CH340芯片在较新的内核中可能已内置驱动但若使用旧系统可能需要手动安装ch340驱动模块。3.2 借助dmesg内核日志追踪当设备插入的瞬间Linux内核会输出大量的日志信息其中就包含设备识别和创建设备节点的关键记录。dmesg命令是查看这些内核环形缓冲区消息的利器。插入USB转串口线后立即在终端运行sudo dmesg | tail -30或者更精确地过滤与tty、usb相关的信息sudo dmesg | grep -E \tty|usb\输出示例与解析[ 1234.567890] usb 1-1.2: new full-speed USB device number 5 using ehci-pci [ 1234.698765] usb 1-1.2: New USB device found, idVendor1a86, idProduct7523 [ 1234.698768] usb 1-1.2: New USB device strings: Mfr0, Product2, SerialNumber0 [ 1234.698770] usb 1-1.2: Product: USB2.0-Serial [ 1234.701234] ch341 1-1.2:1.0: ch341-uart converter detected [ 1234.702345] usb 1-1.2: ch341-uart converter now attached to ttyUSB0这段日志告诉你系统识别到了一个新USB设备总线1-1.2设备号5。该设备的供应商IDidVendor是1a86产品IDidProduct是7523这正是沁恒WCHCH340芯片的标识。内核加载了ch341驱动CH340驱动在内核中的模块名可能是ch341。最终该设备被创建为/dev/ttyUSB0。排查价值 如果dmesg中能看到设备被识别找到idVendor/idProduct但没有出现“attached to ttyUSBx”的最后一行往往意味着驱动加载或设备节点创建失败需要进一步检查驱动。如果根本看不到任何相关记录那可能是USB端口物理连接问题、USB控制器驱动问题或者设备本身已损坏。4. 进阶方法获取串口详细信息知道设备名之后我们通常需要了解更多细节以便在代码或配置文件中精确使用。4.1 查询系统设备树lsusb与lspcilsusb和lspci是查看USB和PCI总线设备的权威工具能提供最底层的硬件信息。使用lsusb查看USB串口转换器lsusb输出类似Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics CH340 serial converter这里清晰地显示了设备所在的USB总线Bus 001、设备号Device 005、厂商ID和产品ID以及设备描述。这对于确认设备是否被系统正确枚举至关重要。要查看更详细的信息可以使用lsusb -v但输出信息会非常庞大通常配合grep使用例如lsusb -v -d 1a86:7523查看指定设备的详细描述符。使用lspci查看主板集成串口 对于主板上的原生串口通常对应/dev/ttyS0等它们是通过PCI或LPC总线连接的。运行lspci可以查看所有PCI设备然后过滤出串口控制器lspci | grep -i serial输出可能类似00:16.3 Serial controller: Intel Corporation Comet Lake PCH-H Serial IO UART Host Controller这告诉你系统有一个Intel芯片组提供的串行控制器它通常会被内核驱动映射为ttyS设备。4.2 探查设备符号链接ls -l /dev/serial/by-id/与by-path//dev目录下有两个非常有用的结构化目录/dev/serial/by-id/和/dev/serial/by-path/。它们包含了指向实际设备文件如ttyUSB0的符号链接其名称具有稳定性和描述性。by-id链接名包含设备的唯一标识符通常来自USB设备的序列号或产品ID。即使设备插入的USB端口顺序变了这个链接名也不会变这对于编写稳定的脚本或配置非常有用。ls -l /dev/serial/by-id/输出示例lrwxrwxrwx 1 root root 13 Apr 10 10:30 usb-1a86_USB2.0-Serial-if00-port0 - ../../ttyUSB0by-path链接名描述的是设备连接的物理路径如哪个USB控制器、哪个集线器、哪个端口。ls -l /dev/serial/by-path/输出示例lrwxrwxrwx 1 root root 13 Apr 10 10:30 pci-0000:00:14.0-usb-0:1.2:1.0-port0 - ../../ttyUSB0这个路径pci-0000:00:14.0-usb-0:1.2:1.0精确地描述了设备在系统中的物理位置。注意事项 这两个目录并非所有Linux发行版都默认创建通常由udev规则管理。主流的桌面发行版Ubuntu, Fedora, Debian等一般都有。如果找不到这两个目录可能需要检查udev规则或你的发行版是否提供了相应的软件包。4.3 使用setserial查询传统串口参数对于传统的ttyS*设备主板COM口setserial是一个古老的但专业的工具用于查看和设置底层硬件参数。虽然现在很多参数由内核自动管理但用它来查询信息仍然很可靠。sudo setserial -g /dev/ttyS0输出示例与解析/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4UART: 16550A告诉你这个串口控制器使用的UART芯片型号是16550A这是一个经典的异步通信芯片。Port: 0x03f8这是该串口在I/O地址空间中的基地址。COM1通常对应0x3F8。IRQ: 4这是该串口使用的中断请求号。COM1通常对应IRQ 4。重要提示setserial主要对ttyS*有效。对于USB转串口设备ttyUSB*这些硬件参数是虚拟的由USB转串口芯片的驱动模拟使用setserial查看到的信息可能不准确或无意义。对于USB串口更应关注lsusb和驱动信息。5. 专业工具与系统级查看当需要更全面、更系统化的视图时或者在进行自动化脚本编写时以下工具和方法更为高效。5.1 综合信息工具udevadmudev是Linux系统中管理设备节点的守护进程。udevadm是其管理工具可以输出极其详细的设备信息包括所有属性、驱动、父设备等是深度调试的终极武器。查询一个已知设备节点如ttyUSB0的详细信息sudo udevadm info --name/dev/ttyUSB0 --attribute-walk这个命令会以树状结构向上遍历该设备的所有父级设备并打印出每一步的sysfs属性。输出信息量巨大但你可以从中找到一切供应商IDID_VENDOR_ID、产品IDID_MODEL_ID、驱动DRIVER、设备路径ID_PATH等。通常我们会用grep过滤关键信息sudo udevadm info --name/dev/ttyUSB0 --queryall这条命令的查询结果更规整。要快速获取稳定标识可以sudo udevadm info --name/dev/ttyUSB0 --queryproperty | grep \ID_SERIAL\5.2 查看内核已加载的串口驱动了解当前内核加载了哪些串口相关的驱动模块有助于判断驱动是否正常。lsmod | grep -E \usbserial|ch34|pl23|ftdi_sio\usbserial这是USB转串口的核心框架模块大多数USB转串口驱动都依赖它。ch34沁恒CH34x系列芯片驱动。pl23Prolific PL2303芯片驱动。ftdi_sioFTDI FT232等芯片驱动。如果对应的驱动模块没有加载即使设备插入dmesg里可能能看到设备但不会创建ttyUSB*节点。这时需要手动加载模块例如sudo modprobe ch341。5.3 使用stty查看当前串口终端设置stty命令用于检查和修改终端tty的线路设置。虽然它主要用于交互式终端但串口本质上也是一个tty设备。你可以用它来查看某个串口设备当前的通信参数设置。stty -F /dev/ttyUSB0输出示例speed 9600 baud; line 0; -brkint -imaxbel这里speed 9600 baud表示当前该设备文件的波特率被设置为9600。stty查看的是当前设备文件打开状态的设置如果设备未被任何进程以特定参数打开它可能显示的是默认值。这个命令在调试“为什么数据收发不对”时有用可以快速确认端口的基础配置是否被意外修改。6. 脚本化与自动化查看方案在嵌入式开发或自动化测试环境中我们经常需要编写脚本来自动识别和配置串口。下面分享几个实用的脚本片段。6.1 自动列出所有可用串口设备脚本一个健壮的脚本应该结合多种方法并输出清晰的信息。#!/bin/bash echo \ 可用串口设备列表 \ # 1. 检查 /dev 下的标准设备文件 echo \1. 标准设备文件 (/dev):\ for dev in $(ls /dev/ttyS* /dev/ttyUSB* /dev/ttyACM* 2/dev/null); do if [ -c \$dev\ ]; then # 检查是否是字符设备文件 echo \ $dev\ fi done # 2. 检查 /dev/serial/by-id/ 下的稳定链接 echo -e \\\n2. 稳定设备ID链接 (/dev/serial/by-id/):\ if [ -d \/dev/serial/by-id/\ ]; then for link in /dev/serial/by-id/*; do if [ -L \$link\ ]; then real_dev$(readlink -f \$link\) echo \ $(basename $link) - $real_dev\ fi done else echo \ 目录 /dev/serial/by-id/ 不存在。\ fi # 3. 通过udevadm获取详细信息示例以第一个ttyUSB为例 echo -e \\\n3. 第一个USB串口详细信息示例:\ first_usb$(ls /dev/ttyUSB* 2/dev/null | head -1) if [ -n \$first_usb\ ]; then echo \ 设备: $first_usb\ vendor_product$(sudo udevadm info --name$first_usb --queryproperty 2/dev/null | grep -E \ID_VENDOR_ID|ID_MODEL_ID\ | tr \\n ) echo \ 供应商与产品ID: $vendor_product\ driver$(sudo udevadm info --name$first_usb --queryproperty 2/dev/null | grep \DRIVER\) echo \ 驱动: $driver\ else echo \ 未找到USB串口设备。\ fi6.2 根据特定硬件ID定位设备如果你有多个相同型号的USB转串口线并且需要稳定地区分它们利用/dev/serial/by-id/是最佳实践。但有时by-id目录可能不可用这时可以通过udevadm匹配硬件ID来定位。#!/bin/bash # 目标设备的USB厂商和产品ID TARGET_VENDOR_ID\1a86\ TARGET_PRODUCT_ID\7523\ for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do ( syspath\${sysdevpath%/dev}\ devname\$(udevadm info -q name -p $syspath 2/dev/null)\ [[ \$devname\ ttyUSB* ]] || continue eval \$(udevadm info -q property --export -p $syspath)\ if [[ \$ID_VENDOR_ID\ \$TARGET_VENDOR_ID\ \$ID_MODEL_ID\ \$TARGET_PRODUCT_ID\ ]]; then echo \/dev/$devname\ fi ) done这个脚本会遍历/sys文件系统中所有的USB设备找出与指定VENDOR_ID和PRODUCT_ID匹配的ttyUSB设备并输出其设备节点。这种方法不依赖于/dev/serial/by-id/目录更底层也更具可移植性。7. 常见问题排查与实战技巧在实际操作中你肯定会遇到各种“坑”。下面是我总结的一些典型问题及解决方法。7.1 问题插入USB串口线后/dev下没有出现ttyUSB*设备这是最常见的问题。请按照以下步骤排查检查内核消息首先运行sudo dmesg | tail查看插入设备瞬间的日志。关注是否有错误信息如device descriptor read/64, error -110可能是供电不足或接触不良或pl2303: probe failed驱动探测失败。确认驱动加载运行lsmod | grep usbserial以及具体芯片驱动如ch341。如果没加载尝试手动加载sudo modprobe usbserial和sudo modprobe ch341。如果模块不存在说明内核未编译该驱动需要安装相应内核模块包或重新编译内核。检查设备权限有时设备文件已创建但当前用户没有读写权限。使用ls -l /dev/ttyUSB0查看权限。通常属于dialout或uucp组。将当前用户加入该组sudo usermod -aG dialout $USER然后注销并重新登录生效。尝试不同USB口某些USB口尤其是机箱前置面板可能供电不稳换到主板后置USB口试试。检查硬件ID是否被内核支持使用lsusb找到设备的ID xxxx:xxxx。然后去内核源码的drivers/usb/serial目录下查找或在线搜索该ID是否被某个驱动支持。有些较新的芯片型号可能需要更新内核或使用第三方驱动。7.2 问题设备节点时有时无或者编号不固定如今天ttyUSB0明天变ttyUSB1根本原因Linux内核根据设备注册的顺序动态分配ttyUSBx编号。如果多个相同设备插入顺序不同或者每次启动时USB设备枚举顺序有微小差异就会导致编号变化。最佳解决方案永远不要在生产脚本或配置中硬编码ttyUSB0。使用/dev/serial/by-id/或/dev/serial/by-path/下的符号链接。这些链接名是稳定的。备用方案如果by-id目录不可用可以编写udev规则根据设备的唯一属性如USB序列号创建一个固定的设备符号链接。例如创建文件/etc/udev/rules.d/99-my-usb-serial.rulesSUBSYSTEM\tty\, ATTRS{idVendor}\1a86\, ATTRS{idProduct}\7523\, SYMLINK\my_stable_serial_port\重启或重新加载udev规则(sudo udevadm control --reload-rules sudo udevadm trigger)后无论设备变成ttyUSB几都会有一个固定的/dev/my_stable_serial_port链接指向它。7.3 问题可以打开串口但无法收发数据检查波特率等参数确保发送方和接收方的波特率、数据位、停止位、校验位完全一致。使用stty -F /dev/ttyUSB0可以查看当前设置使用stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb可以设置波特率1152008数据位1停止位无校验。检查流控确认硬件流控RTS/CTS是否需要。在不需要的情况下确保在串口工具或程序中禁用了流控。stty命令也可以设置-crtscts来禁用。使用cat或echo进行基础测试在一个终端用cat监听cat /dev/ttyUSB0。在另一个终端发送数据echo \test\ /dev/ttyUSB0。如果监听端能收到说明底层通信是通的问题可能出在高级应用层。检查线序对于RS232串口确保TX、RX、GND三根线正确交叉连接A设备的TX接B设备的RXGND对接。对于USB转串口线通常直接连接设备即可。7.4 问题权限不足提示“Permission denied”每次使用sudo很麻烦。长期解决方案是将用户加入正确的组。对于大多数发行版串口设备属于dialout组sudo usermod -aG dialout $USER有些系统如Arch Linux可能使用uucp组sudo usermod -aG uucp $USER执行后必须注销并重新登录或者开启新的登录会话组权限变更才会生效。你可以用groups命令确认当前用户是否已在dialout或uucp组中。7.5 高级技巧使用socat创建虚拟串口对进行测试当你没有物理串口设备但又需要测试串口通信程序时socat工具可以创建一对虚拟的、相互连接的伪终端PTY模拟串口行为。socat -d -d pty,raw,echo0 pty,raw,echo0执行后socat会输出两个伪终端设备路径例如/dev/pts/3和/dev/pts/4。这两个设备就像一根虚拟的串口线连接在一起向其中一个写入数据会从另一个读出。你可以让一个程序打开/dev/pts/3另一个程序打开/dev/pts/4进行本地回环测试无需任何硬件。这在开发初期验证逻辑非常有用。