CentOS串口通信指南
Centos操作系统广泛应用于服务器和嵌入式系统,其强大的网络功能和灵活的设备管理使其成为开发者的热门选择,在串口通信领域,CentOS同样提供了丰富的工具和接口,方便用户进行各种设备间的数据传输与控制,本文将详细介绍如何在CentOS系统中实现串口通信,涵盖从基础概念到实际操作的各个方面。

一、串口通信基础知识
1. 串口通信原理
串口(Serial Port)是一种用于数据顺序传输的接口,常用于计算机与外部设备之间的通信,串口通信通过一对或多对数据线进行数据传输,每次传输一个比特位,串口通信的基本参数包括:
波特率:每秒传输的比特数,例如9600、115200等。
数据位:每个数据包中的有效数据位数,通常为7或8位。
停止位:用于标记数据包结束的信号,一般为1、1.5或2位。
校验位:用于错误检测的位数,可设置为无校验、奇校验或偶校验。

2. 串口设备文件
在Linux系统中,串口设备被抽象为文件,常见的串口设备文件位于/dev
目录下,以/dev/ttyS
或/dev/ttyUSB
的形式存在。/dev/ttyS0
表示第一个串口设备,/dev/ttyUSB0
表示第一个通过USB转串口连接的设备。
二、配置串口设备
1. 安装必要的软件包
在进行串口通信之前,需要确保系统中安装了相关的软件包,常用的软件包包括setserial
和minicom
。
- sudo yum install setserial minicom
2. 设置串口参数
使用stty
命令可以配置串口的各项参数,如波特率、数据位、停止位和校验位等,设置波特率为9600,8位数据位,1个停止位,无校验位的命令如下:

- stty F /dev/ttyS0 9600 cs8 cstopb parenb
各参数说明:
F
:指定串口设备文件。
9600
:设置波特率为9600。
cs8
:设置数据位为8位。
cstopb
:设置停止位为1位。
parenb
:禁用校验位。
3. 高级配置工具
除了stty
命令,还可以使用minicom
或picocom
等工具进行更复杂的配置和通信测试,使用minicom
配置并打开串口:
- minicom s
在弹出的配置界面中,设置串口设备(如/dev/ttyS0
)、波特率(如9600)和其他参数,然后保存退出,最后使用以下命令打开串口进行通信:
- minicom /dev/ttyS0
三、串口通信实践
1. 命令行实现数据收发
1.1 查看串口设备
首先确认系统中存在的串口设备:
- ls /dev/ttyS*
- ls /dev/ttyUSB
1.2 发送数据
使用echo
命令向串口发送数据:
- echo "Hello world" > /dev/ttyS0
1.3 接收数据
使用cat
命令从串口读取数据:
- cat /dev/ttyS0
2. C语言实现数据收发
使用C语言编写程序,通过系统调用实现串口数据的读写,以下是一个简单的示例代码:
- #include <stdio.h> /* Standard input/output definitions */
- #include <string.h> /* String function definitions */
- #include <unistd.h> /* UNIX standard function definitions */
- #include <fcntl.h> /* File control definitions */
- #include <errno.h> /* Error number definitions */
- #include <termios.h> /* POSIX terminal control definitions */
- /* 'open_port()' Open serial port 1. */
- int open_port(void) {
- int fd; /* File descriptor for the port */
- fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
- if (fd == 1) {
- perror("open_port: Unable to open /dev/ttyS0 ");
- } else {
- fcntl(fd, F_SETFL, 0);
- }
- return (fd);
- }
- int main() {
- int fd; /* File descriptor for the port */
- char *portname = "/dev/ttyS0";
- int n; /* Read counts */
- char buf[100]; /* Buffer for outgoing data */
- fd = open_port(); /* Open the port */
- if (fd == 1) return 1; /* Could not open the port */
- /* Send data to the port */
- n = write(fd, "Hello, World!", 13);
- if (n < 0) fputs("write() of 13 bytes failed!
- ", stderr);
- /* Read data from the port */
- n = read(fd, buf, sizeof(buf));
- if (n < 0) {
- fputs("read() failed!
- ", stderr);
- return 1;
- } else {
- printf("Received: %s
- ", buf);
- }
- close(fd); /* Close the port */
- return 0;
- }
编译并运行该程序:
- gcc o serial_test serial_test.c
- ./serial_test
3. Go语言实现数据收发
使用Go语言编写串口通信程序,可以使用第三方库如goserial
,以下是一个简单的示例代码:
- package main
- import (
- "fmt"
- "log"
- "github.com/tarm/serial"
- )
- func main() {
- // 配置串口参数
- config := &serial.Config{Name: "/dev/ttyUSB0", Baud: 115200}
- // 打开串口
- s, err := serial.OpenPort(config)
- if err != nil {
- log.Fatal(err)
- }
- defer s.Close()
- // 发送数据
- n, err := s.Write([]byte("Hello, World!"))
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("%d bytes written
- ", n)
- // 接收数据
- buf := make([]byte, 128)
- n, err = s.Read(buf)
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("%d bytes read: %s
- ", n, string(buf[:n]))
- }
编译并运行该程序:
- go build o serial_test serial_test.go
- ./serial_test
四、常见问题及解决方法
Q1:如何更改串口设备的权限?
A1:更改串口设备的权限可以通过以下命令完成:
sudo chmod 666 /dev/ttyS0
``- 或者将当前用户添加到
dialout`组:
sudo usermod aG dialout $USER
```然后重新登录使更改生效。
Q2:如何解决“无法打开串口设备”的问题?
A2:如果遇到“无法打开串口设备”的问题,可以尝试以下步骤:
1、确认串口设备文件是否存在:
- ls /dev/ttyS* /dev/ttyUSB*
- ```2.确认设备文件的权限是否正确:
ls l /dev/ttyS0
```3.确认没有其他进程占用了串口设备:
fuser /dev/ttyS0
``- 4.如果问题依旧存在,检查串口连接是否正常,以及是否需要加载相应的内核模块(如
usbserial`)。