主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
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 校验算法实现
- 七、常见问题排查
- 八、相关资源
- 总结


一、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 数据收发实现
四、通信测试方法
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); // 显示接收数据
}
}
操作步骤:
- 将PB10(TX)与PB11(RX)短接
- 发送测试数据
- 验证接收数据一致性
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) |

关键规则:
无论线缆类型如何命名,必须确保 发送端(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通信系统,关键技术点包括:
- 电平转换:SP3232实现TTL与RS232电平转换
- 驱动配置:USART3的GPIO与参数设置
- 数据收发:查询方式实现可靠通信
- 协议扩展:Modbus RTU工业协议集成
开发建议:
- 长距离传输时增加终端电阻(120Ω)
- 使用示波器验证信号质量
- 关键数据添加校验机制
通过本文的驱动框架,开发者可快速构建工业控制、仪器仪表等领域的串口通信系统,实现设备间可靠的数据交互。
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨RS485总线,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-09)