蓝桥杯-STM32G431RBT6(串口)

news2024/9/20 15:44:27

前言

一、配置

二、使用步骤

1.串口发送

代码逻辑

效果展示

2.串口接收单个字符

代码逻辑

中断回调函数

3.串口接受字符串

代码逻辑

字符串函数

中断回调函数

声明

代码开源


前言

一、配置

二、使用步骤

1.串口发送

代码逻辑
  1. sprintf(tx_buf,"jin ke\r\n"):这行代码使用 sprintf 函数将字符串 "jin ke\r\n" 写入到 tx_buf 缓冲区中。
  2. HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50):这行代码使用 HAL_UART_Transmit 函数通过 huart1 串口发送 tx_buf 缓冲区中的数据。发送的数据长度是通过 strlen(tx_buf) 计算得到的,并且设置了一个超时时间为 50 毫秒。
  3. &huart1 是指向 huart1 这个结构体的指针。huart1 通常是一个串口通信相关的结构体,通过这个指针可以访问和操作与该串口相关的配置和功能

  4. 将 tx_buf 强制转换为 (uint8_t*) 是为了确保将缓冲区中的数据以字节数组的形式传递给 HAL_UART_Transmit 函数。在 C 语言中,很多函数需要以特定的数据类型来接收参数,通过这种强制转换可以满足函数的要求,以便正确地进行数据传输操作。

char tx_buf[20];

 LCD_Init();
    LCD_Clear(White);
    LCD_SetBackColor(White);
	LCD_SetTextColor(Black);
	sprintf(tx_buf,"jin ke\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);

将字符串写入缓冲区主要有以下几个原因:

  1. 提高效率:一次性将数据准备好放入缓冲区,然后统一进行发送,可以减少频繁的操作和中断,提高数据传输的效率。
  2. 便于管理:将数据集中在缓冲区中,方便对数据进行进一步的处理或操作,比如在发送之前可以根据需要对缓冲区中的数据进行修改。
  3. 连贯性:确保数据的连贯性和完整性,避免在逐字节发送过程中出现数据丢失或不完整的情况。
效果展示

2.串口接收单个字符

案例:接受到O时,点亮LED1并发送LED1OPEN!,接受到C时,熄灭LED1并发LED1CLOSE!

代码逻辑

HAL_UART_RxCpltCallback 是一个串口接收完成的回调函数。当串口接收到数据完成时,会调用这个函数来处理接收到的数据。在这个函数中,可以根据接收到的数据进行各种相应的操作,如控制其他设备、更新状态等。

  uint8_t rx_data;
中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(rx_data=='O')
	{led_show(2,1);
	sprintf(tx_buf,"led1OPEN!");
	HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
	}
	if(rx_data=='C')
	{led_show(2,0);
	sprintf(tx_buf,"led1CLOSE!");
	HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);	
	}
	HAL_UART_Receive_IT(&huart1,&rx_data,1);
}

3.串口接受字符串

代码逻辑
  •  uart_proc 函数用于处理串口数据。
    • 当 rx_count 等于 4 时,进行数据的比较和相应操作。
    • 通过 strcmp 函数比较接收到的 rx_buf 与特定字符串(如 "LEDO" 和 "LEDC")是否相等。
    • 根据比较结果控制 led 的显示状态,并发送相应的消息。
    • 最后将 rx_count 清零,清空 rx_buf 并重置其内容。
    • memset 是一个 C 语言标准库函数,用于将一段内存区域设置为指定的值。
    • 它的函数原型一般为 void *memset(void *str, int c, size_t n),其中:

    • str:指向要填充的内存块。
    • c:要设置的值(通常是一个字符)。
    • n:要设置的字节数。在上述代码中,memset(rx_buf, 0, 20) 是将 rx_buf 这个内存区域的前 20 个字节全部设置为 0,起到清空的作用。
    • strcmp 函数用于比较两个字符串。

    • 它的工作原理是逐个字符地比较两个字符串,直到遇到不同的字符或到达字符串的末尾。

    • 如果两个字符串完全相同,则返回 0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。

    • 在代码中,通过 strcmp 函数来比较接收到的 rx_buf 和特定的字符串,以确定执行相应的操作

