rk3588 rs232 转 ttl 通信

需求

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 等替代,但仍然在工业控制、仪器设备等领域应用广泛。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容