STM32 RS232串口通讯实验

一、实验目的

  1. 掌握STM32 UART(通用异步收发器)的工作原理及配置方法;

  2. 理解RS232通信标准的电平转换机制(TTL→RS232);

  3. 实现STM32与PC之间的RS232串口数据收发(发送/接收/回显);

  4. 熟悉串口调试助手的使用,验证通信数据的正确性。

二、实验原理

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 硬件连接

  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。

  2. 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驱动)。

  3. STM32供电:通过USB线连接PC(或外部5V电源)。

4.2 软件配置(STM32 HAL库)

STM32F103C8T6+USART1为例,使用STM32CubeIDE配置UART:

4.2.1 新建工程与UART配置
  1. 打开STM32CubeIDE,新建工程(选择STM32F103C8T6);

  2. 在"Connectivity"中选择USART1,配置为异步模式(Asynchronous)

    • 波特率:115200 bps;

    • 数据位:8位;

    • 停止位:1位;

    • 校验位:无校验(None);

    • 硬件流控:无(None);

  3. 使能USART1的全局中断(NVIC Settings中勾选"USART1 global interrupt");

  4. 配置系统时钟(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 预期现象

  1. 数据发送:STM32每隔1秒通过USART1发送字符串"Hello, RS232!",PC端串口调试助手(波特率115200)显示该字符串;

  2. 数据回显:在串口调试助手中输入任意字符(如"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)------数据收发配置。

相关推荐
可乐鸡翅好好吃2 小时前
Keil更改RAM地址
网络·单片机·嵌入式硬件
惶了个恐3 小时前
嵌入式硬件第七弹——ARM(4)
arm开发·stm32·单片机·嵌入式硬件·arm·硬件工程
Lugas Luo4 小时前
SATA 协商流程深度分析 (基于 libata 与 AHCI 控制器)
linux·嵌入式硬件
charlie1145141915 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(3)WSL2 USB 透传,让 ST-Link 穿越虚拟化边界
c++·stm32·单片机·学习·嵌入式
项目題供诗5 小时前
STM32-简介(一)
stm32·单片机·嵌入式硬件
Darth Nihilus6 小时前
Horizon Journey 5 Evaluation and Development Kit(一)
嵌入式硬件·汽车
电子科技圈6 小时前
芯科科技驱动和重塑智能门锁行业格局多协议、安全性、AI技术与开发工具共同赋能
大数据·人工智能·嵌入式硬件·mcu·物联网·智能家居·iot
Heartache boy6 小时前
野火STM32_HAL库版课程笔记-TIM通道捕获应用之超声波测距
笔记·stm32·单片机
dqsh066 小时前
振兴中华之threadX RTOS移植到stm32用stm32cubeMX 保姆级教程
stm32·单片机·嵌入式硬件·rtos·threadx