Linux串口收发数据
串口通信基础
串口通信是一种异步串行通信方式,通过数据线、地线以及控制线实现设备间的数据交换,在Linux系统中,串口设备通常以文件形式存在于/dev目录下,如/dev/ttyS0(COM1)、/dev/ttyUSB0(USB转串口)等,串口通信的核心参数包括波特率、数据位、停止位、校验位和流控,这些参数需在通信前正确配置,以确保数据传输的准确性和稳定性。

串口设备配置
在Linux中,可通过stty命令或编程方式配置串口参数,以stty为例,首先查看当前串口设置:
stty -F /dev/ttyS0 -a
配置串口参数(如波特率115200、8数据位、无校验、1停止位、无流控):
stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb -crtscts
若需禁用硬件流控(RTS/CTS)和软件流控(XON/XOFF),可添加-ixon -ixoff选项,配置完成后,可通过重定向或文件操作进行数据收发。
编程实现串口通信
在C语言中,可通过标准文件I/O操作串口设备,基本步骤包括:
-
打开串口设备
使用open()函数以读写模式打开串口,
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);O_NOCTTY表示终端不成为进程的控制终端,O_NDELAY以非阻塞方式打开。 -
配置串口参数
通过termios结构体设置串口属性:struct termios options; tcgetattr(fd, &options); options.c_cflag = B115200 | CS8 | CREAD | CLOCAL; options.c_lflag = 0; options.c_iflag = IGNPAR; options.c_oflag = 0; tcsetattr(fd, TCSANOW, &options);
其中
B115200为波特率,CS8为8数据位,CREAD允许接收,CLOCAL忽略调制解调器控制线。 -
数据发送与接收
使用write()和read()函数进行数据传输:char send_data[] = "Hello, Serial Port!"; write(fd, send_data, strlen(send_data)); char recv_data[1024]; int bytes_read = read(fd, recv_data, sizeof(recv_data)); if (bytes_read > 0) { printf("Received: %.*s\n", bytes_read, recv_data); } -
关闭串口
通信完成后调用close(fd)释放资源。
高级功能与注意事项
- 超时设置:通过
tcgetattr()获取termios结构体后,可设置c_cc[VTIME]和c_cc[VMIN]实现超时接收。VTIME=1和VMIN=0表示读取1个字符后立即返回,超时时间为0.1秒。 - 非阻塞模式:若需异步处理,可在
open()时添加O_NONBLOCK标志,或通过fcntl(fd, F_SETFL, O_NONBLOCK)设置。 - 权限问题:普通用户可能需要通过
sudo或修改/etc/group(将用户加入dialout组)获取串口访问权限。 - 设备冲突:若串口被其他进程占用,
open()会返回错误,可通过lsof /dev/ttyS0查看占用进程。
实际应用场景
Linux串口通信广泛应用于嵌入式系统、工业控制、物联网设备等领域,在树莓派中通过串口与传感器通信,或通过USB转串口模块调试设备,Python等脚本语言也可通过pyserial库简化操作,
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200)
ser.write(b'AT\r\n')
response = ser.read(10)
print(response.decode())
ser.close()
Linux串口通信依赖于设备文件和标准I/O接口,通过正确配置参数和编程实现,可稳定完成数据收发,无论是底层硬件控制还是高层应用开发,掌握串口通信技术都是Linux系统开发的重要技能,在实际应用中,需注意参数匹配、权限管理和异常处理,以确保通信的可靠性和效率。

















