C语言串口通信详解:函数使用、错误处理及高级应用122


C语言凭借其高效性和底层操作能力,成为许多嵌入式系统和需要直接硬件交互的应用的首选语言。串口通信作为一种简单、可靠的异步数据传输方式,广泛应用于各种设备之间的数据交换。本文将深入探讨C语言中串口通信相关的函数,包括打开、配置、读写串口以及错误处理等方面,并结合实例代码,帮助读者掌握C语言串口编程的技巧。

一、 串口编程基础

在Linux和类Unix系统中,串口被视为字符设备,通常以`/dev/ttyS0`、`/dev/ttyACM0`等形式出现。Windows系统则使用`COM1`、`COM2`等命名。使用C语言进行串口通信,主要依赖于POSIX标准的函数,或者Windows API函数。以下我们将主要关注跨平台性较好的POSIX标准函数,并指出与Windows API的差异。

1. 打开串口

打开串口需要使用`open()`系统调用。该函数的第一个参数是串口设备文件的路径,第二个参数指定打开模式,例如`O_RDWR` (读写) 、 `O_NOCTTY` (避免成为控制终端) 、 `O_NDELAY` 或 `O_NONBLOCK` (非阻塞模式)。```c
#include
#include
#include
#include
#include
int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("open_port: Unable to open /dev/ttyS0");
exit(1);
}
```

2. 配置串口

串口配置使用`struct termios`结构体,它包含了波特率、数据位、校验位、停止位等参数。`tcgetattr()`函数用于获取当前串口设置,`tcsetattr()`函数用于设置串口参数。 ```c
struct termios newtio;
tcgetattr(fd, &newtio); // 获取当前串口设置
cfsetispeed(&newtio, B115200); // 设置输入波特率
cfsetospeed(&newtio, B115200); // 设置输出波特率
newtio.c_cflag &= ~PARENB; // 关闭奇偶校验
newtio.c_cflag &= ~CSTOPB; // 1个停止位
newtio.c_cflag &= ~CSIZE; // 清除数据位设置
newtio.c_cflag |= CS8; // 8个数据位
newtio.c_cflag &= ~CRTSCTS; // 关闭硬件流控
newtio.c_oflag = 0; // 输出模式
newtio.c_lflag = 0; // 本地模式
tcsetattr(fd, TCSANOW, &newtio); // 应用新的串口设置
```

3. 读取和写入串口

使用`read()`函数从串口读取数据,使用`write()`函数向串口写入数据。 `read()`的返回值表示读取的字节数,`write()`的返回值表示写入的字节数。```c
char buffer[1024];
int n = read(fd, buffer, sizeof(buffer));
if (n > 0) {
buffer[n] = '\0'; // 添加字符串结束符
printf("Received: %s", buffer);
}
const char *message = "Hello from C!";
write(fd, message, strlen(message));
```

4. 关闭串口

使用`close()`函数关闭串口。```c
close(fd);
```

二、 错误处理

串口编程中可能出现各种错误,例如串口打开失败、设置参数失败、读写数据失败等。需要使用`perror()`函数或`strerror()`函数打印错误信息,以便进行调试和处理。 检查函数返回值,判断操作是否成功至关重要。

三、 高级应用

除了基本的读写操作外,还可以进行更高级的串口操作,例如:
非阻塞模式: 使用`O_NONBLOCK`标志打开串口,实现异步通信。
流控制: 使用硬件流控制(RTS/CTS)或软件流控制(XON/XOFF)来控制数据传输速率。
超时设置: 设置读写超时时间,避免程序阻塞。
多线程/多进程: 使用多线程或多进程并发处理串口数据。


四、 Windows API

在Windows系统下,需要使用Windows API函数进行串口通信,例如`CreateFile()`、`SetCommState()`、`ReadFile()`、`WriteFile()`等。这些函数的使用方法与POSIX函数有所不同,需要参考Windows API文档。

五、 实例代码 (Linux): 简单的串口回显程序

以下是一个简单的串口回显程序,接收来自串口的数据并将其回传:```c
#include
// ... (前面定义的包含文件和函数) ...
int main() {
// ... (打开并配置串口) ...
char buffer[1024];
while (1) {
int n = read(fd, buffer, sizeof(buffer));
if (n > 0) {
write(fd, buffer, n);
}
}
close(fd);
return 0;
}
```

总结

本文详细介绍了C语言串口通信编程的基础知识,包括串口打开、配置、读写以及错误处理等方面。通过学习本文,读者可以掌握C语言串口编程的基本技巧,并能够进行更高级的应用开发。 记住,在实际应用中,需要根据具体硬件和应用场景选择合适的串口参数和编程方法,并进行充分的错误处理。

2025-07-15


上一篇:C语言函数详解及经典例题解析

下一篇:C语言串口编程详解:函数、配置及应用实例