STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步
STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步
本文是一篇关于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数据手册等。
- 洋桃电子B站课程-STM32入门100步
- STM32F103xx官方数据手册
- STM32F103X8-B数据手册(中文)
- STM32F103固件函数库用户手册(中文)
- SP3232数据手册(英文)
- RS232通信测试程序
总结
本文实现了基于STM32的RS232通信系统,关键技术点包括:
- 电平转换:SP3232实现TTL与RS232电平转换
- 驱动配置:USART3的GPIO与参数设置
- 数据收发:查询方式实现可靠通信
- 协议扩展:Modbus RTU工业协议集成
开发建议:
- 长距离传输时增加终端电阻(120Ω)
- 使用示波器验证信号质量
- 关键数据添加校验机制
通过本文的驱动框架,开发者可快速构建工业控制、仪器仪表等领域的串口通信系统,实现设备间可靠的数据交互。