嵌入式学习笔记——STM32的USART收发字符串及串口中断

USART收发字符串及串口中断

  • 前言
  • 字符串的收发
    • 发送一个字符串
    • 接收字符串
      • 需求
    • 利用串口实现printf
  • 中断
    • 中断是什么

前言

上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串的收发,然后引入中断解决收发过程中while()死等的问题。

字符串的收发

发送一个字符串

根据昨天的字符发送函数,只需要稍作修改即可实现发送函数了,一个字符串的结尾会有一个’\0’作为结束符,所以再发送过程中,只需要判断当前发送的字符是不是结束符即可,如果不是结束符就将该位发送至电脑的串口调试助手,如果是结束符,那就意味着一个字符串发送完毕了。具体代码如下:

/*******************************************
*函数名    :Usart1_Send_Str
*函数功能  :串口1发送一个字符串函数
*函数参数  :u8 *str
*函数返回值:无
*函数描述  :
*********************************************/
void Usart1_Send_Str(u8 *str)
{
	while(*str != '\0')
	{
		Usart1_Send_Byte(*str);
		str++;
	}
}

接收字符串

发送字符串相对容易,接收这边,就需要借用C语言中的数组来帮忙了,因为数据是一个字符一个字符的发送过来的,每一次只能接收一个字符,所以需要使用一个数组来存接收到的位,而且串口助手在发送字符串的时候是不会给单片机发送结束符,所以还需要编程者自己规定结束符,当然,后面引入空闲中断之后就不需要这样操作了。这里笔者使用的是‘#’作为结束标志。具体实现代码如下:


/*******************************************
*函数名    :Usart1_Receive_Str
*函数功能  :串口1接收一个字节函数
*函数参数  :void
*函数返回值:u8 str
*函数描述  :
*********************************************/
void Usart1_Receive_Str(void)
{
	static u8 i=0;
	//等待接收完成
	while(!(USART1->SR & (1<<5)));
	//将数据寄存器的数据读取到数组
		Str_Buff[i] = USART1->DR;
		i++;
	if(Str_Buff[i-1]=='#')//如果检测到结束标志‘#’
	{
		Str_Buff[i-1]= '\0';//手动给字符串添加‘\0’结束符
		i=0;
		Usart1_Receive_Str_Flag=1;//接收完成的标志位置一
		Usart1_Send_Str(Str_Buff);//将接受的数组再发回串口助手
	}
}

需求

使用串口调试助手发送11打开1号小灯,10关闭一号小灯,21打开二号小灯,20关闭二号小灯。效果如下:
在这里插入图片描述
主函数代码:
在这里插入图片描述

利用串口实现printf

在C语言的学习中,使用频率最高的输出函数就是printf了,这个函数在单片机上也同样适用,只是要改一下输出的方向,所以也叫重定向。
在C中printf函数-----输出函数
输出方向:PC机------>屏幕
在单片机中printf-------输出函数
输出方向: 单片机---->PC机
关于具体的修改其实KEIL已经帮我们做好了,需要我们修改的只有一个,就是将“stdio.h”内的fputc,也就是字符输出函数,修改到和我们的字符串输出函数关联即可。具体代码如下:

 //printf的重定向函数
//fputc-----专门发送字符的函数h
int fputc(int c, FILE * stream)
{
	Usart1_Send_Byte(c);
	return c;
}

将此代码放到USART1.c中即可,不需要调用也不需要声明。
在这里插入图片描述
然后就是勾选KEIL的库,如下图所示,依次选择魔法棒、Target、然后将3所在位置的复选框锁定。
在这里插入图片描述
然后再在USART1.h中添加stdio.h。
在这里插入图片描述
最后在主函数中调用printf即可,printf主要是方便我们的后期调试,实用语法与C一致。
在这里插入图片描述
实际输出效果:
在这里插入图片描述
到这里,已经实现了字符串的收发,但是存在两个问题,
1是上位机发送数据到板子上必须要设置结束符,类似笔者此处的‘#’;
2是此代码在接收时会阻塞在等待接受完毕的while,这会导致其他的模块工作不正常,在while(1)内,一定要尽力避免死等的出现。
很明显,现在这个代码还不太令人满意,那么要怎么修改呢,在修改代码之前,需要先去了解一个新的东西——中断。
在这里插入图片描述

中断

