制作团体网站,福建省建设质量安全协会网站,个人网页html实例完整代码,j2ee大型网站开发框架文章目录一、前期准备1. 软硬件环境2. UART核心原理梳理二、实战1#xff1a;UART初始化#xff08;以USART1为例#xff0c;9600波特率#xff09;1. 配置思路2. Keil工程代码实现三、实战2#xff1a;查询模式收发数据#xff08;基础版#xff09;1. 核心函数编写2. …文章目录一、前期准备1. 软硬件环境2. UART核心原理梳理二、实战1UART初始化以USART1为例9600波特率1. 配置思路2. Keil工程代码实现三、实战2查询模式收发数据基础版1. 核心函数编写2. 串口调试助手验证步骤1硬件连接步骤2串口调试助手配置步骤3验证效果四、实战3中断模式收发数据高效版1. 中断配置与代码实现2. 串口调试助手验证五、进阶配置修改波特率115200bps六、Keil调试与问题排查技巧1. Keil调试验证中断流程2. 常见问题与解决问题1串口无数据输出问题2接收数据乱码问题3中断不触发问题4缓冲区溢出七、实战扩展多字节/协议收发串口通信UART是单片机与外设、上位机交互的核心方式广泛应用于数据打印、指令接收、设备联动等场景。本文基于STM32F103C8T6单片机结合Keil MDK-ARM开发环境从底层寄存器配置到实战调试手把手讲解UART初始化、查询模式收发、中断模式收发并配套串口调试助手验证方法零基础也能快速掌握串口开发核心技能。一、前期准备1. 软硬件环境硬件STM32F103C8T6最小系统板、USB-TTL模块CH340/PL2303、杜邦线、电脑Windows软件Keil MDK-ARM V5.36需安装STM32F103器件库、串口调试助手SSCOM/串口助手V1.4基础知识熟悉STM32 GPIO配置、USART寄存器结构、Keil工程创建流程、C语言基础。2. UART核心原理梳理STM32F103的USART1挂载在APB2总线USART2/3挂载在APB1总线核心参数波特率数据传输速率常用9600、115200bps由波特率寄存器USART_BRR配置数据帧1位起始位8位数据位1位停止位无校验可配置奇偶校验、停止位数量收发模式查询模式轮询寄存器标志位、中断模式数据收发触发中断硬件连接USART_TX发送接USB-TTL的RXUSART_RX接收接USB-TTL的TX共地GND。二、实战1UART初始化以USART1为例9600波特率初始化是串口通信的基础需配置GPIO复用、时钟、波特率、帧格式等核心参数。1. 配置思路系统时钟72MHzUSART1时钟来自APB272MHz波特率9600bps计算USART_BRR值分频值 72000000 / 9600 7500 → BRR寄存器配置为0x1D4C十进制7500的十六进制GPIO配置PA9USART1_TX为复用推挽输出PA10USART1_RX为浮空输入使能USART1时钟、GPIOA时钟开启串口收发功能。2. Keil工程代码实现#includestm32f10x.h#includestdio.h// USART1初始化函数9600波特率8位数据位1位停止位无校验voidUSART1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 1. 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);// 2. 配置GPIOPA9TXPA10RX// PA9USART1_TX 复用推挽输出GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);// PA10USART1_RX 浮空输入GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_InitStructure);// 3. 配置USART参数USART_InitStructure.USART_BaudRate9600;// 波特率USART_InitStructure.USART_WordLengthUSART_WordLength_8b;// 8位数据位USART_InitStructure.USART_StopBitsUSART_StopBits_1;// 1位停止位USART_InitStructure.USART_ParityUSART_Parity_No;// 无校验USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;// 无硬件流控USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx;// 收发使能USART_Init(USART1,USART_InitStructure);// 4. 使能USART1USART_Cmd(USART1,ENABLE);}// 重定向printf到USART1方便打印字符串intfputc(intch,FILE*f){// 等待发送数据寄存器为空while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);// 发送字节USART_SendData(USART1,(u8)ch);returnch;}三、实战2查询模式收发数据基础版查询模式通过轮询USART状态标志位实现数据收发逻辑简单适合低频率数据交互。1. 核心函数编写// 查询模式发送单个字节voidUSART1_SendByte(u8 data){// 等待TXE标志位发送数据寄存器空while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE));USART_SendData(USART1,data);}// 查询模式发送字符串voidUSART1_SendString(u8*str){while(*str!\0){USART1_SendByte(*str);str;}// 等待发送完成while(USART_GetFlagStatus(USART1,USART_FLAG_TC)RESET);}// 查询模式接收单个字节阻塞式u8USART1_ReceiveByte(void){// 等待RXNE标志位接收数据寄存器非空while(!USART_GetFlagStatus(USART1,USART_FLAG_RXNE));returnUSART_ReceiveData(USART1);}// 主函数测试intmain(void){u8 recv_data;// 初始化USART1USART1_Init();// 上电发送欢迎信息USART1_SendString((u8*)STM32 USART1 Test (查询模式)\r\n);USART1_SendString((u8*)请输入字符\r\n);while(1){// 接收单个字节recv_dataUSART1_ReceiveByte();// 回显接收到的字符USART1_SendByte(recv_data);// 接收到换行符发送提示if(recv_data\r){USART1_SendString((u8*)\r\n已接收字符等待下一次输入...\r\n);}}}2. 串口调试助手验证步骤1硬件连接STM32 PA9USART1_TX→ USB-TTL RXSTM32 PA10USART1_RX→ USB-TTL TXSTM32 GND → USB-TTL GNDUSB-TTL插入电脑USB口安装驱动CH340/PL2303。步骤2串口调试助手配置打开串口调试助手如SSCOM选择对应COM口电脑设备管理器查看配置参数波特率9600、8位数据位、1位停止位、无校验、无流控点击“打开串口”。步骤3验证效果编译Keil工程下载程序到STM32串口调试助手接收区显示“STM32 USART1 Test (查询模式) 请输入字符”在发送区输入任意字符如“123”点击发送接收区回显该字符输入回车\r接收区显示“已接收字符等待下一次输入…”验证查询模式收发正常。四、实战3中断模式收发数据高效版查询模式会阻塞主程序中断模式通过收发中断实现异步通信适合高频率、实时性要求高的场景。1. 中断配置与代码实现#includestm32f10x.h#includestdio.hu8 recv_buf[100];// 接收缓冲区u8 recv_len0;// 接收数据长度u8 recv_flag0;// 接收完成标志回车触发// USART1初始化含中断配置voidUSART1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);// 2. GPIO配置GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_InitStructure);// 3. USART参数配置USART_InitStructure.USART_BaudRate9600;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;USART_InitStructure.USART_StopBitsUSART_StopBits_1;USART_InitStructure.USART_ParityUSART_Parity_No;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx;USART_Init(USART1,USART_InitStructure);// 4. 中断配置// 开启接收中断USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);// NVIC配置NVIC_InitStructure.NVIC_IRQChannelUSART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;// 抢占优先级1NVIC_InitStructure.NVIC_IRQChannelSubPriority0;// 子优先级0NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);// 5. 使能USART1USART_Cmd(USART1,ENABLE);}// 重定向printfintfputc(intch,FILE*f){while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);USART_SendData(USART1,(u8)ch);returnch;}// USART1中断服务函数voidUSART1_IRQHandler(void){u8 recv_data;// 接收中断触发if(USART_GetITStatus(USART1,USART_IT_RXNE)!RESET){recv_dataUSART_ReceiveData(USART1);// 读取接收数据if(recv_data!\r)// 未接收到回车存入缓冲区{recv_buf[recv_len]recv_data;recv_len;// 防止缓冲区溢出if(recv_len99)recv_len0;}else// 接收到回车标记接收完成{recv_buf[recv_len]\0;// 字符串结束符recv_flag1;// 置位完成标志recv_len0;// 重置长度}USART_ClearITPendingBit(USART1,USART_IT_RXNE);// 清除中断标志}}// 主函数测试intmain(void){USART1_Init();printf(STM32 USART1 Test (中断模式)\r\n);printf(请输入字符串回车结束\r\n);while(1){if(recv_flag1)// 检测到接收完成{// 回显接收到的字符串printf(已接收%s\r\n,recv_buf);// 重置标志recv_flag0;printf(请继续输入\r\n);}// 主循环可执行其他任务如LED闪烁不被串口阻塞}}2. 串口调试助手验证硬件连接、串口助手配置同查询模式下载程序后串口助手接收区显示“STM32 USART1 Test (中断模式) 请输入字符串回车结束”在发送区输入任意字符串如“hello stm32”点击发送串口助手接收区回显“已接收hello stm32”且主程序可同时执行其他任务如添加LED闪烁代码验证中断不阻塞主循环。五、进阶配置修改波特率115200bps实际开发中115200bps更常用仅需修改USART_Init中的波特率参数并重新计算BRR值// 波特率改为115200USART_InitStructure.USART_BaudRate115200;STM32F103 APB2时钟72MHz时115200波特率的BRR值由硬件自动计算无需手动配置仅需同步修改串口调试助手的波特率为115200即可。六、Keil调试与问题排查技巧1. Keil调试验证中断流程编译工程后点击“Debug”进入调试模式打开“Watch Call Stack Window”添加recv_flag、recv_len、recv_buf启动调试Run在串口助手发送字符串暂停调试后查看变量recv_len随接收字符递增发送回车后recv_flag变为1recv_buf存储完整字符串断点调试在USART1_IRQHandler函数内添加断点F9触发接收中断时自动暂停分析中断执行流程。2. 常见问题与解决问题1串口无数据输出排查点1GPIO配置错误PA9是否为复用推挽PA10是否为浮空输入排查点2时钟未使能RCC_APB2Periph_USART1/RCC_APB2Periph_GPIOA排查点3USART未使能USART_Cmd(USART1, ENABLE)排查点4硬件连接错误TX/RX交叉连接未共地。问题2接收数据乱码排查点1波特率不匹配Keil配置与串口助手波特率一致排查点2系统时钟错误确认STM32主频为72MHz而非8MHz排查点3硬件干扰缩短杜邦线远离电源模块。问题3中断不触发排查点1未开启接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)排查点2NVIC优先级配置错误抢占/子优先级未合理分配排查点3中断标志未清除USART_ClearITPendingBit。问题4缓冲区溢出解决方法在中断服务函数中增加缓冲区长度判断超出阈值时重置长度优化方案采用环形缓冲区提升数据存储效率。七、实战扩展多字节/协议收发实际项目中常需收发结构化数据如传感器数据、控制指令可基于中断模式扩展// 示例接收自定义协议帧头0xAA 数据 校验位 帧尾0xFFvoidUSART1_IRQHandler(void){staticu8 protocol_buf[20];staticu8 protocol_len0;u8 recv_data;if(USART_GetITStatus(USART1,USART_IT_RXNE)!RESET){recv_dataUSART_ReceiveData(USART1);// 帧头检测if(protocol_len0recv_data!0xAA)return;// 存入协议缓冲区protocol_buf[protocol_len]recv_data;protocol_len;// 帧尾检测假设协议长度固定为8字节if(protocol_len8protocol_buf[7]0xFF){// 校验位验证示例前6字节和 第7字节前的校验位u8 check_sum0;for(u8 i1;i6;i)check_sumprotocol_buf[i];if(check_sumprotocol_buf[6]){// 协议校验通过处理数据printf(协议接收成功);for(u8 i0;i8;i)printf(%02X ,protocol_buf[i]);printf(\r\n);}protocol_len0;// 重置}// 超时/溢出处理if(protocol_len19)protocol_len0;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}