/dev
目录下,如 /dev/ttyS0
、 /dev/ttyUSB0
等。使用串口前需确保设备文件存在且有相应权限。
在Linux系统中,串口通信是一种常见的数据传输方式,它允许设备之间通过串行接口进行数据交换,以下是关于在Linux下使用C语言进行串口编程的详细步骤和注意事项:
1、打开串口
引入库:在进行串口编程之前,需要包含一些必要的头文件,这些头文件提供了对串口操作的支持。
打开串口设备:使用open()
函数可以打开串口设备文件,要打开/dev/ttyS0
,可以使用以下代码:
int fd = open("/dev/ttyS0", O_RDWR);
如果打开失败,通常会返回-1,可以通过perror()
函数输出错误信息。
2、设置串口参数
获取当前配置:使用tcgetattr()
函数可以获取串口的当前配置,并将其存储在一个termios
结构体中。
修改配置:根据需要修改termios
结构体中的字段,以设置串口的波特率、数据位、停止位、校验位等参数。
波特率设置:使用cfsetispeed()
和cfsetospeed()
函数可以分别设置输入和输出波特率,设置为115200波特率:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
数据位设置:通过修改c_cflag
字段来设置数据位,设置为8位数据位:
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
校验位设置:同样通过修改c_cflag
字段来设置校验位,设置为无校验位:
newtio.c_cflag &= ~PARENB;
停止位设置:也是通过修改c_cflag
字段来设置停止位,设置为1位停止位:
newtio.c_cflag &= ~CSTOPB;
应用配置:使用tcsetattr()
函数将修改后的配置应用到串口上,如果调用失败,会返回-1。
3、读写数据
读数据:使用read()
函数可以从串口中读取数据,读取100个字节的数据到缓冲区buf
中:
int n = read(fd, buf, 100);
如果读取失败,会返回-1。
写数据:使用write()
函数可以向串口中写入数据,将缓冲区buf
中的100个字节数据写入串口:
int n = write(fd, buf, 100);
如果写入失败,会返回-1。
4、关闭串口
关闭描述符:使用close()
函数可以关闭串口设备文件描述符。
close(fd);
下面是一个简单的示例代码,演示了如何在Linux下使用C语言打开串口、设置参数、读写数据以及关闭串口:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #include <errno.h> int main() { int fd; struct termios options; char buf[100]; ssize_t n; // 打开串口 fd = open("/dev/ttyS0", O_RDWR); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } // 获取当前配置 if (tcgetattr(fd, &options) != 0) { perror("tcgetattr"); close(fd); exit(EXIT_FAILURE); } // 修改配置 cfsetispeed(&options, B115200); // 设置波特率为115200 options.c_cflag &= ~PARENB; // 无校验位 options.c_cflag &= ~CSTOPB; // 1位停止位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // 8位数据位 options.c_cflag |= CLOCAL | CREAD; // 本地连接和接收使能 // 应用配置 if (tcsetattr(fd, TCSANOW, &options) != 0) { perror("tcsetattr"); close(fd); exit(EXIT_FAILURE); } // 写数据 strcpy(buf, "Hello, UART! "); n = write(fd, buf, strlen(buf)); if (n == -1) { perror("write"); close(fd); exit(EXIT_FAILURE); } // 读数据 memset(buf, 0, sizeof(buf)); n = read(fd, buf, sizeof(buf) 1); if (n == -1) { perror("read"); close(fd); exit(EXIT_FAILURE); } printf("Received: %s", buf); // 关闭串口 close(fd); return 0; }
1、问:在Linux下使用C语言进行串口编程时,如何指定串口的波特率?
答:在Linux下使用C语言进行串口编程时,可以通过修改termios
结构体中的c_cflag
字段来设置波特率,可以使用cfsetispeed()
和cfsetospeed()
函数来分别设置输入和输出波特率,要将波特率设置为115200,可以使用以下代码:cfsetispeed(&newtio, B115200);
和cfsetospeed(&newtio, B115200);
。B115200
是一个预定义的宏,表示115200波特率。
2、问:为什么在Linux下进行串口编程时需要保存原先的串口配置?
答:在Linux下进行串口编程时保存原先的串口配置主要是为了安全起见和以后调试程序方便,通过保存原先的配置,可以在需要时恢复串口到其原始状态,避免因为错误的配置导致系统或设备出现问题,在调试过程中,如果发现新的配置有问题,也可以快速恢复到之前的正确配置,方便定位和解决问题。