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步

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)
相关推荐
Yiran_G3 分钟前
BLE终端数据积压如何处理?缓存队列、断连补传与流量调度设计
嵌入式硬件·物联网
做萤石二次开发的哈哈26 分钟前
网络音箱如何接入?音频文件夹、TTS播报、音量管控与ISAPI透传对接详解
人工智能·物联网·蓝海aiot一站式工作台·aiot开发·网络音箱·智慧广播·二次开放
硅基手札27 分钟前
【串口技术系列文档 07】UART控制器寄存器详解
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
甜甜的大香瓜33 分钟前
【MT32F006】MT32F006之TM1621C驱动LCD
单片机
硅基手札39 分钟前
【串口技术系列文档 09】FIFO管理与流控
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札39 分钟前
【串口技术系列文档 08】中断驱动vs轮询vs DMA
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
尼喃1 小时前
OVP芯片完整方案:前级瞬态钳位、持续过压隔离与后端保护
嵌入式硬件
不会代码的小猴1 小时前
认识HAL库
单片机·嵌入式硬件
by————组态1 小时前
Ricon组态适用领域全景解析:工业制造、能源、市政民生与智慧城市四大场景落地实践
后端·物联网·数学建模·智慧城市·能源·制造·组态
莫小墨1 小时前
数字地、模拟地、功率地
嵌入式硬件