字符串函数
void uart_proc(void)
{
if(rx_count==4)
{
	if(strcmp(rx_buf,"LEDO")==0)
	{
	led_show(1,1);
	sprintf(tx_buf,"led1OPEN!\r\n");
    HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
	}	
	if(strcmp(rx_buf,"LEDC")==0)
	{
	led_show(1,0);
	sprintf(tx_buf,"led1CLOSE!\r\n");
    HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
	}
	rx_count=0;
	memset(rx_buf,0,20);
}
}
中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	rx_buf[rx_count++]=rx_data;
	HAL_UART_Receive_IT(&huart1,&rx_data,1);
}
声明
/* USER CODE BEGIN PV */
 uint8_t key_rval;
 char tx_buf[20];
 uint8_t rx_data;
 char rx_buf[20];
 uint8_t rx_count;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void uart_proc(void);
/* USER CODE END PFP */

代码开源

通过网盘分享的文件:12-TEST6-串口通信(接收和发送多个字符).zip
链接: https://pan.baidu.com/s/1IoKdqO9sgooXArpK1wgjyg?pwd=0820 提取码: 0820

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

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

相关文章

(学习总结17)C++继承

C继承 一、继承的概念与定义继承的概念继承定义1. 定义格式2. 继承基类成员访问方式的变化 继承类模板 二、基类和派生类间的转换三、继承中的作用域隐藏规则 四、派生类的默认成员函数4个常见默认成员函数实现一个不能被继承的类 五、继承与友元六、继承与静态成员七、多继承及…

DFS:二叉树中的深搜

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 深搜的总结 二. 二叉树的深搜题目 2.1 计算布尔二叉树的值 2.2 求根节点到叶节点的数字之和 2.3 二叉树剪枝 2.4 验证二叉搜索树 2.5 二叉搜索树中第k小的节点 2.6 二叉树的…

【C++】——继承详解

目录 1、继承的概念与意义 2、继承的使用 2.1继承的定义及语法 2.2基类与派生类间的转换 2.3继承中的作用域 2.4派生类的默认成员函数 <1>构造函数 <2>拷贝构造函数 <3>赋值重载函数 <4析构函数 <5>总结 3、继承与友元 4、继承与静态变…

在VC++6.0中创建一个C++项目

1、下载并安装VC6.0 暂时不介绍下载安装&#xff0c;后续可能会补充 2、打开VC6.0 初始界面如下图&#xff1a; 3、创建一个空工程 文件-新建 在新建弹框中选择&#xff1a;工程-win32 console Application-填写工程名、选择保存路劲-确定 在新的弹框中&#xff0c;选择&…

BIT小学期-电话号码问题

Output 输出包括两个部分&#xff0c;第一个部分是错误的电话号码&#xff0c;对于这些号码应当按照输入的顺序以原始的形式输出。在输出错误电话号码前输出Error:&#xff0c;随后输出这些号码&#xff0c;如果没有错误的电话号码&#xff0c;则输出Not found. 第二部分是重…

[C++进阶]AVL树

前面我们说了二叉搜索树在极端条件下时间复杂度为O(n),本篇我们将介绍一种对二叉搜索树进行改进的树——AVL树 一、AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找效率低下。因此&#xff0c;两位…

6个Python小游戏项目源码【免费】

6个Python小游戏项目源码 源码下载地址&#xff1a; 6个Python小游戏项目源码 提取码: bfh3

深度学习Day-33:Semi-Supervised GAN理论与实战

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境&#xff1a;Python3.8编译器选择&#xff1a;Pycharm深度学习环境&#xff1a; torch1.12.1c…

cout无法正常显示中文

cout无法正常显示中文 虽然你使用了buf.length()来指定写入的字节数&#xff0c;但是在包含中文字符&#xff08;UTF-8编码下每个中文字符占用3个字节&#xff09;的情况下&#xff0c;直接使用length()可能不会正确反映实际的字节数&#xff0c;因为它给出的是字符数而非字节…

基于深度学习,通过病理切片直接预测HPV状态|文献速递·24-09-16

