STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步

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

师从洋桃电子,杜洋老师


📑文章目录


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


一、RS232通信系统架构

plaintext 复制代码
+------------------+       +------------------+       +------------------+
|   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 典型电路设计

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

三、USART3驱动代码解析

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

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 自发自收测试

c 复制代码
// 内部短接测试
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 协议帧格式

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

6.2 校验算法实现

c 复制代码
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步](http://www.doyoung.net/) \[2\] [STM32F103xx官方数据手册](https://item.szlcsc.com/datasheet/STM32F103C8T6/9243.html?spm=sc.gb.xds.a&lcsc_vid=QVgNUFNfRVFcVVJfQ1VWVFEHQ1RYBgcDFFgIAVIHQVQxVlNSR1FYUFZUT1FaXjsOAxUeFF5JWBYZEEoVDQ0NFAdIFA4DSA%3D%3D) \[3\] [STM32F103X8-B数据手册(中文)](https://pan.baidu.com/s/1Sst3ViMD2NsVCGrL7tS7Mw?pwd=w48k) \[4\] [STM32F103固件函数库用户手册(中文)](https://pan.baidu.com/s/1YOrsuYdEYKuwpmFLE1vPUA?pwd=ix56) \[5\] [SP3232数据手册(英文)](https://pan.baidu.com/s/1OV4eW6QGbgC7RLylosWhcA?pwd=rxs5) \[6\] [RS232通信测试程序](https://pan.baidu.com/s/1Ysddd2DVjjf8HkeqzZhukA?pwd=hhsp) *** ** * ** *** ### 总结 本文实现了基于STM32的RS232通信系统,关键技术点包括: 1. **电平转换**:SP3232实现TTL与RS232电平转换 2. **驱动配置**:USART3的GPIO与参数设置 3. **数据收发**:查询方式实现可靠通信 4. **协议扩展**:Modbus RTU工业协议集成 开发建议: * 长距离传输时增加终端电阻(120Ω) * 使用示波器验证信号质量 * 关键数据添加校验机制 通过本文的驱动框架,开发者可快速构建工业控制、仪器仪表等领域的串口通信系统,实现设备间可靠的数据交互。 *** ** * ** *** 💬 技术讨论(请在评论区留言\~) *** ** * ** *** > **📌 下期预告** :下一期将探讨RS485总线,欢迎持续关注! > > [点击查阅🔍往期【STM32专栏】文章](https://blog.csdn.net/liwangsb2/category_12899382.html) > > **版权声明** :本文采用\[CC BY-NC-SA 4.0\]协议,转载请注明来源 > **实测开发版** :洋桃1号开发版(基于STM32F103C8T6) > **更新日志**: > > * v1.0 初始版本(2025-03-09)

相关推荐
绿算技术5 小时前
MCU的工作原理:嵌入式系统的控制核心
单片机·嵌入式硬件
FreakStudio5 小时前
三分钟教学:手把手教你实现Arduino发布第三方库
单片机·mcu·github·嵌入式·arduino·开发工具·电子diy·电子计算机
dujunqiu6 小时前
UDS中多帧传输详解(配合实例)--ISO 15765-2(网络层服务)
嵌入式硬件
luckyext6 小时前
Postman发送GET请求示例及注意事项
前端·后端·物联网·测试工具·小程序·c#·postman
智木芯语6 小时前
【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑
单片机·嵌入式硬件·嵌入式·#stm32·#stc8
promising-w10 小时前
硬件工程师入门教程(四)
嵌入式硬件
坏柠10 小时前
STM32与HAL库开发实战:深入探索ESP8266的多种工作模式
stm32·单片机·嵌入式硬件
电鱼智能的电小鱼11 小时前
SAIL-RK3576核心板应用方案——无人机视觉定位与地面无人设备通信控制方案
linux·嵌入式硬件·无人机·边缘计算
Amy.com11 小时前
嵌入式2-按键
stm32·单片机·嵌入式硬件