1. 串口简介
串口(Serial Port)是计算机与外部设备进行数据传输的一种通信接口,它可以通过发送和接收数据来实现与外部设备的通信。串口通信具有简单、稳定、易扩展的特点,因此在很多领域都有广泛的应用。
Linux环境中,串口通信主要通过串口设备文件进行操作。串口设备文件一般以“/dev/ttySx”或“/dev/ttyUSBx”的形式存在,其中“x”表示串口的序号。在使用串口前,需要先了解串口设备的硬件参数,如波特率、数据位、校验位等。
2. Linux下串口设备的操作
2.1 打开串口设备
在Linux中,可以使用C语言的open()函数来打开串口设备。使用open()函数前,需要先引入相应的头文件:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <errno.h>
然后通过open()函数打开串口设备:
int fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
if (fd == -1) {
perror("Open serial port failed!");
return -1;
}
其中,"/dev/ttyS0"是串口设备文件的路径,O_RDWR表示以读写方式打开串口,O_NOCTTY表示该串口不作为控制终端,O_NDELAY表示非阻塞模式。
如果打开串口设备失败,使用perror()函数可以打印出错误信息。可以根据具体需求进行错误处理。
2.2 配置串口参数
打开串口设备后,需要配置相应的串口参数,包括波特率、数据位、停止位、校验位等。可以使用tcgetattr()函数来获取当前串口设备的参数,使用tcsetattr()函数来设置串口参数。
以下是一个配置串口参数的例子:
struct termios options;
tcgetattr(fd, &options);
// 设置输入输出波特率
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// 设置数据位、停止位、校验位等
options.c_cflag |= CLOCAL;
options.c_cflag |= CREAD;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
tcsetattr(fd, TCSANOW, &options);
其中,cfsetispeed()函数用于设置输入波特率,cfsetospeed()函数用于设置输出波特率。options.c_cflag是一个位掩码,用于设置数据位、停止位、校验位等参数。tcsetattr()函数用于将修改后的参数应用到串口设备。
2.3 读写串口数据
在配置好串口参数后,就可以使用read()和write()函数来进行读写操作。
对于读串口,可以使用read()函数:
char buffer[256];
int len = read(fd, buffer, sizeof(buffer));
if (len > 0) {
printf("Read %d bytes from serial port.\n", len);
// 对读取到的数据进行处理
} else {
perror("Read serial port failed!");
}
其中,fd是打开的串口设备文件描述符,buffer是读取数据的缓冲区,sizeof(buffer)表示读取的最大字节数。
对于写串口,可以使用write()函数:
char data[] = "Hello, Serial Port!";
int len = write(fd, data, sizeof(data));
if (len > 0) {
printf("Write %d bytes to serial port.\n", len);
} else {
perror("Write serial port failed!");
}
其中,data是待写入的数据,sizeof(data)表示写入的字节数。
3. 串口应用举例
3.1 串口通信示例
假设我们要实现两台计算机之间的串口通信,一台作为发送端,另一台作为接收端。
首先,在发送端打开串口设备:
int fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
if (fd == -1) {
perror("Open serial port failed!");
return -1;
}
然后配置串口参数:
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= CLOCAL;
options.c_cflag |= CREAD;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
tcsetattr(fd, TCSANOW, &options);
接下来,使用write()函数发送数据:
char data[] = "Hello, Serial Port!";
int len = write(fd, data, sizeof(data));
if (len > 0) {
printf("Write %d bytes to serial port.\n", len);
} else {
perror("Write serial port failed!");
}
在接收端,首先打开串口设备:
int fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
if (fd == -1) {
perror("Open serial port failed!");
return -1;
}
然后配置串口参数:
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= CLOCAL;
options.c_cflag |= CREAD;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
tcsetattr(fd, TCSANOW, &options);
接下来,使用read()函数接收数据:
char buffer[256];
int len = read(fd, buffer, sizeof(buffer));
if (len > 0) {
printf("Read %d bytes from serial port.\n", len);
// 对读取到的数据进行处理
} else {
perror("Read serial port failed!");
}
这样,两台计算机之间就可以通过串口进行简单的通信了。
3.2 使用串口进行温度传感器数据采集
假设我们需要使用串口读取连接在计算机上的温度传感器的数据。
首先,在打开串口之前,需要先连接好温度传感器,并确保串口的硬件连接正确。
然后,在打开串口设备后,需要根据温度传感器的通信协议进行读取。
以下是一个使用串口读取温度传感器数据的示例:
int fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
if (fd == -1) {
perror("Open serial port failed!");
return -1;
}
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= CLOCAL;
options.c_cflag |= CREAD;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
tcsetattr(fd, TCSANOW, &options);
char buffer[256];
int len = read(fd, buffer, sizeof(buffer));
if (len > 0) {
printf("Read %d bytes from serial port.\n", len);
// 解析温度传感器的数据并进行处理
} else {
perror("Read serial port failed!");
}
在read()函数中读取到的数据可以根据温度传感器的协议进行解析,得到具体的温度数值。
4. 总结
本文介绍了在Linux环境下使用串口的基本操作方法,包括打开串口设备、配置串口参数、读写串口数据等。通过实际应用示例,演示了串口通信和温度传感器数据采集的过程。掌握了这些基本操作,可以实现与串口设备的简单交互,并根据具体需求进行扩展和优化。
需要注意的是,在实际应用中,还需要根据具体的串口设备和通信协议进行适当的修改和调整。