小罗碎碎念 有段时间没有写文献速递的推文了&#xff0c;搞得自己今天写还怪不适应的。 今天所有的推文&#xff0c;都是围绕一个系统的问题展开——既研究了HPV与EBV在头颈癌/鼻咽癌中的致病机制&#xff0c;也总结了如何结合病理组学直接由WSI预测HPV状态——没办法&#x…

变压器漏感对整流电路的影响

目录 1. 电压波形畸变 2. 输出电压波动 3. 电流纹波增加 4. 降低整流效率 5. 影响开关器件的性能 6. EMI&#xff08;电磁干扰&#xff09;增加 总结与应对措施 变压器漏感在整流电路中会产生一些影响&#xff0c;尤其在高频应用或电流变化较大的情况下&#xff0c;其影…

【GESP】C++一级练习BCQM3006,多行输出

多行输出练习题&#xff0c;使用cout或printf函数输出多行内容。 BCQM3006 题目要求 描述 在windows的控制台环境中所有的字符都是等宽的&#xff0c;默认情况下窗口中每行有 80 个字符&#xff0c;每个屏幕有 25 行&#xff0c;组成了一个字符矩阵。利用控制台的这个特点&a…

什么是 HTTP/3?下一代 Web 协议

毫无疑问&#xff0c;发展互联网底层的庞大协议基础设施是一项艰巨的任务。 HTTP 的下一个主要版本基于 QUIC 协议构建&#xff0c;并有望提供更好的性能和更高的安全性。 以下是 Web 应用程序开发人员需要了解的内容。 HTTP/3 的前景与风险 HTTP/3 致力于让互联网对每个人…

从登录到免登录:JSP与Servlet结合Cookie的基本实现

前言 JSP中应用Cookie解析&#xff1a; 用户登录成功后&#xff0c;将用户信息保存到Cookie中&#xff0c;在页面读取Cookie并显示&#xff0c;不需要再次登录可以直接进入页面 第一步&#xff1a;创建JavaWeb项目&#xff0c;配置pom.xml文件 创建maven项目&#xff0c;项目名…

背包问题 总结详解

就是感觉之前 dp 的 blog 太乱了整理一下。 0-1 背包 例题:P1048 朴素算法 思路 对于一个物品&#xff0c;我们可以选&#xff0c;也可以不选。 我们用表示第 i 件物品的重量&#xff0c;表示第 i 件物品的价值。 考虑表示前 i 件物品放入容量为j的背包中的最大价值。 如…

时间复杂度计算 递归(solve2 后续)

原帖 最近校内比较忙&#xff0c;更新缓慢&#xff0c;致歉。 这里函数每次都需要遍历 h h h 和 m m m 之间的数&#xff08;复杂度 O ( n ) O(n) O(n)&#xff09;&#xff0c;所以和 solve1 略有不同。仍然假设 T ⁡ ( n ) \operatorname{T}(n) T(n) 表示 m − h 1 n…

【C++二叉树】606.根据二叉树创建字符串

606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 图文分析&#xff1a; 代码实现&#xff1a; 代码说明&#xff1a; 1、前序遍历方式&#xff1a;根-左子树-右子树。 2、题目要求将二叉树转换为字符串输出&#xff0c;所以定义了一个string对象str。 3…

MySQL —— 视图

概念 视图是一张虚拟的表&#xff0c;它是基于一个或多个基本表或其他视图的查询结果集。 视图本身不存储数据&#xff0c;而是通过执行查询来动态生成数据&#xff0c;用户可以像操作普通表一样使用视图来进行查询更新与管理等操作。 视图本身也不占用物理存储空间&#xf…

网络安全学习(五)Burpsuite

经过测试&#xff0c;发现BP需要指定的JAVA才能安装。 需要的软件已经放在我的阿里云盘。 &#xff08;一&#xff09;需要下载Java SE 17.0.12(LTS) Java Downloads | Oracle 1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持 看一下是否安装成功&#xff0c…

开源AI应用安全指导框架 — OWASP AI Exchange

在当今信息化迅猛发展的时代&#xff0c;网络专业人士正竞相提升人工智能&#xff08;AI&#xff09;安全领域的专业技能。随着这一趋势的推进&#xff0c;他们的企业也在快速地引入各类AI工具、平台、应用程序和服务&#xff0c;业界也相应涌现出众多资源&#xff0c;以协助从…