需求
rk3588开发板需要控制另外一个设备(提供了rs232接口),开发板上只有ttl接口(也可以配置为rs232)
设备
rs232接口的被控设备
rk3588开发板 (ttl接口)
rs232转ttl小板 (RT 和 TX 交叉)

image.png
核心代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#define SERIAL_PORT "/dev/ttyUSB0" // 修改为你的串口设备路径
#define BAUD_RATE B9600 // 波特率
// 配置串口参数
int configure_serial(int fd) {
struct termios tty;
if (tcgetattr(fd, &tty) != 0) {
perror("tcgetattr");
return -1;
}
// 设置波特率
cfsetospeed(&tty, BAUD_RATE);
cfsetispeed(&tty, BAUD_RATE);
// 配置数据位、停止位和校验位
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8 数据位
tty.c_cflag &= ~PARENB; // 无校验位
tty.c_cflag &= ~CSTOPB; // 1 停止位
tty.c_cflag &= ~CRTSCTS; // 禁用硬件流控
tty.c_cflag |= CREAD | CLOCAL; // 使能接收,忽略 modem 控制线
// 配置本地模式和原始模式(非规范模式)
tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 关闭规范模式和回显
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用软件流控
tty.c_oflag &= ~OPOST; // 关闭输出处理
// 设定 1 秒的超时时间
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 10;
// 应用设置
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
perror("tcsetattr");
return -1;
}
return 0;
}
// 发送数据
void send_data(int fd, const char *data) {
int len = write(fd, data, strlen(data));
if (len < 0) {
perror("write");
} else {
printf("Sent: %s\n", data);
}
}
// 接收数据
void receive_data(int fd) {
char buffer[256];
memset(buffer, 0, sizeof(buffer));
int len = read(fd, buffer, sizeof(buffer) - 1);
if (len < 0) {
perror("read");
} else {
buffer[len] = '\0'; // 确保字符串结束
printf("Received: %s\n", buffer);
}
}
int main() {
// 打开串口
int fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("open");
return EXIT_FAILURE;
}
fcntl(fd, F_SETFL, 0); // 设为阻塞模式
// 配置串口
if (configure_serial(fd) != 0) {
close(fd);
return EXIT_FAILURE;
}
// 发送数据
send_data(fd, "Hello RS-232\n");
// 接收数据
receive_data(fd);
// 关闭串口
close(fd);
return EXIT_SUCCESS;
}
RS-232 参数含义
RS-232(Recommended Standard 232)是一种串行通信标准,广泛用于计算机和外设之间的通信。其参数主要涉及数据格式、传输速率和控制信号等。
1. 波特率(Baud Rate)
代表每秒传输的符号数(比特率),常见值有:
- 1200、2400、4800、9600、19200、38400、57600、115200 等
- 例如:9600bps 表示每秒传输 9600 个比特
2. 数据位(Data Bits)
传输数据的位数,常见取值:
- 5、6、7、8(8位是最常见的)
3. 奇偶校验位(Parity Bit)
用于检测数据传输错误:
- None(无校验):不使用校验位
- Even(偶校验):数据位+校验位的1的个数为偶数
- Odd(奇校验):数据位+校验位的1的个数为奇数
- Mark(固定为1):校验位始终为1
- Space(固定为0):校验位始终为0
4. 停止位(Stop Bits)
表示数据帧的结束:
- 1、1.5、2
- 1 位停止位是最常见的,2 位用于低速通信或更高可靠性
5. 流控(Flow Control)
用于控制数据流,防止缓冲区溢出:
- None(无流控)
- XON/XOFF(软件流控):使用 ASCII 字符控制传输(XON=0x11,XOFF=0x13)
- RTS/CTS(硬件流控):使用额外的引脚进行硬件握手控制
6. 连接器(Connector)
RS-232 主要使用 DB9(9 针)和 DB25(25 针) 连接器,常见引脚包括:
| 引脚 | 缩写 | 说明 |
|---|---|---|
| 2 | TXD | 发送数据 |
| 3 | RXD | 接收数据 |
| 7 | RTS | 请求发送 |
| 8 | CTS | 清除发送 |
| 4 | DTR | 数据终端准备 |
| 6 | DSR | 数据设备准备 |
| 5 | GND | 地线 |
| 1 | DCD | 数据载波检测 |
| 9 | RI | 振铃指示 |
7. 常见配置示例
-
"9600,8,N,1" 代表:
- 波特率 9600bps
- 数据位 8
- 无奇偶校验(None)
- 1 位停止位
8. 通信方式
- 全双工(Full Duplex):同时收发数据
- 半双工(Half Duplex):收发数据交替进行
RS-232 由于传输距离和抗干扰能力有限,现代应用中逐渐被 USB、RS-485 等替代,但仍然在工业控制、仪器设备等领域应用广泛。