如何在Linux上写串口程序
串口是一种用于数据通信的接口,它通常使用在电脑和外设之间。在linux系统中,操作串口需要通过终端命令或者编写程序来实现。本文将介绍如何在Linux系统上编写串口程序,以C语言为例。
1. 打开串口设备文件
首先,需要打开串口设备文件。在Linux系统下,串口设备文件通常被命名为“/dev/ttyS*”,其中“*”为串口号。比如,ttyS0代表COM1口,ttyS1代表COM2口。下面是打开COM1口的代码示例:
#include
#include
#include
#include
int main()
{
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open");
return -1;
}
// 其他代码
close(fd);
return 0;
}
其中,O_RDWR表示以读写方式打开设备文件,O_NOCTTY表示不将串口作为控制终端,O_NDELAY表示非阻塞模式打开设备文件。如果打开串口设备文件失败,使用perror函数输出错误信息,并且返回-1。
2. 配置串口参数
打开串口设备文件后,需要对串口进行参数配置,包括波特率、数据位、停止位、校验位等。在linux系统中,可以使用termios库来配置串口参数。下面是设置波特率为9600bps,8个数据位,1个停止位,无校验位的代码示例:
struct termios options;
tcgetattr(fd, &options); // 获取串口参数
cfsetispeed(&options, B9600); // 设置波特率为9600bps
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD); // 必要的控制标志
options.c_cflag &= ~PARENB; // 设置无校验位
options.c_cflag &= ~CSTOPB; // 设置一个停止位
options.c_cflag &= ~CSIZE; // 设置数据位为8bit
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options); // 设置串口参数
其中,cfsetispeed和cfsetospeed函数分别用于设置输入和输出的波特率,CLOCAL和CREAD标志表示忽略所有串口控制终端信号,PARENB表示启用校验位,CSTOPB表示使用两个停止位。CSIZE表示数据位长度,CS8表示8位数据位长度。最后,在每次修改完串口参数之后,需要调用tcsetattr函数将参数应用到设备上。
3. 发送和接收数据
配置完串口参数之后,可以通过读写串口设备文件来实现数据的传输。下面是分别通过串口发送和接收数据的代码示例:
unsigned char buffer[256]; // 存储数据的缓冲区
// 发送数据
int send_len = write(fd, buffer, strlen(buffer));
if (send_len == -1)
{
perror("write");
return -1;
}
// 接收数据
int recv_len = read(fd, buffer, 256);
if (recv_len == -1)
{
perror("read");
return -1;
}
其中,write函数用于将数据写入串口,read函数用于从串口读取数据。发送和接收的数据长度分别为send_len和recv_len。如果读写操作失败,使用perror函数输出错误信息,并且返回-1。
4. 关闭串口设备文件
最后,在程序结束时需要关闭串口设备文件。下面是关闭串口设备文件的代码示例:
close(fd);
完整代码示例:
#include
#include
#include
#include
#include
int main()
{
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open");
return -1;
}
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;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options);
unsigned char buffer[256];
strcpy(buffer, "hello!");
// 发送数据
int send_len = write(fd, buffer, strlen(buffer));
if (send_len == -1)
{
perror("write");
return -1;
}
// 接收数据
int recv_len = read(fd, buffer, 256);
if (recv_len == -1)
{
perror("read");
return -1;
}
close(fd);
return 0;
}
通过以上步骤,就可以在Linux系统上编写串口程序了。需要注意的是,使用串口进行数据通信时,需要确保发送和接收的参数和数据格式都一致,否则会导致通信失败。