
C语言如何打开串口
C语言打开串口的方法包括:打开串口设备文件、配置串口参数、读取和写入数据、关闭串口设备。在本文中,我们将详细描述如何在C语言中执行这些操作,并探讨每个步骤的具体实现方法。我们将以Linux系统为例进行说明,因为在Linux上处理串口相对方便。
一、打开串口设备文件
在Linux系统中,串口设备通常表示为文件,如 /dev/ttyS0 或 /dev/ttyUSB0。可以使用 open 函数打开这些设备文件。
int 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);
}
在这个代码段中,O_RDWR 表示以读写模式打开设备,O_NOCTTY 表示不将设备分配为控制终端,O_NDELAY 表示打开设备时不阻塞。如果 open 函数返回 -1,表示打开失败。
二、配置串口参数
配置串口参数是确保通信成功的关键步骤。参数包括波特率、数据位、停止位和校验位。可以使用 termios 结构和 tcsetattr 函数进行配置。
struct termios options;
tcgetattr(fd, &options); // 获取当前设置
cfsetispeed(&options, B9600); // 设置输入波特率
cfsetospeed(&options, B9600); // 设置输出波特率
options.c_cflag |= (CLOCAL | CREAD); // 启动接收器,忽略调制解调器状态行
options.c_cflag &= ~PARENB; // 无奇偶校验
options.c_cflag &= ~CSTOPB; // 1 个停止位
options.c_cflag &= ~CSIZE; // 清除数据位大小设置
options.c_cflag |= CS8; // 8个数据位
tcsetattr(fd, TCSANOW, &options); // 设置新属性立即生效
在这个代码段中,我们设置了波特率为9600,8个数据位,无奇偶校验和1个停止位。TCSANOW 表示更改立即生效。
三、读取和写入数据
读取和写入数据是串口通信的核心功能。可以使用 read 和 write 函数实现。
// 写数据
char send_buf[] = "Hello, Serial Port!";
int n = write(fd, send_buf, sizeof(send_buf));
if (n < 0) {
perror("Write failed - ");
}
// 读数据
char recv_buf[256];
n = read(fd, recv_buf, sizeof(recv_buf));
if (n < 0) {
perror("Read failed - ");
} else {
recv_buf[n] = '