蓝桥杯嵌入式(G431)备赛笔记——UART

news2024/11/27 22:38:49

 

 

 

printf的重定向

为了方便使用,通过keil中的Help功能的帮助,做一个printf的重定向

搜索fputc,复制这段 

 将复制的那段放入工程中,并添加串口发送的函数

 

 关键代码

u8 rx_buff[30]; // 定义一个长度为30的接收缓冲区数组rx_buff
u8 rx_data; // 定义一个用于存储接收到的单个字节的变量rx_data
u8 buff_size = 0; // 定义一个变量buff_size,用于记录接收缓冲区中已接收的字节数
u32 rx_tick = 0; // 定义一个变量rx_tick,用于记录最近一次接收数据的时间戳

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // UART接收完成回调函数
{
  rx_tick = uwTick; // 更新接收数据的时间戳为当前系统时间
  HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 使能UART中断接收下一个字节的数据
  rx_buff[buff_size++] = rx_data; // 将接收到的数据存入接收缓冲区,并更新已接收字节数
}

void Rx_proc() // 接收数据处理函数
{
    if (uwTick - rx_tick < 50) // 如果距离上次接收数据时间不足50毫秒
        return; // 则退出函数,等待下次处理
    rx_tick = uwTick; // 更新接收数据的时间戳为当前系统时间
    if (buff_size == 1 && rx_buff[0] == '#') // 如果接收缓冲区中只有一个字节且为'#'
    {
			LED_disp(0x01); // 控制LED显示,示例中将LED设置为特定的模式
    }
    else if (buff_size == 1 && rx_buff[0] == '$') // 如果接收缓冲区中只有一个字节且为'$'
    {
			LED_disp(0xab); // 控制LED显示,示例中将LED设置为特定的模式
    }
    else if (buff_size > 0) // 如果接收缓冲区中有数据
    {
        printf("%s\r\n", rx_buff); // 将接收缓冲区中的数据打印输出
        printf("send data error!\r\n"); // 打印提示信息,表示发送数据出错
    }
    buff_size = 0; // 重置接收缓冲区已接收字节数为0
    memset(rx_buff, '\0', sizeof(rx_buff)); // 清空接收缓冲区,准备接收新的数据
}

1,在HAL_UART_RxCpltCallback函数中,当UART接收完成时,将接收到的数据存入接收缓冲区rx_buff中,并更新已接收字节数buff_size。然后通过使能UART中断接收下一个字节的数据。

2,Rx_proc函数用于处理接收到的数据。首先判断距离上次接收数据的时间是否超过50毫秒,如果不足则退出函数。然后根据接收缓冲区中的数据内容,分别执行不同的操作:

  • 如果接收到的数据为#,则控制LED显示特定模式。
  • 如果接收到的数据为$,同样控制LED显示特定模式。
  • 如果接收到其他数据,则将数据打印输出,并提示发送数据出错。

3,最后,重置接收缓冲区的已接收字节数为0,并清空接收缓冲区,以便下一次接收新的数据。

 

注意点: 

1,串口重定向的时候,ch前需要加上取地址符&,强制将ch类型转化为u8

2,串口接收回调函数时,中断接收到的先赋给rx_data,rx_data再给rx_buff

3,接收设置函数要记得最后清空接收数组rx_buff,和buff_size

4,主函数中记得开启接收回调函数

关键函数:

HAL_UART_Transmit(&huart1, (u8 *)&ch, 1, 50);  //printf重定向串口发送函数

HAL_UART_Receive_IT(&huart1, &rx_data, 1);  //串口接收中断函数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++初阶:6.string类

string类 string不属于STL,早于STL出现 看文档 C非官网(建议用这个) C官网 文章目录 string类一.为什么学习string类&#xff1f;1.C语言中的字符串2. 两个面试题(暂不做讲解) 二.标准库中的string类1. string类(了解)2. string类的常用接口说明&#xff08;注意下面我只讲解…

数组与链表:JavaScript中的数据结构选择

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

单片机之蜂鸣器

目录 蜂鸣器介绍 蜂鸣器的分类 发声原理分类 按有源无源分类 三极管驱动 蜂鸣器原理 音符与频率对照表 蜂鸣器播放130.8Hz的声音 仿真案例 蜂鸣器发声 电路图 keil文件 蜂鸣器播放音乐 歌曲数据获得 使用的频率 keil文件 蜂鸣器介绍 前言&#xff1a;蜂鸣器是…

SpringBoot中注册Bean的方式汇总

文章目录 ComponentScan Componet相关注解BeanImportspring.factories总结Configuration和Component的主要区别&#xff1f;Bean是不是必须和Configuration一起使用&#xff1f;Import导入配置类有意义&#xff1f;出现异常&#xff1a;java.lang.NoClassDefFoundError: Could…

巨控GRM230远程智能模块:定义未来智慧水务的新篇章

