1. 什么是串口编程?
串口编程是指在计算机系统中利用串行接口进行数据传输的一种编程方式。串口是计算机与外部设备进行数据交换的通道,通过串口编程可以实现与外部设备的数据交互功能。
2. Linux下的串口编程
在Linux系统中,串口设备被视为一个文件,并使用特殊的设备文件路径来访问。通过打开、读取、写入和关闭该设备文件,可以实现与串口设备的数据交互。
2.1 打开串口设备
在Linux下,可以使用open函数来打开串口设备。打开串口设备需要指定设备文件路径以及打开模式。打开模式可以指定为读写模式、只读模式等。
#include<stdio.h>
#include<fcntl.h>
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
printf("Failed to open serial port\n");
return -1;
}
// 配置串口参数...
close(fd);
return 0;
}
2.2 配置串口参数
在打开串口设备后,需要对串口进行配置,包括波特率、数据位、校验位、停止位等参数的设置。可以通过设置termios结构体的成员变量来配置串口参数。
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
int set_serial_params(int fd) {
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600); // 设置输入波特率为9600
cfsetospeed(&options, B9600); // 设置输出波特率为9600
options.c_cflag |= (CLOCAL | CREAD); // 使能接收器和本地模式
options.c_cflag &= ~CSIZE; // 屏蔽数据位
options.c_cflag |= CS8; // 数据位为8位
options.c_cflag &= ~PARENB; // 不使用校验位
options.c_cflag &= ~CSTOPB; // 停止位为1位
tcsetattr(fd, TCSANOW, &options);
return 0;
}
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
printf("Failed to open serial port\n");
return -1;
}
set_serial_params(fd);
close(fd);
return 0;
}
2.3 读取串口数据
一旦配置好串口参数,就可以通过读取串口设备文件来获取接收到的数据。可以使用read函数从串口设备中读取指定长度的数据。
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
int set_serial_params(int fd) {
// 配置串口参数...
}
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
printf("Failed to open serial port\n");
return -1;
}
set_serial_params(fd);
char buffer[1024];
int bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read < 0) {
printf("Failed to read from serial port\n");
close(fd);
return -1;
}
// 处理接收到的数据...
close(fd);
return 0;
}
2.4 写入串口数据
除了读取数据,还可以使用write函数将数据写入到串口设备中。可以指定写入数据的长度和数据缓冲区。
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
int set_serial_params(int fd) {
// 配置串口参数...
}
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
printf("Failed to open serial port\n");
return -1;
}
set_serial_params(fd);
char* data = "Hello, serial port!";
int bytes_written = write(fd, data, strlen(data));
if (bytes_written < 0) {
printf("Failed to write to serial port\n");
close(fd);
return -1;
}
close(fd);
return 0;
}
3. 数据交互示例
下面是一个简单的使用串口进行数据交互的示例,其中一个设备从串口读取温度值,并将温度值写入到另一个设备的串口。
3.1 设备1(读取温度)
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
int set_serial_params(int fd) {
// 配置串口参数...
}
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
printf("Failed to open serial port\n");
return -1;
}
set_serial_params(fd);
char buffer[1024];
int bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read < 0) {
printf("Failed to read from serial port\n");
close(fd);
return -1;
}
float temperature;
sscanf(buffer, "temperature=%f", &temperature);
close(fd);
// 处理温度值...
return 0;
}
3.2 设备2(写入温度)
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
int set_serial_params(int fd) {
// 配置串口参数...
}
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
printf("Failed to open serial port\n");
return -1;
}
set_serial_params(fd);
float temperature = 0.6;
char buffer[1024];
sprintf(buffer, "temperature=%.2f\n", temperature);
int bytes_written = write(fd, buffer, strlen(buffer));
if (bytes_written < 0) {
printf("Failed to write to serial port\n");
close(fd);
return -1;
}
close(fd);
return 0;
}
4. 总结
通过Linux下的串口编程,我们可以实现设备之间的数据交互功能。通过打开、配置、读取和写入串口设备文件,可以方便地与外部设备进行数据交换。
本文介绍了Linux下串口编程的基本步骤,包括打开串口设备、配置串口参数、读取串口数据和写入串口数据。并通过一个简单的示例演示了如何在两台设备之间进行温度值的交互。