菜鸟科技网

Linux如何用命令读取串口数据?

在Linux系统中,读取串口数据是嵌入式开发、工业控制、设备通信等场景中的常见需求,通过命令行工具或编程接口,用户可以高效地实现串口数据的接收与解析,以下将详细介绍Linux环境下读取串口的命令方法、配置步骤及注意事项。

Linux如何用命令读取串口数据?-图1
(图片来源网络,侵删)

串口基础概念

串口(Serial Port)是一种串行通信接口,常用于设备间的低速数据传输,在Linux中,串口设备通常被表示为字符设备文件,位于/dev/目录下,如/dev/ttyS0(主板串口)、/dev/ttyUSB0(USB转串口设备)等,要正确读取串口数据,需先确保设备已连接并被系统识别,同时配置串口参数(波特率、数据位、停止位、校验位等)以匹配通信双方的要求。

查看串口设备

在操作串口前,需确认系统是否识别到串口设备,可通过以下命令列出所有串口设备:

ls /dev/ttyS* /dev/ttyUSB* /dev/ttyACM*

/dev/ttyS*为传统串口,/dev/ttyUSB*为USB转串口,/dev/ttyACM*通常为调制解调器类设备,若设备未显示,可检查dmesg日志确认内核是否识别:

dmesg | grep -i "tty"

配置串口参数

串口通信需确保双方参数一致,常用配置包括:

Linux如何用命令读取串口数据?-图2
(图片来源网络,侵删)
  • 波特率(Baud Rate):如9600、19200、115200等。
  • 数据位(Data Bits):通常为8位。
  • 停止位(Stop Bits):通常为1位。
  • 校验位(Parity):无校验(None)、奇校验(Odd)、偶校验(Even)。
  • 流控(Flow Control):无流控(None)、硬件流控(RTS/CTS)、软件流控(XON/XOFF)。

Linux提供了stty命令用于配置串口参数,配置/dev/ttyUSB0为115200波特率、8数据位、无校验、1停止位、无流控:

stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts

参数说明:

  • -F:指定设备文件。
  • cs8:8位数据位。
  • -cstopb:1位停止位(cstopb表示2位停止位)。
  • -parenb:无校验(parenb表示启用校验,parodd表示奇校验)。
  • -crtscts:无硬件流控(crtscts表示启用硬件流控)。

读取串口数据

使用cat命令

cat命令可直接读取串口数据,适合简单场景:

cat /dev/ttyUSB0

缺点:无法实时处理数据,且无法直接退出(需使用Ctrl+C强制终止)。

Linux如何用命令读取串口数据?-图3
(图片来源网络,侵删)

使用minicom工具

minicom是一款功能强大的串口终端工具,支持交互式操作和配置,安装方法:

sudo apt install minicom  # Debian/Ubuntu
sudo yum install minicom  # CentOS/RHEL

配置minicom

sudo minicom -s

进入配置界面后,选择“Serial port setup”,设置串口设备(如/dev/ttyUSB0)、波特率等参数,保存后退出,启动minicom

minicom -D /dev/ttyUSB0

优点:支持本地回环、文件传输等功能,适合调试设备交互。

使用screen工具

screen是轻量级的终端复用工具,也可用于串口通信,安装方法:

sudo apt install screen  # Debian/Ubuntu
sudo yum install screen  # CentOS/RHEL

启动screen并指定串口:

screen /dev/ttyUSB0 115200

退出时需先按Ctrl+A,再按K,确认后关闭会话。

使用dd命令

dd命令可用于高效读取串口数据并重定向到文件或管道:

dd if=/dev/ttyUSB0 of=data.txt bs=1

参数说明:

  • if:输入文件(串口设备)。
  • of:输出文件。
  • bs=1:每次读取1字节(可根据需求调整)。

使用python脚本

对于复杂场景,可通过Python的pyserial库读取串口数据,安装pyserial

pip install pyserial

示例脚本:

import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
while True:
    if ser.in_waiting > 0:
        data = ser.readline().decode('utf-8').strip()
        print("Received:", data)
ser.close()

常见问题与解决方法

  1. 权限问题:普通用户可能无法访问串口设备,需将用户加入dialout组(Ubuntu/Debian)或uucp组(CentOS/RHEL):

    sudo usermod -aG dialout $USER

    修改后需重新登录生效。

  2. 设备占用:若串口被其他进程占用,可通过lsof查看占用进程:

    lsof /dev/ttyUSB0

    终止占用进程后重新操作。

相关问答FAQs

Q1: 如何查看串口当前的配置参数?
A1: 使用stty命令查看当前串口配置,

stty -F /dev/ttyUSB0 -a

该命令会显示波特率、数据位、停止位、校验位等所有参数的当前设置。

Q2: 串口数据读取时出现乱码,如何解决?
A2: 乱码通常由串口参数不匹配或数据编码问题导致,可按以下步骤排查:

  1. 确认通信双方波特率、数据位、停止位、校验位等参数一致;
  2. 检查数据编码格式(如ASCII、HEX),必要时在脚本中进行编码转换;
  3. 尝试降低波特率(如从115200降至9600)排除硬件兼容性问题;
  4. 检查串口线缆是否接触良好或是否存在信号干扰。
分享:
扫描分享到社交APP
上一篇
下一篇