标签:#智能模块 #自动化控制 #远程监控 #水质检测 #无线数据传输 在如今这个快速发展的时代&#xff0c;智能化已经成为了各行各业升级转型的关键词。尤其在水务管理领域&#xff0c;传统的手动操作和监控方法逐渐不能满足现代化的需求&#xff0c;而巨控科技推出的GRM230远程…

Docker容器嵌入式开发:MySQL表的外键约束及其解决方法

本文内容涵盖了使用MySQL创建数据库和表、添加数据、处理字符集错误、解决外键约束问题以及使用SQL查询数据的过程。通过创建表、插入数据和调整字符集等操作&#xff0c;成功解决了数据库表中的字符集问题&#xff0c;并使用INSERT语句向各个表中添加了示例数据。同时&#xf…

12.C++常用的算法_遍历算法

文章目录 遍历算法1. for_each()代码工程运行结果 2. transform()代码工程运行结果 3. find()代码工程运行结果 遍历算法 1. for_each() 有两种方式&#xff1a; 1.普通函数 2.仿函数 代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vect…

【三十九】【算法分析与设计】综合练习(5),79. 单词搜索,1219. 黄金矿工,980. 不同路径 III

79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

二豆写作能用吗 #笔记#笔记

二豆写作是一款非常好用、靠谱、方便的论文写作工具&#xff0c;它能帮助用户快速完成论文写作&#xff0c;并且具有查重降重的功能。那么&#xff0c;二豆写作到底能不能用呢&#xff1f;答案是肯定的&#xff0c;二豆写作绝对是值得推荐的。 首先&#xff0c;二豆写作提供了丰…

不定长顺序表

一.不定长顺序表的结构: typedef struct DSQList{ int* elem;//动态内存的地址 int length;//有效数据的个数 int listsize;//总容量 }DSQList,*DPSQList; 很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下: 二…

基于ros的相机内参标定过程

基于ros的相机内参标定过程 1. 安装还对应相机的驱动2. 启动相机节点发布主题3. 下载camera_calibartion4. 将红框的文件夹复制在自己的工作空间里边&#xff0c;编译5. 标定完成以后&#xff0c;生成内参参数文件camera.yaml。将文件放在对应的路径下&#xff0c;修改config文…

(二)ffmpeg 拉流推流示例

一、搭建流媒体服务器 在这里&#xff0c;选用的流媒体服务器是mediamtx。 下载地址&#xff1a;https://github.com/bluenviron/mediamtx/releases/tag/v1.6.0 系统不同选择的压缩包不同&#xff0c;我用的是ubuntu系统。 下载下来之后进行解压&#xff0c;可以看到里面有三…

【随笔】Git 高级篇 -- 最近标签距离查询 git describe(二十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

Android 属性动画及自定义3D旋转动画

Android 动画框架 其中包括&#xff0c;帧动画、视图动画&#xff08;补间动画&#xff09;、属性动画。 在Android3.0之前&#xff0c;视图动画一家独大&#xff0c;之后属性动画框架被推出。属性动画框架&#xff0c;基本可以实现所有的视图动画效果。 视图动画的效率较高…

常见性能测试工具对比

在性能测试工作中&#xff0c;我们常常会遇到好几个工具&#xff0c;但是每一个工具都有自己的优势&#xff0c;一时间不知道怎么选择。 今天我们就将性能测试常用的工具进行对比&#xff0c;这样大家在选择工具的时候心里就有底啦&#xff01; 阿里云PTS 性能测试PTS&#xff…

25. 文档测试

作为下午题出现的几率很低&#xff1b; 主要议题&#xff1a; 1.软件文档分类 2.用户文档的内容 用户文档测试的作用&#xff1a; 3.用户文档测试需要注意的问题 4.用户文档测试的要点 5.用户手册测试 6.在线帮助测试

安卓的认证测试

1 CTS CTS 是 Android 兼容性测试套件&#xff0c;用于验证设备是否符合 Android 平台的兼容性标准。它包含一系列测试用例&#xff0c;涵盖了设备的各个方面&#xff0c;如硬件功能、软件功能、API 的正确实现等。通过 CTS 测试&#xff0c;设备厂商可以确保其设备符合 Andro…

工单管理系统设计方案,工单系统的流程

工单管理系统是一种用于管理和跟踪工作流程的软件系统。它可以帮助企业和组织更好地分配任务、优化工作流程、提高生产效率和客户满意度。下面是一个基本的工单管理系统设计方案&#xff1a;需求分析  在设计工单管理系统之前&#xff0c;需要进行需求分析&#xff0c;确定系…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

【论文解读】大模型事实性调查(下)

http://t.csdnimg.cn/4md5U 上期我们分享了《大模型事实性调查》论文解读的前半部分&#xff0c;这一期为大家带来后面的内容&#xff0c;欢迎阅读交流。 四、事实性分析 在前面的第3节中&#xff0c;论文提供了与评估事实性相关的定量统计数据。在本节中&#xff0c;论文将更…