Linux系统下轻松读串口教程
linux 读串口

首页 2024-12-09 21:50:34



Linux 读串口:解锁串行通信的强大潜能 在信息技术日新月异的今天,尽管高速网络接口和无线通信技术占据了主导地位,串行通信(Serial Communication)依然在许多应用场景中发挥着不可替代的作用

    特别是在嵌入式系统、工业自动化、物联网(IoT)以及某些类型的硬件调试中,串口通信(通常指RS-232、RS-485或RS-422标准)以其简单、可靠、成本低廉的特点,成为了连接不同设备间通信的桥梁

    而在Linux操作系统下,读取串口数据不仅高效灵活,还能充分利用Linux内核提供的强大功能集,满足多样化的应用需求

    本文将深入探讨在Linux环境下如何读取串口数据,以及这一过程中的关键技术和实践技巧

     一、Linux串口通信基础 串口通信,顾名思义,是通过串行方式传输数据的一种通信方式

    它逐位发送数据,相比并行通信(同时传输多位数据),虽然速度较慢,但所需线路少,成本更低,且易于实现长距离传输

    Linux系统对串口设备的支持非常成熟,几乎所有现代Linux发行版都将串口视为标准的TTY(Teletypewriter)设备进行管理,这意味着你可以像操作普通文件一样操作串口

     在Linux系统中,每个串口设备都有一个对应的设备文件,通常位于`/dev`目录下,命名格式为`/dev/ttyS【n】`或`/dev/ttyUSB【n】`,其中`【n】`代表设备编号

    例如,`/dev/ttyS0`可能代表系统上的第一个内置串口,而`/dev/ttyUSB0`则可能表示连接到系统的第一个USB转串口适配器

     二、配置串口参数 在进行串口通信之前,正确配置串口参数至关重要

    这些参数包括波特率(Baud Rate)、数据位(Data Bits)、停止位(Stop Bits)、校验位(Parity)等

    Linux提供了多种工具来配置这些参数,其中最常用的是`stty`命令

     - 波特率:定义了数据传输速率,如9600、115200等

     数据位:通常设置为8位

     停止位:通常为1位或2位,1位更常见

     - 校验位:可以是无(None)、奇校验(Odd)、偶校验(Even)或标记校验(Mark)等

     配置示例: stty -F /dev/ttyS0 9600 cs8 -cstopb -parenb 上述命令将`/dev/ttyS0`设置为9600波特率,8个数据位,1个停止位,无校验位

     三、使用C语言读取串口数据 对于需要高效、精确控制的应用,使用C语言直接操作串口是首选

    Linux系统提供了`termios`结构体和相关函数(如`tcgetattr`、`tcsetattr`、`read`、`write`等)来配置和读写串口

     以下是一个简单的C语言示例,展示了如何打开串口、配置参数、读取数据并处理: include include include include include include include int main() { intserial_port =open(/dev/ttyS0,O_RDWR); if(serial_port < { printf(Error %i from open: %sn, errno,strerror(errno)); return 1; } struct termios tty; if(tcgetattr(serial_port, &tty) != 0) { printf(Error %i from tcgetattr: %s , errno, strerror(errno)); close(serial_port); return 1; } cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); tty.c_cflag= (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars tty.c_iflag &= ~IGNBRK; // disable break processing tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc【VMIN】 = 1; // read doesnt block tty.c_cc【VTIME】 = 5; // 0.5 seconds read timeout tty.c_iflag &=~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag|= (CLOCAL | CREAD); // ignore modem controls, // enable reading tty.c_cflag&= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= 0; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if(tcsetattr(serial_port, TCSANOW, &tty) != 0) { printf(Error %i from tcsetattr: %s , errno, strerror(errno)); close(serial_port); return 1; } charbuf【256】; int n =read(serial_port, buf,sizeof(buf)); if(n < { printf(Error reading: %s , strerror(errno)); }else { printf(Read %i bytes:%.s , n, n, buf); } close(serial_port); return 0; } 这个示例程序首先打开串口设备`/dev/ttyS0`,然后配置串口参数(波特率、数据位、停止位等),最后读取数据并打印到标准输出

     四、使用Python读取串口数据 对于快速原型开发或脚本编写,Python提供了强大的第三方库`pyserial`,使得读取串口数据变得异常简单

     安装`pyserial`: pip install pyserial 使用`pyserial`读取串口数据的示例: import serial 打开串口,设置波特率等参数 ser = serial.Serial(/dev/ttyS0, 9600, timeout= 检查串口是否打开 if ser.is_open: print(串口已打开) try: while Tr