深入浅出:串口在Linux环境中的使用

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环境下使用串口的基本操作方法,包括打开串口设备、配置串口参数、读写串口数据等。通过实际应用示例,演示了串口通信和温度传感器数据采集的过程。掌握了这些基本操作,可以实现与串口设备的简单交互,并根据具体需求进行扩展和优化。

需要注意的是,在实际应用中,还需要根据具体的串口设备和通信协议进行适当的修改和调整。

操作系统标签