第十五届蓝桥杯-UART接收不定长指令的处理

学习初衷: 不仅仅为了比赛!

目录

一、问题引入

二、UART常用的三种工作模式

1.UART工作在中断模式

2.UART工作在DMA模式下

3.uart工作在接收转空闲的模式下

三、获取指令中需要的数据

四、printf函数的实现


一、问题引入

问题引入:请看下面这样一个设计要求

这个时候, 是不是使用一下的这种配置方法就不得行了

/* 主函数初始化 */
Uart_Init();/* 接收中断, 该函数的最后一个参数指定接收到对应的字符数后才触发中断 */
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 7);/* uart接收完成ISR */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1) {printf("recv: 111111\r\n");memset(uart_recv_buff, 0 , sizeof(uart_recv_buff));HAL_UART_Receive_IT(&huart1, uart_recv_buff, 5);}
}

以上的配置方法只适合接收的字符数量确定的情况, 对于文章开头描述的问题并不能完成要求。

二、UART常用的三种工作模式

1.UART工作在中断模式

也就是上述所描述的那种情况, 给大家配置一下, 将就我也再加深一下印象。

不去配置指定的引脚的化, 再uart的参数配置这里配置好后的USART1的默认引脚不是PA9和PA10, 这个坑大家注意一下。

接着就可以生成代码。在过程种大家在初始化函数的地方调用生成好的的uart的初始化函数,接着在调用uart接收并产生中断的哪一个函数, 注意点就是该函数必须接收到指定的字符数才产生中断

/* 主函数初始化 */
Uart_Init();/* 接收中断, 该函数的最后一个参数指定接收到对应的字符数后才触发中断 */
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 7);/* uart接收完成ISR */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1) {printf("recv: 111111\r\n");memset(uart_recv_buff, 0 , sizeof(uart_recv_buff));HAL_UART_Receive_IT(&huart1, uart_recv_buff, 5);}
}

2.UART工作在DMA模式下

配置和上述一样, uart的基本参数, 接着需要配置一下DMA

生成代码的代码编写如下, 和uart的接收中断模式一样

3.uart工作在接收转空闲的模式下

上述函数可能不太常用, 该函数的位置

上述中断回调函数的位置

如此, 就能接收不定长的指令了

三、获取指令中需要的数据

给大家说一些C库函数, 大家不会的学一下, 很有用。

sprintf

snprintf

sscanf()

strtok

strchr

strstr

就可以将接收到的数据, 给轻松的解析出来, 剩下的就是逻辑处理的工作了

四、printf函数的实现

调试程序非常有用, 建议大家比赛的时候配置上, 简单讲一下用处。

在函数中打印信息, 查看函数的调用情况

打印变量的值, 在逻辑不清楚的时候, 打印变量的值可以很快的帮助我们解决问题

在过程中任意的位置实现fputc函数

int fputc(int ch, FILE *fp)
{/* 当串口的发送数据寄存器不空的时候等待 */while((USART1->ISR & (1 << 7)) == 0);UASRT1->TDR = ch;return ch;
}

好了, 就分享这么多, 希望需要帮助的人看了能有思路,不在疑惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/273728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX学习笔记20——SD卡FATFS文件系统

1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构&#xff08;即在存储设备上组织文件的方法&#xff09;。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统&#xff1b;不带文件系统的SD卡仅能…

2024牛客寒假算法基础集训营6

目录 A.宇宙的终结 B.爱恨的纠葛 C.心绪的解剖 D.友谊的套路 E.未来的预言 F.命运的抉择 G.人生的起落 I.时空的交织 J.绝妙的平衡 K.错综的统一 A.宇宙的终结 直接暴力 我们可以发现数据范围特别小题目特别简单&#xff0c;如果能够马上想到一个容易写的做法就可以…

若依框架的使用

文章目录 1,前端2,后端3,数据库4,测试 1,前端 2,后端 3,数据库 4,测试

MinGW-w64的下载与安装

文章目录 1 下载2 安装3 配置环境变量4 验证 1 下载 官网地址&#xff1a;https://www.mingw-w64.org/github地址&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases windows下载 跳转github下载 版本号选择&#xff1a;13.2.0是GCC的版本号&#xff1b…

鸿蒙开发(四)-低代码开发

鸿蒙开发(四)-低代码开发 本文主要介绍下鸿蒙下的低代码开发。 鸿蒙低代码是指在鸿蒙操作系统进行应用开发时&#xff0c;采用简化开发流程和减少编码量的方式来提高开发效率。 1&#xff1a;开启低代码开发 首先我们打开DevEco Studio .然后创建工程。 如图所示&#xff…

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

