在计算机科学和嵌入式系统中,串口通信是一种非常基础且常用的通信方式。它允许设备之间进行点对点的数据交换。本文将带你入门串口通信,从基础知识到数据接收与转发技巧,让你轻松掌握这一技能。
串口通信基础
1. 串口简介
串口,全称为串行通信接口,是一种串行传输数据的通信接口。与并行通信相比,串行通信在传输速度上可能稍慢,但它的成本更低,且在长距离传输时具有更好的抗干扰能力。
2. 串口标准
串口通信遵循一系列标准,如RS-232、RS-485、RS-422等。其中,RS-232是最为常见的串口标准。
3. 串口硬件
串口通信需要以下硬件:
- 串口模块:如USB转串口模块、PCI串口卡等。
- 串口线:用于连接串口模块和设备。
数据接收与转发
1. 数据接收
1.1 串口初始化
在接收数据之前,需要初始化串口,包括设置波特率、数据位、停止位和校验位等。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int init_serial(const char *dev) {
int fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("open serial port");
return -1;
}
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600); // 设置波特率
cfsetospeed(&options, B9600);
options.c_cflag &= ~PARENB; // 无校验位
options.c_cflag &= ~CSTOPB; // 1个停止位
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; // 8位数据位
options.c_cflag |= CREAD | CLOCAL; // 打开接收器,忽略modem控制线
options.c_iflag &= ~(IXON | IXOFF | IXANY); // 关闭软件流控制
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 关闭规范模式
options.c_oflag &= ~OPOST; // 关闭输出处理
tcsetattr(fd, TCSANOW, &options);
return fd;
}
1.2 接收数据
初始化串口后,可以通过读取文件描述符来接收数据。
#include <unistd.h>
int main(int argc, char *argv[]) {
int fd = init_serial("/dev/ttyUSB0");
if (fd == -1) {
return -1;
}
char buffer[1024];
int len = read(fd, buffer, sizeof(buffer));
if (len > 0) {
printf("Received data: %s\n", buffer);
}
close(fd);
return 0;
}
2. 数据转发
数据转发是指将接收到的数据从串口发送到另一个串口。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int fd1 = init_serial("/dev/ttyUSB0");
int fd2 = init_serial("/dev/ttyUSB1");
if (fd1 == -1 || fd2 == -1) {
return -1;
}
char buffer[1024];
int len = read(fd1, buffer, sizeof(buffer));
if (len > 0) {
write(fd2, buffer, len);
}
close(fd1);
close(fd2);
return 0;
}
总结
通过本文的学习,相信你已经对串口通信有了初步的了解。在实际应用中,你可以根据需要调整波特率、数据位等参数,以满足不同的通信需求。希望这篇文章能帮助你轻松掌握串口通信数据接收与转发技巧。