首先,需要知道中断是个什么东西,它有什么作用,具体怎么使用,下面一一来进行介绍。

中断是什么

中断嘛,按照名字的第一反应是终止一件事,打断某些东西的感觉,实际上也差不多是这个意思,它终止和打断的就是前面我们编写的main函数里面的东西。
在这里插入图片描述
也就是说在程序正常运行过程中,出现了不正常的事件(异常),CPU会去处理这个异常,处理完之后再回到正常的程序中。这个异常事件就是中断。
中断的目的:由外设或者CPU创造一个异常事件(紧急事件)
紧急事件发生的时间和地点:未知
紧急事件是实时响应的,紧急事件不能执行太久(里面不能有延时 循环 阻塞程序)
下面我们来看一张图:
代码正常运行的时候是如下图所示的蓝色箭头方向,首先会依次向下执行初始化代码,然后进入while循环;
如果我们在初始化中,初始化了中断,就会有一个对应的中断服务函数,当中断的条件满足了,程序就会暂时终止main函数里面的内容,去八中断服务函数里面的内容执行完毕了再回来运行main里面的内容。
在这里插入图片描述
同时,从上图可以看出,当中断被初始化后,任何时刻都可能满足中断的条件,也就是在任何位置都可能会跳出main里面的内容去执行中断服务函数里面的内容。因此说它产生的时间和地点是未知的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:集群管理

在今天的文章中&#xff0c;我们应该学习如何管理我们的集群。 备份和分片分配是我们应该能够执行的基本任务。 分片分配过滤 Elasticsearch 将索引配到一个或多个分片中&#xff0c;我们可以将这些分片保存在特定的集群节点中。 例如&#xff0c;假设你有多个数据集群节点&am…

项目实战-瑞吉外卖day02(B站)持续更新

瑞吉外卖-Day02课程内容完善登录功能新增员工员工信息分页查询启用/禁用员工账号编辑员工信息分析前端页面效果是如何实现的为什么点击左边 右边会根着变化首先 我们先来看一下菜单是如何展示出来的 在来看一下 为啥点击菜单时 右边会跟着变第一 &#xff1a;菜单是如何展示出来…

【剑指offer-C++】JZ32:从上往下打印二叉树

题目描述 描述&#xff1a;不分行从上往下打印出二叉树的每个节点&#xff0c;同层节点从左至右打印。例如输入{8,6,10,#,#,2,1}&#xff0c;如以下图中的示例二叉树&#xff0c;则依次打印8,6,10,2,1(空节点不打印&#xff0c;跳过)&#xff0c;请你将打印的结果存放到一个数…

我用Python写了一个下载网站所有内容的软件,可见即可下,室友表示非常好用

Python 写一个下载网站内容的GUI工具&#xff0c;所有内容都能下载&#xff0c;真的太方便了&#xff01;前言本次要实现的功能效果展示代码实战获取数据GUI部分最后前言 哈喽大家好&#xff0c;我是轻松。 今天我们分享一个用Python写下载视频弹幕评论的代码。 之前自游写了…

计算机网络复习

