第30讲:实战——USART串口收发原型快速搭建+调试
CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第30讲实战——USART串口收发原型快速搭建调试一、USART基础USART通用同步/异步收发器是嵌入式最常用的通信接口用于与PC、其他MCU、模块通信。1.1 USART配置要点基本参数波特率9600、19200、38400、57600、115200等数据位8位最常用停止位1位最常用校验位无最常用流控无最常用引脚配置USART1PA9(TX)、PA10(RX)USART2PA2(TX)、PA3(RX)USART3PB10(TX)、PB11(RX)1.2 通信模式轮询模式特点阻塞等待适用简单应用、调试中断模式特点非阻塞、事件驱动适用实际应用DMA模式特点高效、CPU占用少适用高速、大数据量二、串口发送实战2.1 基础发送需求串口发送Hello WorldPrompt生成STM32F103 USART发送代码 - USART1PA9(TX)、PA10(RX) - 波特率115200 - 功能发送Hello World - 使用HAL库AI生成#includestm32f1xx_hal.hUART_HandleTypeDef huart1;voidUSART1_Init(void){huart1.InstanceUSART1;huart1.Init.BaudRate115200;huart1.Init.WordLengthUART_WORDLENGTH_8B;huart1.Init.StopBitsUART_STOPBITS_1;huart1.Init.ParityUART_PARITY_NONE;huart1.Init.ModeUART_MODE_TX_RX;huart1.Init.HwFlowCtlUART_HWCONTROL_NONE;huart1.Init.OverSamplingUART_OVERSAMPLING_16;HAL_UART_Init(huart1);}intmain(void){HAL_Init();SystemClock_Config();USART1_Init();char*msgHello World\r\n;HAL_UART_Transmit(huart1,(uint8_t*)msg,strlen(msg),100);while(1);}2.2 printf重定向需求使用printf输出到串口代码// 重定向fputcintfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,100);returnch;}// 使用intmain(void){HAL_Init();SystemClock_Config();USART1_Init();printf(System Start\r\n);printf(Version: 1.0\r\n);while(1){printf(Tick: %d\r\n,HAL_GetTick());HAL_Delay(1000);}}Keil配置Options → Target → Use MicroLIB勾选2.3 格式化输出需求输出各种格式的数据代码voidPrint_Data(void){uint8_tdata0x55;uint16_tvalue1234;floattemperature25.6f;// 十进制printf(Value: %d\r\n,value);// 十六进制printf(Hex: 0x%02X\r\n,data);// 浮点数printf(Temperature: %.2f\r\n,temperature);// 二进制printf(Binary: );for(inti7;i0;i--){printf(%d,(datai)1);}printf(\r\n);}三、串口接收实战3.1 轮询接收需求接收数据并回显代码intmain(void){HAL_Init();SystemClock_Config();USART1_Init();uint8_trxData;while(1){// 接收数据if(HAL_UART_Receive(huart1,rxData,1,100)HAL_OK){// 回显HAL_UART_Transmit(huart1,rxData,1,100);}}}3.2 中断接收需求使用中断接收数据Prompt生成STM32F103 USART中断接收代码 - USART1PA9(TX)、PA10(RX) - 波特率115200 - 功能中断接收并回显 - 使用HAL库AI生成uint8_trxData;voidUSART1_Init(void){huart1.InstanceUSART1;huart1.Init.BaudRate115200;huart1.Init.WordLengthUART_WORDLENGTH_8B;huart1.Init.StopBitsUART_STOPBITS_1;huart1.Init.ParityUART_PARITY_NONE;huart1.Init.ModeUART_MODE_TX_RX;huart1.Init.HwFlowCtlUART_HWCONTROL_NONE;huart1.Init.OverSamplingUART_OVERSAMPLING_16;HAL_UART_Init(huart1);// 启动接收中断HAL_UART_Receive_IT(huart1,rxData,1);}voidUSART1_IRQHandler(void){HAL_UART_IRQHandler(huart1);}voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(huart-InstanceUSART1){// 回显HAL_UART_Transmit(huart1,rxData,1,100);// 继续接收HAL_UART_Receive_IT(huart1,rxData,1);}}intmain(void){HAL_Init();SystemClock_Config();USART1_Init();while(1){// 主循环可以做其他事情}}3.3 环形缓冲区接收需求使用环形缓冲区接收数据避免数据丢失代码#defineBUFFER_SIZE256typedefstruct{uint8_tbuffer[BUFFER_SIZE];uint16_thead;uint16_ttail;}RingBuffer_t;RingBuffer_t rxBuffer{0};voidRingBuffer_Write(uint8_tdata){uint16_tnextHead(rxBuffer.head1)%BUFFER_SIZE;if(nextHead!rxBuffer.tail){// 缓冲区未满rxBuffer.buffer[rxBuffer.head]data;rxBuffer.headnextHead;}}uint8_tRingBuffer_Read(uint8_t*data){if(rxBuffer.headrxBuffer.tail){// 缓冲区空return0;}*datarxBuffer.buffer[rxBuffer.tail];rxBuffer.tail(rxBuffer.tail1)%BUFFER_SIZE;return1;}uint16_tRingBuffer_Available(void){return(rxBuffer.head-rxBuffer.tailBUFFER_SIZE)%BUFFER_SIZE;}// 中断回调voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(huart-InstanceUSART1){RingBuffer_Write(rxData);HAL_UART_Receive_IT(huart1,rxData,1);}}// 主循环处理voidProcess_UartData(void){uint8_tdata;while(RingBuffer_Read(data)){// 处理数据printf(Received: 0x%02X\r\n,data);}}四、串口调试技巧4.1 串口工具常用工具- 串口调试助手SSCOM、XCOM、串口精灵 - 终端工具PuTTY、Tera Term、SecureCRT - 分析工具逻辑分析仪、协议分析仪配置波特率115200 数据位8 停止位1 校验位无 流控无4.2 调试输出分级日志#defineLOG_LEVEL3// 0:无 1:错误 2:警告 3:信息 4:调试#defineLOG_ERROR(fmt,...)if(LOG_LEVEL1)printf([ERROR] fmt\r\n,##__VA_ARGS__)#defineLOG_WARN(fmt,...)if(LOG_LEVEL2)printf([WARN] fmt\r\n,##__VA_ARGS__)#defineLOG_INFO(fmt,...)if(LOG_LEVEL3)printf([INFO] fmt\r\n,##__VA_ARGS__)#defineLOG_DEBUG(fmt,...)if(LOG_LEVEL4)printf([DEBUG] fmt\r\n,##__VA_ARGS__)// 使用LOG_ERROR(UART initialization failed);LOG_WARN(Buffer nearly full: %d,usage);LOG_INFO(System started);LOG_DEBUG(Received byte: 0x%02X,data);4.3 数据分析十六进制输出voidPrint_Hex(uint8_t*data,uint16_tlen){printf(Hex: );for(uint16_ti0;ilen;i){printf(%02X ,data[i]);}printf(\r\n);}ASCII输出voidPrint_ASCII(uint8_t*data,uint16_tlen){printf(ASCII: );for(uint16_ti0;ilen;i){if(data[i]32data[i]126){// 可打印字符printf(%c,data[i]);}else{printf(.);}}printf(\r\n);}混合输出voidPrint_Data_Mixed(uint8_t*data,uint16_tlen){printf(Data[%d]:\r\n,len);for(uint16_ti0;ilen;i){printf(%02X ,data[i]);if((i1)%160){// 每16字节换行printf( );for(uint16_tji-15;ji;j){if(data[j]32data[j]126){printf(%c,data[j]);}else{printf(.);}}printf(\r\n);}}// 处理剩余字节if(len%16!0){for(uint16_tilen%16;i16;i){printf( );}printf( );for(uint16_tjlen-(len%16);jlen;j){if(data[j]32data[j]126){printf(%c,data[j]);}else{printf(.);}}printf(\r\n);}}五、常见问题与解决5.1 乱码问题现象串口输出乱码原因1. 波特率不匹配 2. 系统时钟配置错误 3. 数据格式不匹配解决// 验证波特率voidVerify_Baudrate(void){printf(SystemCoreClock: %d\r\n,SystemCoreClock);printf(UART BRR: 0x%04X\r\n,USART1-BRR);uint32_tactualBaudSystemCoreClock/(USART1-BRR0xFFFF);printf(Actual baudrate: %d\r\n,actualBaud);}5.2 数据丢失现象接收数据丢失原因1. 接收缓冲区溢出 2. 处理速度慢 3. 中断被阻塞解决// 使用环形缓冲区// 提高处理速度// 优化中断优先级5.3 发送卡死现象发送函数卡死原因1. 超时时间过短 2. UART未初始化 3. 引脚配置错误解决// 增加超时时间HAL_UART_Transmit(huart1,data,len,1000);// 1秒超时// 检查初始化if(huart1.Instance!USART1){printf(UART not initialized\r\n);}六、本讲核心要点6.1 记住这三句话串口配置波特率、数据位、停止位、校验位最常用8N1接收方式轮询简单、中断常用、DMA高效调试技巧printf重定向、分级日志、数据分析6.2 实践建议对于新手学习串口配置实践中断接收使用调试工具对于有经验工程师建立串口驱动模板实现环形缓冲区优化调试输出6.3 下讲预告第31讲将深入讲解实战SPI屏驱动快速试错、点亮屏幕SPI常用于驱动屏幕如何快速试错点亮屏幕下一讲将详细讲解。

