一、实验目的掌握STM32 UART通用异步收发器的工作原理及配置方法理解RS232通信标准的电平转换机制TTL→RS232实现STM32与PC之间的RS232串口数据收发发送/接收/回显熟悉串口调试助手的使用验证通信数据的正确性。二、实验原理2.1 RS232通信标准RS232是一种异步串行通信协议采用负逻辑电平3V15V表示“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_TXTTL→ MAX232的T1INMAX232的T1OUTRS232→ DB9接口的TXDSTM32的UART_RXTTL← MAX232的R1OUTMAX232的R1INRS232← DB9接口的RXD。三、实验器材器材型号/参数数量STM32开发板STM32F103C8T6核心板1RS232转TTL模块MAX232含DB9接口1USB转RS232线PL2303连接PC与MAX232的DB91杜邦线母对母/公对母若干串口调试助手软件如XCOM、SecureCRT1四、实验步骤4.1 硬件连接STM32与MAX232连接TTL侧STM32的UART_TX如USART1_TXPA9→ MAX232的T1IN引脚11STM32的UART_RX如USART1_RXPA10← MAX232的R1OUT引脚12MAX232的VCC接3.3V/5VGND接STM32的GND。MAX232与PC连接RS232侧MAX232的T1OUT引脚14RS232_TX→ DB9的TXD引脚3MAX232的R1IN引脚13RS232_RX← DB9的RXD引脚2DB9的GND引脚5接MAX232的GND通过USB转RS232线将DB9接口连接至PC的USB口需安装PL2303驱动。STM32供电通过USB线连接PC或外部5V电源。4.2 软件配置STM32 HAL库以STM32F103C8T6USART1为例使用STM32CubeIDE配置UART4.2.1 新建工程与UART配置打开STM32CubeIDE新建工程选择STM32F103C8T6在“Connectivity”中选择USART1配置为异步模式Asynchronous波特率115200 bps数据位8位停止位1位校验位无校验None硬件流控无None使能USART1的全局中断NVIC Settings中勾选“USART1 global interrupt”配置系统时钟HCLK72MHz确保波特率计算准确。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 主程序数据发送回显#includemain.h#includeusart.h#includestring.hUART_HandleTypeDef huart1;uint8_trx_buf[1];// 接收缓冲区1字节uint8_ttx_buf[]Hello, RS232!\r\n;// 发送数据intmain(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秒发送一次}}// 接收完成中断回调函数回显数据voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(huart-InstanceUSART1){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”熄灭LEDvoidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(huart-InstanceUSART1){if(rx_buf[0]1)HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);// LED亮elseif(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湿度为humiuint8_tsensor_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——数据收发配置。