第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/7/23 7:37:57 阅读更多 →
孩子成绩持续落后,盲目刷题没用!挑选 AI 智习室,为什么很多家长选择佐管家?

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

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

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

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

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

2026/7/23 7:37:57 阅读更多 →

最新新闻

ZCC7606 8 通道 16 位同步采样 ADC,硬件兼容 AD7606/ADS8588

ZCC7606 8 通道 16 位同步采样 ADC,硬件兼容 AD7606/ADS8588

无锡至诚微电子ZCC7606国产替代AD7606 在电力继电保护、储能测控、工业自动化等高可靠场景中,多通道同步采样的精度、稳定性与抗干扰能力,直接决定整机设备的测量水准与运行安全。面对进口ADC长期缺货、涨价、交付不确定的行业现状,越来越多工…

2026/7/23 13:26:27 阅读更多 →
Pod 失陷了怎么办?凭据管理系统如何把数据库泄露风险压到零

Pod 失陷了怎么办?凭据管理系统如何把数据库泄露风险压到零

传统的安全思路是"把墙筑高"——装好防火墙、收紧网络策略、定期扫漏洞。但在云原生时代,一个更务实的假设是:墙迟早会被突破。当攻击者已经拿到一个 Pod 的 shell,你的数据库密码还安全吗?这是一篇写给安全运维工程师的…

2026/7/23 13:26:27 阅读更多 →
MSPM0安全启动与存储保护:构建嵌入式系统的硬件信任根

MSPM0安全启动与存储保护:构建嵌入式系统的硬件信任根

1. 项目概述与安全架构核心价值在嵌入式开发领域,尤其是面向工业控制、智能家居和医疗设备等场景,系统安全早已不是“锦上添花”的选项,而是产品能否成功上市的“生死线”。恶意固件注入、代码窃取、数据篡改等攻击手段层出不穷,单…

2026/7/23 13:26:27 阅读更多 →
从零手写 AI Agent:一个本地知识库助手的完整实现(Python + DeepSeek)

从零手写 AI Agent:一个本地知识库助手的完整实现(Python + DeepSeek)

前言 最近 AI Agent 这个概念火得不行,各种框架(LangChain、CrewAI、AutoGen)层出不穷。但我发现很多新手一上来就啃框架源码,结果被各种抽象层绕晕了。 其实 Agent 的核心原理非常简单——就是一个 while 循环。你完全可以从零…

2026/7/23 13:26:27 阅读更多 →
DeepSeek V4 + Pixso AI实测:一套AI生成图片和UI稿的新流程

DeepSeek V4 + Pixso AI实测:一套AI生成图片和UI稿的新流程

如果让AI深度参与到产研里,生成代码和UI稿能变简单吗?最近我尝试了一套全新的组合工作流:用 DeepSeek V4 负责理解需求和拆解逻辑,用 Pixso AI 负责生成视觉方案和具体的设计稿。效果还行,分享下具体怎么用的。一、Dee…

2026/7/23 13:26:27 阅读更多 →
UE5蓝图实现GPU Instancing:动态海量物体渲染与性能优化指南

UE5蓝图实现GPU Instancing:动态海量物体渲染与性能优化指南

1. 项目概述:为什么我们需要蓝图驱动的GPU Instancing?如果你在UE5里做过需要大量重复物体的场景,比如一片随风摇曳的草地、一片茂密的森林、或者城市里熙熙攘攘的人群,那你一定体会过手动摆放的痛苦。一个一个拖拽Actor到场景里&…

2026/7/23 13:25:27 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