相关新闻

Claude---s1---框架梳理

Claude---s1---框架梳理

详细数据流转:1️⃣ 用户发起指令与系统组装 (CLI & Initialization)用户动作:在终端输入 RuiZN run --goal "读取当前目录下的 README.md"。数据流转:cli/main.py 接收到原生命令行参数,argparse 将其解析为字符串…

2026/10/13 3:21:16 阅读更多 →
孩子成绩持续落后,盲目刷题没用!挑选 AI 智习室,为什么很多家长选择佐管家?

孩子成绩持续落后,盲目刷题没用!挑选 AI 智习室,为什么很多家长选择佐管家?

不少家长都有同样的困扰:孩子成绩长期跟不上,作业拖拉、错题反复出现;上课似懂非懂,考试一塌糊涂。补习班跟不上进度,居家辅导矛盾不断。双减背景下,越来越多家庭把目光投向 AI 智习室,但市面上…

2026/10/4 3:12:11 阅读更多 →
飞轮储能精密储能舱车间通风 易互德防静电稳温布风管保障储能设备装配安全

飞轮储能精密储能舱车间通风 易互德防静电稳温布风管保障储能设备装配安全

飞轮储能装置属于高速旋转精密储能装备,转子、磁悬浮轴承对环境粉尘、静电、温湿度变化高度敏感。微米级粉尘进入装配舱,会造成高速轴承磨损、动平衡失衡;静电放电极易损伤电控模块;温度波动引发材料热胀冷缩,降低转子…

