问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/liwangsb2/article/details/146132129

本文是一篇关于STM32微控制器RS232通信开发的详细教程,适合零基础入门学习。文章内容涵盖了RS232通信的各个方面,包括系统架构、硬件设计、驱动代码、测试方法、DB9接口标准、Modbus RTU实现以及常见问题排查等。

一、RS232通信系统架构

RS232通信系统主要由STM32控制器、电平转换芯片和RS232设备组成。STM32控制器通过USART3接口(PB10/TX和PB11/RX)与电平转换芯片(如SP3232或Max3232)相连,再通过DB9或DB25接口与外部RS232设备通信。系统还支持触摸按键输入,可以是矩阵式或电容式按键。


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

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

2.1 电气特性对比

RS232通信采用差分电平信号,与TTL电平相比具有更远的传输距离和更强的抗干扰能力。具体参数对比如下:

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

2.2 典型电路设计

STM32控制器通过USART3接口与电平转换芯片相连,具体电路连接如下:

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

三、USART3驱动代码解析

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

USART3的初始化代码主要完成GPIO配置和USART参数设置。关键代码如下:

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 数据收发实现

数据收发主要通过USART的发送和接收函数实现。发送数据使用USART_SendData函数,接收数据使用USART_ReceiveData函数。具体实现细节在代码中已有详细注释。

四、通信测试方法

4.1 自发自收测试

自发自收测试用于验证USART3的基本通信功能。测试方法是将PB10(TX)与PB11(RX)短接,然后发送测试字符串并检查接收数据是否正确。关键代码如下:

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

4.2 外设连接测试

外设连接测试用于验证与外部设备的通信功能。测试设备包括PC串口、工业PLC和条码扫描枪等。测试结果应确保双向通信正常、协议交互成功和数据实时接收。

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

五、DB9接口标准线序

5.1 引脚定义(DTE设备)

DB9接口的引脚定义如下:

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

5.2 线缆类型选择

RS232通信常用的线缆类型包括交叉线和直连线。关键规则是确保发送端(TXD)与接收端(RXD)交叉连接,即:

  • 设备A的TXD ➔ 设备B的RXD
  • 设备A的RXD ➔ 设备B的TXD
  • GND直连


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

六、进阶应用:Modbus RTU实现

6.1 协议帧格式

Modbus RTU协议是一种常用的工业通信协议,其帧格式包括设备地址、功能码、数据段和CRC校验。示例代码如下:

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

6.2 校验算法实现

CRC16校验算法用于确保数据传输的完整性。具体实现代码如下:

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;
}

七、常见问题排查

在RS232通信开发中,常见的故障现象包括无数据收发、数据乱码和偶发丢包等。排查方法包括检查SP3232供电电压、波特率设置、接地连接和线缆质量等。

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

八、相关资源

以下是本文参考的相关资源,包括洋桃电子的B站课程、STM32官方数据手册、固件函数库用户手册以及SP3232数据手册等。

  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Ω)
  • 使用示波器验证信号质量
  • 关键数据添加校验机制

通过本文的驱动框架,开发者可快速构建工业控制、仪器仪表等领域的串口通信系统,实现设备间可靠的数据交互。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号