服务器测评网
我们一直在努力

linux控制串口

Linux控制串口的基础概念

Linux系统对串口的支持源于其强大的设备抽象能力,串口在Linux中被视为一种字符设备文件,通常位于/dev目录下,常见的设备名包括/dev/ttyS0/dev/ttyS1(标准串口)以及/dev/ttyUSB0/dev/ttyACM0(USB转串口设备),通过这些设备文件,应用程序可以直接与串口硬件进行交互,实现数据的收发功能,Linux内核通过串口驱动程序管理硬件资源,提供标准的文件操作接口(如open、read、write、close等),使得串口控制与普通文件操作类似,降低了开发难度。

linux控制串口

串口参数配置详解

串口通信的可靠性高度依赖于参数的正确配置,Linux下可通过termios结构体完成详细设置,核心参数包括波特率、数据位、停止位、校验位以及流控方式。

  • 波特率(Baud Rate):决定数据传输速率,常用值包括9600、19200、115200等,可通过cfsetispeed()cfsetospeed()函数分别设置输入和输出波特率,需确保两端设备波特率一致。
  • 数据位(Data Bits):表示每帧数据的有效位数,通常为5~8位,Linux中通过c_cflagCS5~CS8配置,默认为8位(CS8)。
  • 停止位(Stop Bits):用于标识一帧数据的结束,可选1、1.5或2位,通过c_cflagCSTOPB配置,默认为1位。
  • 校验位(Parity):用于简单错误检测,支持无校验(PARENB=0)、奇校验(PARODD=1)和偶校验(PARODD=0),通过c_cflag相关位配置。
  • 流控(Flow Control):防止数据丢失,包括硬件流控(RTS/CTS)和软件流控(XON/XOFF),需通过c_cflagCRTSCTSc_iflagIXON/IXOFF启用。

配置完成后,需通过tcsetattr()函数将参数应用到串口设备,并使用tcflush()清空输入输出缓冲区,确保数据同步。

串口数据收发与控制

Linux下串口数据收发主要通过文件I/O函数实现,结合termios提供的终端控制功能,可满足不同场景的通信需求。

linux控制串口

  • 打开串口:使用open()函数以非阻塞(O_NONBLOCK)或阻塞模式打开串口设备,需设置正确的权限(如O_RDWR读写模式)。int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY),其中O_NOCTTY确保串口不作为终端控制设备。
  • 数据发送:通过write()函数将数据写入串口,需注意返回值表示实际写入的字节数,与请求写入字节数不一致时可能需处理部分写入情况。int n = write(fd, "Hello", 5),若n < 5,可循环写入剩余数据。
  • 数据接收:使用read()函数从串口读取数据,阻塞模式下若无数据则会阻塞进程,非阻塞模式下立即返回-1并设置errnoEAGAIN,可通过select()poll()函数实现多路复用,避免轮询带来的资源浪费。fd_set read_fds; FD_ZERO(&read_fds); FD_SET(fd, &read_fds); select(fd+1, &read_fds, NULL, NULL, NULL),当FD_ISSET(fd, &read_fds)为真时,表示数据可读。
  • 串口控制:通过ioctl()函数可获取或设置串口状态,如TCGETS获取当前参数、TCSETS设置参数、TIOCMGET获取调制解调器状态(如CTS、RTS信号)等。

高级功能与实用工具

Linux串口通信还支持高级功能,并结合丰富的命令行工具,提升开发效率。

  • 非阻塞与异步I/O:通过O_NONBLOCK标志或fcntl()函数设置非阻塞模式,避免进程阻塞;结合SIGIO信号和F_SETOWN设置,可实现异步I/O,当串口数据就绪时触发信号通知进程。
  • 多串口管理:对于多串口设备,可通过udev规则实现设备名固定(如根据USB VID/PID映射为固定设备名),避免因设备插拔导致设备名变化,创建/etc/udev/rules.d/99-usb-serial.rules文件,添加SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", SYMLINK+="ttyUSB_custom"
  • 常用调试工具
    • minicom:一款功能完善的串口终端工具,支持配置串口参数、收发数据、脚本录制等功能,适合调试串口设备。
    • screen:轻量级终端复用工具,可通过screen /dev/ttyUSB0 115200快速进入串口终端,支持数据捕获和会话恢复。
    • setserial:查看或修改串口硬件参数,如setserial /dev/ttyS0 uart 16550A设置UART类型。
    • socat:强大的网络工具,可实现串口与TCP/UDP的互转,例如socat /dev/ttyUSB0,b115200,relink TCP:192.168.1.100:8888将串口数据转发到TCP端口。

实际应用场景

Linux控制串口广泛应用于嵌入式开发、工业控制、物联网设备调试等领域,在嵌入式系统中,通过串口与传感器通信,采集温湿度、压力等数据;在工业场景中,PLC设备常通过串口与上位机通信,传输控制指令和状态信息;在物联网网关中,串口模块(如4G DTU)用于设备数据的远程上传,Linux串口还支持通过pty(伪终端)实现虚拟串口通信,方便在没有物理串口的环境下进行调试。

通过灵活运用Linux的串口控制能力,开发者可高效实现设备间的数据交互,结合脚本自动化(如Python的pyserial库、Shell脚本),可构建复杂的串口通信应用,满足多样化的工业与开发需求。

linux控制串口

赞(0)
未经允许不得转载:好主机测评网 » linux控制串口