2026/10/13 0:17:24 阅读更多 →

最新新闻

股债汇金四杀:买得分散,为什么还会一起亏?

股债汇金四杀:买得分散,为什么还会一起亏?

**分散买了股票、债券、美元和黄金,不等于分散了“急着用钱”的风险。**市场平静时,它们讲的是不同故事;资金紧张时,它们可能面对同一个问题:持有人必须把资产变成现金。 最近“股债汇金四杀”的说法很吓人。但对一个…

2026/10/13 3:21:48 阅读更多 →
就业指南|分析了近百份简历后,我决定写一篇就业指南

就业指南|分析了近百份简历后,我决定写一篇就业指南

本篇文章共 10000字,完全阅读全篇约10分钟 州弟学安全,只学有用的知识 前言 大家好,我是州弟。 大家还记得我上一篇文章吗?网安面试|记2026年8月国内某情报安全厂商面试的一次经历 ,当时分享了我主动投递并完整体验…

2026/10/13 3:21:48 阅读更多 →
[Java] 常用工具类

[Java] 常用工具类

日期相关类Date 类java.util.Date:Java 早期的日期时间类,精确到毫秒,用来表示一个特定的时刻常用成员方法可用方法:1)boolean after(Date when):判断当前日期是否在指定日期之后2)boolean befo…

2026/10/13 3:21:48 阅读更多 →
微信小程序打卡系统源码解析:前后端分离与MySQL表设计实战

微信小程序打卡系统源码解析:前后端分离与MySQL表设计实战

简介:这套基于小程序的互动打卡项目源代码,采用JavaSSM构建后端服务,前端基于uniapp/原生小程序开发,并配套MySQL 5.7数据库脚本,是一套完整可运行的前后端工程,适合Java学习者及毕业设计、课程设计参考。压…

2026/10/13 3:21:48 阅读更多 →
微信小程序互动打卡系统:MySQL表结构设计与前后端完整实现

微信小程序互动打卡系统:MySQL表结构设计与前后端完整实现

简介:这套基于小程序的互动打卡完整前后端源码,采用Java与SSM框架构建后端服务,搭配uniapp与原生小程序前端,适合毕业设计、课程设计或小程序开发学习者参考。资源共1248个文件,压缩包约8.77MB,核心包含Jav…

2026/10/13 3:21:48 阅读更多 →
CS231n KNN作业深度解析:从像素距离到视觉本质

CS231n KNN作业深度解析:从像素距离到视觉本质

1. 这不是“写个KNN”——而是用最朴素的代码照见计算机视觉的底层逻辑你点开CS231n作业1-Q1,看到“写一个K近邻分类器”,第一反应可能是:不就是算距离、排个序、投个票?抄几行numpy就完事了。我当年也是这么想的,直到…

2026/10/13 3:20:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →