一、实验目的
-
掌握STM32 UART(通用异步收发器)的工作原理及配置方法;
-
理解RS232通信标准的电平转换机制(TTL→RS232);
-
实现STM32与PC之间的RS232串口数据收发(发送/接收/回显);
-
熟悉串口调试助手的使用,验证通信数据的正确性。
二、实验原理
2.1 RS232通信标准
RS232是一种异步串行通信协议 ,采用负逻辑电平 (+3V+15V表示"0",-3V-15V表示"1"),传输距离≤15m,常用波特率有9600、115200等。其核心参数包括:
-
波特率:每秒传输的符号数(如115200bps表示每秒115200位);
-
数据位:5~8位(常用8位);
-
停止位:1~2位(常用1位);
-
校验位:无校验/奇校验/偶校验(常用无校验)。
2.2 STM32 UART与RS232电平转换
STM32的UART接口输出TTL电平 (0V表示"0",3.3V/5V表示"1"),需通过RS232电平转换芯片(如MAX232、SP3232)将TTL电平转换为RS232电平,才能与PC的RS232接口通信。
核心电路:
-
MAX232芯片:内置电荷泵,将+3.3V/5V转换为±10V RS232电平;
-
接线:STM32的UART_TX(TTL)→ MAX232的T1IN,MAX232的T1OUT(RS232)→ DB9接口的TXD;STM32的UART_RX(TTL)← MAX232的R1OUT,MAX232的R1IN(RS232)← DB9接口的RXD。
三、实验器材
| 器材 | 型号/参数 | 数量 |
|---|---|---|
| STM32开发板 | STM32F103C8T6(核心板) | 1 |
| RS232转TTL模块 | MAX232(含DB9接口) | 1 |
| USB转RS232线 | PL2303(连接PC与MAX232的DB9) | 1 |
| 杜邦线 | 母对母/公对母 | 若干 |
| 串口调试助手 | 软件(如XCOM、SecureCRT) | 1 |
四、实验步骤
4.1 硬件连接
-
STM32与MAX232连接(TTL侧):
-
STM32的UART_TX(如USART1_TX=PA9)→ MAX232的T1IN(引脚11);
-
STM32的UART_RX(如USART1_RX=PA10)← MAX232的R1OUT(引脚12);
-
MAX232的VCC接3.3V/5V,GND接STM32的GND。
-
-
MAX232与PC连接(RS232侧):
-
MAX232的T1OUT(引脚14,RS232_TX)→ DB9的TXD(引脚3);
-
MAX232的R1IN(引脚13,RS232_RX)← DB9的RXD(引脚2);
-
DB9的GND(引脚5)接MAX232的GND;
-
通过USB转RS232线将DB9接口连接至PC的USB口(需安装PL2303驱动)。
-
-
STM32供电:通过USB线连接PC(或外部5V电源)。
4.2 软件配置(STM32 HAL库)
以STM32F103C8T6+USART1为例,使用STM32CubeIDE配置UART:
4.2.1 新建工程与UART配置
-
打开STM32CubeIDE,新建工程(选择STM32F103C8T6);
-
在"Connectivity"中选择USART1,配置为异步模式(Asynchronous):
-
波特率:115200 bps;
-
数据位:8位;
-
停止位:1位;
-
校验位:无校验(None);
-
硬件流控:无(None);
-
-
使能USART1的全局中断(NVIC Settings中勾选"USART1 global interrupt");
-
配置系统时钟(HCLK=72MHz,确保波特率计算准确)。
4.2.2 生成代码与关键函数
CubeIDE自动生成UART初始化代码(位于usart.c),核心函数包括:
-
发送函数 :
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) -
接收函数 :
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) -
中断回调函数 :
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)(接收完成中断)
4.3 实验代码实现
4.3.1 主程序(数据发送+回显)
c
#include "main.h"
#include "usart.h"
#include <string.h>
UART_HandleTypeDef huart1;
uint8_t rx_buf[1]; // 接收缓冲区(1字节)
uint8_t tx_buf[] = "Hello, RS232!\r\n"; // 发送数据
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init(); // 初始化USART1
// 启动UART接收中断(1字节)
HAL_UART_Receive_IT(&huart1, rx_buf, 1);
// 循环发送数据
while (1) {
HAL_UART_Transmit(&huart1, tx_buf, strlen((char*)tx_buf), 100); // 发送字符串
HAL_Delay(1000); // 1秒发送一次
}
}
// 接收完成中断回调函数(回显数据)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
HAL_UART_Transmit(&huart1, rx_buf, 1, 100); // 将接收的1字节回发
HAL_UART_Receive_IT(&huart1, rx_buf, 1); // 重新启动接收中断
}
}
4.3.2 关键函数说明
-
HAL_UART_Transmit:阻塞式发送,等待数据发送完成(适合少量数据); -
HAL_UART_Receive_IT:非阻塞式接收,通过中断实现(适合实时接收); -
HAL_UART_RxCpltCallback:接收完成中断回调,在此处处理接收数据(如回显、解析)。
参考代码 STM32 RS232 串口通讯实验 www.youwenfan.com/contentcss/133208.html
五、实验现象与调试
5.1 预期现象
-
数据发送:STM32每隔1秒通过USART1发送字符串"Hello, RS232!",PC端串口调试助手(波特率115200)显示该字符串;
-
数据回显:在串口调试助手中输入任意字符(如"A"),STM32接收后立即回显该字符,调试助手显示"AA"(输入+回显)。
5.2 常见问题与解决
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 串口调试助手无数据显示 | 波特率不匹配(如STM32用9600,助手用115200) | 统一波特率为115200或其他一致值 |
| 数据显示乱码 | 电平转换错误(MAX232接线反接或未供电) | 检查MAX232的VCC/GND接线,确认TX/RX交叉连接 |
| 接收无响应 | UART中断未使能或回调函数未实现 | 在CubeMX中使能USART1中断,重写HAL_UART_RxCpltCallback |
| 发送数据不完整 | 超时时间过短(Timeout参数太小) | 增大Timeout(如设为100ms) |
六、扩展实验
6.1 串口控制LED
修改回调函数,接收字符控制LED亮灭(如接收"1"点亮LED,"0"熄灭LED):
c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
if (rx_buf[0] == '1') HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // LED亮
else if (rx_buf[0] == '0') HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // LED灭
HAL_UART_Transmit(&huart1, rx_buf, 1, 100); // 回显
HAL_UART_Receive_IT(&huart1, rx_buf, 1); // 重启接收
}
}
6.2 传感器数据上传
通过串口发送STM32采集的传感器数据(如温湿度、光照):
c
// 假设DHT22读取的温度为temp,湿度为humi
uint8_t sensor_buf[50];
sprintf((char*)sensor_buf, "Temp: %d.%d C, Humi: %d.%d %%RH\r\n", temp/10, temp%10, humi/10, humi%10);
HAL_UART_Transmit(&huart1, sensor_buf, strlen((char*)sensor_buf), 100);
七、实验总结
本实验通过STM32的UART接口与MAX232电平转换芯片,实现了RS232串口通信。核心步骤包括硬件接线(TTL→RS232转换)、UART配置(波特率、数据位等)、数据收发(发送字符串、中断接收回显)。实验中需注意电平转换的正确性、波特率的匹配及中断的合理应用。通过该实验,可掌握STM32串口通信的基本方法,为后续物联网、传感器数据传输等应用奠定基础。
八、参考资料
1\] STM32F103xx参考手册(RM0008)------UART章节; \[2\] MAX232数据手册(TI)------电平转换原理; \[3\] STM32CubeIDE用户手册------HAL库UART函数说明; \[4\] 串口调试助手使用教程(XCOM)------数据收发配置。