STM32 RS232串口通讯实验

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等。其核心参数包括:

2.2 STM32 UART与RS232电平转换

STM32的UART接口输出TTL电平(0V表示“0”,3.3V/5V表示“1”),需通过RS232电平转换芯片(如MAX232、SP3232)将TTL电平转换为RS232电平,才能与PC的RS232接口通信。

核心电路

三、实验器材

器材 型号/参数 数量
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),核心函数包括:

4.3 实验代码实现

4.3.1 主程序(数据发送+回显)

#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 关键函数说明

参考代码 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):

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采集的传感器数据(如温湿度、光照):

// 假设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)——数据收发配置。

专注于matlab/simulink,电子电路,编程