【C++】string类(介绍、常用接口)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 string类的常用接口说明 string类对象的常见构造 ​编辑 string字符串的遍历&#xff08;迭代器&#xf…

LoadRunner学习:RuntimeSetting、参数化、关联、(unfinished

LoadRunner RuntimeSetting 运行时设置 在Vuser中设置Run-time Settings RunLogic&#xff1a;运行逻辑&#xff0c;决定了脚本真正执行逻辑&#xff0c; Init和End部分代码只能执行一次。决定脚本真正执行逻辑的意思是&#xff0c;在Run中的代码和Number of Iteration决定了…

[HackMyVM]Quick 2

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

如何把黑白照片变成彩色?分享3款神奇的技术!

在数字化时代&#xff0c;我们手中的老照片不仅仅是回忆的载体&#xff0c;更是时光的见证。那些年代久远的黑白照片&#xff0c;虽然承载着珍贵的记忆&#xff0c;但却少了些许生动的色彩。那么&#xff0c;你是否想过让这些黑白旧影焕发新生&#xff0c;重现昔日的斑斓色彩呢…

ChatGPT无法发送消息问题解决

如果您的 Chatgpt 网页版这几日一直无法发送消息&#xff0c;或者发送了消息&#xff0c;也没有相应的回复&#xff0c;如下图所示&#xff1a; 现在 OpenAI 已经修复了这个 BUG。 用户可以尝试清理 OpenAI 网站的缓存&#xff0c;之后再重新登录&#xff0c;即可正常发送消息。…

全网最全压力测试攻略大全,建议收藏备用!

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端…

Linux 学习(持续更新。。。)

wc命令 命令直接执行&#xff0c;输出包含四项&#xff0c;分别代表&#xff1a;行数、字数、字节数、文件。 例子:编译下列代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #inclu…

Facebook、亚马逊养号选择什么代理IP?

之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题&#xff0c;相信很多人也会关心在使用不同平台的时代理器的选择问题。比如&#xff0c;为什么最好…

MATLAB 四点确定唯一球面参数(44)

MATLAB 四点确定唯一球面参数(44) 一、算法简介二、算法实现1.代码2.结果一、算法简介 根据给定的四个点,快速拟合获取球的中心和半径,具体代码如下: 二、算法实现 1.代码 代码如下(示例): point1 = [0.0, 0.0, 0.0]

一个系列很多样式的wordpress外贸建站模板

菌菇干货wordpress跨境电商模板 食用菌、羊肚菌、牛肝菌、香菇、干黄花菜、梅干菜、松茸wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3946 餐饮调味wordpress跨境电商模板 豆制品、蛋黄糖、烘焙、咖啡、调料、调味酱、餐饮调味wordpress跨境电商模板。 http…

git 如何将多个提交点合并为一个提交点 commit

文章目录 核心命令详细使用模式总结示例 核心命令 git merge branch2 是将分支branch2的提交点合并到本地当前分支。 而在执行这条命令的时候&#xff0c;加一个选项--squash就表示在合并的时候将多个提交点合并为一个提交点。 git merge --squash branch2 先看squash单词的意…

基于单片机的视觉导航小车设计

目 录 摘 要 I Abstract II 引 言 1 1 总体方案设计 3 1.1 方案论证 3 1.2 项目总体设计 3 2 项目硬件设计 4 2.1 主控模块设计 4 2.1.1单片机选型 4 2.1.2 STM32F103RCT6芯片 4 2.2单片机最小系统电路 5 2.3电机驱动模块设计 7 2.4红外模块设计 8 2.5红外遥控模块设计 9 2.6超…

css相邻元素边框重合问题,解决方案

1、如下图所示&#xff0c;在给元素设置边框后&#xff0c;相邻元素会出现重合的问题 2、解决方案 给每个元素设置margin-top以及margin-left为负的边框 <div style"width: 300px;display: flex;flex-wrap: wrap;margin-top: 50px;"><div style"border…

MySQL-QA-异常问题及解决方案(持续更新)

MySQL-Q&A(持续更新) 1.1 PID文件找不到 问题描述 错误详情&#xff1a; ERROR&#xff01;The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid) 解决方案 首先排查配置文件&#xff0c;一般路径为&#xff1a;/etc/my.cnf 检查…