STM32 RS232通信开发详解 | 零基础入门STM32之RS232篇

主题 内容 教学目的/扩展视频
RS232串口 电路原理,跳线设置,驱动程序。与超级终端通信。 了解电路原理和RS232协议。

师从洋桃电子,杜洋老师


📑文章目录

  • 一、RS232通信系统架构
  • 二、RS232核心原理与硬件设计
  • 2.1 电气特性对比
  • 2.2 典型电路设计
  • 三、USART3驱动代码解析
  • 3.1 关键初始化代码(usart.c)
  • 3.2 数据收发实现
  • 四、通信测试方法
  • 4.1 自发自收测试
  • 4.2 外设连接测试
  • 五、DB9接口标准线序
  • 5.1 引脚定义(DTE设备)
  • 5.2 线缆类型选择
  • 六、进阶应用:Modbus RTU实现
  • 6.1 协议帧格式
  • 6.2 校验算法实现
  • 七、常见问题排查
  • 八、相关资源
  • 总结

  • (图1:开发板与RS232通讯连接示意图)

    (图2:RS232通讯测试示意图)


    一、RS232通信系统架构

    +------------------+       +------------------+       +------------------+
    |   STM32控制器    |       | 电平转换芯片     |       | RS232设备        |
    | (USART3 PB10/11) |<----->| (SP3232/Max3232) |<----->| (DB9/DB25接口)   |
    +------------------+       +------------------+       +------------------+
            ↑                                          
    +------------------+                               
    |  触摸按键输入     |                                
    | (矩阵/电容式按键) |                               
    +------------------+                               
    

    二、RS232核心原理与硬件设计

    2.1 电气特性对比

    参数 TTL电平 RS232电平
    逻辑0 0V +3V ~ +15V
    逻辑1 3.3V/5V -3V ~ -15V
    传输距离 <1m 可达15m
    抗干扰能力

    2.2 典型电路设计

             STM32
              │
              ├──PB10(TX)──► SP3232_TXIN ────► DB9_TX
              │
              ├──PB11(RX)◄──SP3232_RXOUT ◄─── DB9_RX
              │
              └──GND─────────SP3232_GND ────── DB9_GND
    

    三、USART3驱动代码解析

    3.1 关键初始化代码(usart.c)

    void USART3_Init(u32 BaudRate){
        // GPIO配置
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        // TX(PB10) 推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        // RX(PB11) 浮空输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    
        // USART参数配置
        USART_InitTypeDef USART_InitStructure;
        USART_InitStructure.USART_BaudRate = BaudRate;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_Init(USART3, &USART_InitStructure);
        USART_Cmd(USART3, ENABLE);
    }
    

    配置要点

  • 波特率匹配:115200bps
  • 数据格式:8位数据位、无校验、1停止位
  • GPIO模式:TX推挽输出,RX浮空输入
  • 3.2 数据收发实现

    主程序

    USART3

    SP3232

    DB9

    USART3_printf('A')

    发送TTL电平

    转换为RS232电平

    接收RS232信号

    转换回TTL电平

    USART_ReceiveData()

    主程序

    USART3

    SP3232

    DB9

    四、通信测试方法

    4.1 自发自收测试

    // 内部短接测试
    void SelfTest(void){
        USART3_printf("Test String\r\n");
        if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE)){
            u8 data = USART_ReceiveData(USART3);
            OLED_Display(data); // 显示接收数据
        }
    }
    

    操作步骤

    1. 将PB10(TX)与PB11(RX)短接
    2. 发送测试数据
    3. 验证接收数据一致性

    4.2 外设连接测试

    测试设备 接线方式 预期结果
    PC串口 直连线 双向通信正常
    工业PLC 交叉线 协议交互成功
    条码扫描枪 适配器转换 数据实时接收

    五、DB9接口标准线序

    5.1 引脚定义(DTE设备)

    引脚 信号 说明
    1 CD 载波检测
    2 RXD 接收数据
    3 TXD 发送数据
    4 DTR 数据终端就绪
    5 GND 信号地
    6 DSR 数据设备就绪
    7 RTS 请求发送
    8 CTS 清除发送
    9 RI 振铃指示

    5.2 线缆类型选择

    线缆名称 实际连接方式 适用场景
    交叉线 TXD↔RXD, RXD↔TXD, GND↔GND DTE↔DTE (如PC↔STM32)
    直连线 TXD↔RXD, RXD↔TXD, GND↔GND DTE↔DCE (如PC↔Modem)

    (图3:RS232接口不同连接方式示意图)

    关键规则
    无论线缆类型如何命名,必须确保 发送端(TXD)与接收端(RXD)交叉连接,即:

  • 设备A的TXD ➔ 设备B的RXD
  • 设备A的RXD ➔ 设备B的TXD
  • GND直连
  • 六、进阶应用:Modbus RTU实现

    6.1 协议帧格式

    // Modbus RTU帧示例
    uint8_t modbusFrame[] = {
        0x01,       // 设备地址
        0x03,       // 功能码(读保持寄存器)
        0x00, 0x01, // 起始地址
        0x00, 0x02, // 寄存器数量
        0xCRC_H, 0xCRC_L // CRC校验
    };
    

    6.2 校验算法实现

    uint16_t CRC16(uint8_t *buf, int len){
        uint16_t crc = 0xFFFF;
        for(int pos=0; pos<len; pos++){
            crc ^= (uint16_t)buf[pos];
            for(int i=8; i!=0; i--){
                if(crc & 0x0001){
                    crc >>= 1;
                    crc ^= 0xA001;
                }else{
                    crc >>= 1;
                }
            }
        }
        return crc;
    }
    

    七、常见问题排查

    故障现象 检测点 解决方案
    无数据收发 SP3232供电电压 确保VCC在3.0-5.5V范围
    数据乱码 波特率设置 校验双方波特率一致性
    偶发丢包 接地不良 加强GND连接
    传输距离短 线缆质量 使用屏蔽双绞线

    八、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32F103xx官方数据手册
    [3] STM32F103X8-B数据手册(中文)
    [4] STM32F103固件函数库用户手册(中文)
    [5] SP3232数据手册(英文)
    [6] RS232通信测试程序


    总结

    本文实现了基于STM32的RS232通信系统,关键技术点包括:

    1. 电平转换:SP3232实现TTL与RS232电平转换
    2. 驱动配置:USART3的GPIO与参数设置
    3. 数据收发:查询方式实现可靠通信
    4. 协议扩展:Modbus RTU工业协议集成

    开发建议:

  • 长距离传输时增加终端电阻(120Ω)
  • 使用示波器验证信号质量
  • 关键数据添加校验机制
  • 通过本文的驱动框架,开发者可快速构建工业控制、仪器仪表等领域的串口通信系统,实现设备间可靠的数据交互。


    💬 技术讨论(请在评论区留言~)


    📌 下期预告:下一期将探讨RS485总线,欢迎持续关注!

    点击查阅🔍往期【STM32专栏】文章

    版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
    实测开发版:洋桃1号开发版(基于STM32F103C8T6)
    更新日志

  • v1.0 初始版本(2025-03-09)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 RS232通信开发详解 | 零基础入门STM32之RS232篇

    发表回复