什么是DHCP和DNS DNS(Domain Name System&#xff0c;域名系统)&#xff0c;因特网上作为域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使用户更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。通过主机名&#xff0c;最终得到该主机名对应的…

ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植

一、添加DDR初始化1 1、分析下一步的移植路线 (1) cpu_init_crit 函数成功初始化串口、时钟后&#xff0c;转入 _main 函数&#xff0c;函数在 arch/arm/lib/crt0.S 文件中。 (2) 在 crt0.S 中首先设置栈&#xff0c;将 sp 指向 DDR 中的栈地址&#xff1b; #if defined(CONF…

被骗进一个很隐蔽的外包公司,入职一个月才发现,已经有了社保记录,简历污了,以后面试有影响吗?...

职场的套路防不胜防&#xff0c;一不留神就会掉坑&#xff0c;一位网友就被“骗”进了外包公司&#xff0c;他说公司非常隐蔽&#xff0c;入职一个月才发现是外包&#xff0c;但已经有了社保记录&#xff0c;简历污了&#xff0c;不知道对以后面试有影响吗&#xff1f;楼主说&a…

【含源码】用python做游戏有多简单好玩

有很多同学问我还有其他什么小游戏吗&#xff0c;游戏是怎么做的&#xff0c;难不难。我就用两篇文章来介绍一下&#xff0c;如何使用Python做游戏。 兔子与灌 俄罗斯方块 休闲五子棋 走迷宫 推箱子 消消乐 超多小游戏玩转不停↓ 更多小游戏可以评论区讨论哦&#xff0c;喜欢…

保姆级使用PyTorch训练与评估自己的Replknet网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址&#xff1a;https://github.com/Fafa-DL/Awesome-Backbones 操作教程&#xff1a;https://www.bilibili.co…

【C++】模板进阶

模板进阶 文章目录模板进阶1、非类型模板参数2、模板的特化2.1.概念2.2.函数模板特化2.3.类模板特化2.3.1.全特化2.3.2.偏特化2.4.类模板特化示例3、模板总结1、非类型模板参数 模板参数分类类型形参与非类型形参。类型模板参数&#xff1a;出现在模板参数列表中&#xff0c;跟…

技术人的管理学-团队管理

主要内容前言团队管理&#xff0c;如何让猪上树&#xff1f;选人育人用人留人总结前言 本周报名参加了 风 变 科 技推出的管理学MTP培训课&#xff0c;花了点小钱&#xff0c;感觉还是有用的&#xff0c;可惜时间安排都在8点以后&#xff0c;刚好是看孩子的时间&#xff0c;只…

io流概述

public static void main(String[] args) throws IOException {//1.与文件建立联系 File->数据源File src new File("D://AAA/test.txt");//2.创建文件字节输入流->管道//InputStream is new FileInputStream(src);InputStream is new FileInputStream(&quo…

中科亿海微FPGA

国产FPGA中&#xff0c;紫光、安路、高云称得上是三小龙&#xff0c;其他的半斤八两&#xff0c;中科亿海微也算是其中之一。 其产品为亿海神针系列&#xff0c;如下&#xff1a; 可见其最小规模也有9.2KLUT&#xff0c;最大竟有136K之多了&#xff0c;对比其他国产&#xff0…

18、江科大stm32视频学习笔记——USART串口发送串口发送和接收

目录 一、USART串口发送 1、电路图 2、printf函数的移植方法 3、serial.c 4、main.c 5、解决直接写汉字&#xff0c;编译器报错 二 、USART串口发送和接收 1、查询实现 2、中断实现 &#xff08;1&#xff09;在Serial.c中添加的代码 &#xff08;2&#xff09;主函…

【Spring从入门到实战】第 4 讲:SpringAOP实现以及原理

本文已收录于专栏&#x1f332;《Spring从入门到实战》&#x1f332;专栏前言 大家好&#xff0c;我是执梗。本专栏将从Spring入门开始讲起&#xff0c;详细讲解各类配置的使用以及原因&#xff0c;到使用SpringBoot进行开发实战&#xff0c;旨在记录学习生活的同时也希望能帮到…

IDEA常用插件列表

一 背景 IDEA常用插件列表&#xff0c;用来提供工作效率。你都安装了吗 IntelliJ IDEA 默认安装并提供了非常多的工具&#xff0c;比如 Maven Integration、Markdown support、SSH Remote Run 等。其中有很多好用&#xff0c;但是不为人知的工具。 二 插件列表 阿里代码规约…

Linux基础命令大全(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

pytorch-在竞赛中去摸索用法,用房价预测比赛了解数据处理流程

实战Kaggle比赛&#xff1a;房价预测 让我们动手实战一个Kaggle比赛&#xff1a;房价预测House Prices - Advanced Regression Techniques | Kaggle。本文将提供未经调优的数据的预处理、模型的设计和超参数的选择。通过动手操作、仔细观察实验现象、认真分析实验结果并不断调…

【算法入门】字符串基础

目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数&#x1f4ab;&#xff08;1&#xff09; strcpy函数 &#x1f4ab;&#x1f4ab;&#xff08;2&#xff09; strcat函数 &#x1f4ab;&#x1f4ab;&#xff08;3&#xff09;strstr函数 &#x1f4ab;2.题…

JavaScript的事件传播机制

你在学习和编写JavaScript时可能听说过事件冒泡&#xff08;event bubbling&#xff09;。它会发生在多个元素存在嵌套关系&#xff0c;并且这些元素都注册了同一事件(例如click)的监听器时。 但是事件冒泡只是事件机制的一部分。它经常与事件捕获(event capturing)和事件传播…