407串口01发送

实验一:
工程。

链接:https://pan.baidu.com/s/1g8DV4yZWOix0BbcZ08LYDQ?pwd=2176 
提取码:2176

在这里插入图片描述

串口1的使用。发送功能。
单片机发送信息到电脑。
通过串口进行通信。

首先单片机这边。
单片机这边,需要对单片机的串口模块进行使能初始化,设置串口的格式。
单片机和电脑的串口收发格式要配置一致。不然A和B肯定通信不成功,鸡和鸭讲,对牛弹琴。

打开串口助手,看下格式。

格式包括波特率,停止位,数据位和校验位。电脑端的串口助手(我们这里使用XCOM的串口助手)默认这个配置,单片机也这么配置一下。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

看到上述的串口初始化的步骤主要是
1、初始化端口的时钟,串口1的时钟,都要打开,因为我们需要用到芯片的该个功能,因此必须打开对应时钟。
2、由于端口PA9和PA10默认是IO模式,这个我们配置为端口复用模式,切换到串口1功能;
3、串口1的具体格式的初始化。设置通信格式,和要通话端的格式一致。
4、使能串口,清空串口对应的中断标记位。允许发生中断。
5、在其他地方或者这个函数里面,我们可以设置串口1的中断优先级等,配置一下。这里在前面配置了。

在这里插入图片描述

在这里插入图片描述

初始化函数用PA9和PA10作为串口使用。
可以用stm32CubeMX软件查看。
如何对stm32查看IO功能。-CSDN博客
在这里插入图片描述
在这里插入图片描述

看到PA9和PA10分别是串口1的TXD发送和RXD接收引脚。
这里我们需要用到一个USB-TTL模块,我们可以自学习一下232电平,TTL电平等。记得发送和接收对接。才能正常收发数据。
在这里插入图片描述

这里我们只是对发送功能进行讲解,因此接收的中断先不讲解。

使用这个的时候,先在工程中确认包括usart.c文件。然后用里面的额初始化函数进行初始化。注意波特率。
然后再main.c中的main函数里面,进行include头文件,然后进行串口初始化。

这里讲解一下printf函数。printf函数,我们一般在一开始学习C语言的时候,就讲解了。那时候我们是将printf函数输出到电脑的屏幕中,查看一下信息,比如变量,字符串啊等等信息。这里我们用printf函数,也是实现这个功能。
不过单片机里面执行printf函数,需要多一个重定向的步骤。告诉单片机,我们需要在单片机的那个串口printf出去,要重定向到对应的单片机串口才行。
在这里插入图片描述

所以在usart.c文件里面。看到这个函数里面有串口1,因为我们的PA9和PA10就是串口1,定向到这个,我们的串口才能输出信息打印出去。
你可以配置串口3,然后这里改为串口3,那么printf就定向到串口3去了,同理也一样。
在这里插入图片描述

我们可以修改一下这个函数,改为大写的Printf函数,或者多一个函数的形参,后面我们再讲解。

在库中的stm32f4xx_usart.c中,包括了一个发送字节,一个是接收字节的函数。这是库函数的东西,主要是将缓冲区的数据读取出来或者是发送出去。

在这个函数基础上,我们在sys.c中添加3个函数,一个是发字节,一个是发字符串,一个是自定义大写的Printf函数。注意在sys.h中要添加对应函数的声明。
//**********************************************************************
// /* 发送一个字节数据到USART */

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{/* 发送一个字节数据到USART */USART_SendData(pUSARTx,ch);	/* 等待发送数据寄存器为空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	//	while((pUSARTx->SR&0X40)==0);//循环发送,直到发送完毕   
//			pUSARTx->DR = (u8) ch;   
//	
}//*******************************************************************//字符串发送函数
void Usart_SendString( USART_TypeDef * pUSARTx,char *buffertemp)		
{uint8_t i=0;while(1){if(buffertemp[i]!='\0'){USART_SendData(pUSARTx,buffertemp[i]);  //发送一个字节while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)==RESET){};//等待发送结束i++;}else return ;}
}

/*

/*


  • 函 数 名: Printf
  • 功能说明: 可变参数重定义Printf函数
  • 形 参: 1.串口号 2.char* fmt,… 格式化输出字符串和参数
  • 返 回 值: 无

*/

#define    USART_SENDBUFFLEN     256          //定义打印的字符串数组长度char g_USART_SendBuff[USART_SENDBUFFLEN];     //用于打印的字符串数组void Printf(USART_TypeDef* USARTx, char* fmt, ...)
{u16 i = 0;  		va_list ap;                                  //清空下标memset(g_USART_SendBuff,0,USART_SENDBUFFLEN); //清空字符数组//可变参数列表变量(对象)va_start(ap,fmt);                         //指明char*类型的fmt参数后面的才是可变参数的开始vsprintf(g_USART_SendBuff,fmt,ap);        //使用参数列表发送格式化输出到字符串va_end(ap);	                              //清空参数列表变量(对象)while(g_USART_SendBuff[i])                //如果字符串数组为NULL则退出打印{while((USARTx->SR&0X40)==0);USARTx->DR = g_USART_SendBuff[i++];}
}

这里可以把这个USART_SENDBUFFLEN改为100,一般发送不会发送太多数据,100个字节基本够用了。

在SYS.h中添加对应的函数声明。

准备步骤充分了,我们就可以使用里面的函数,发送信息。

注意串口4和串口5是没有S的,少了一个字母。具体可以自己在学习。

在这里插入图片描述
#include “sys.h”
#include “usart.h”
#include “delay.h”
#include “led.h”
#include “beep.h”
int main(void)
{
u16 i=0;
int x;
float y;
Nvic_Init(NVIC_PriorityGroup_4);//中断分组第四组 高优先打断低优先
Set_Nvic_Irq(USART1_IRQn,0,3);//设置串口1的中断等级;
Delay_Init();//延时函数默认中断优先级是最低的。
LED_Init();//LED灯初始化
BEEP_Init();//蜂鸣器初始化
uart1_init(115200);//设置串口1的波特率是115200
//uart3_init(115200);//设置串口1的波特率是115200

Usart_SendByte(USART1,'a');//测试单字节发送函数
Usart_SendByte(USART1,'b');//测试单字节发送函数
Usart_SendString(USART1,"tab\r\n");//测试字符串发送函数
printf("hello world\r\n");//这个也能用,测试printf函数
printf("aaa=1,i=%d\r\n",i);//这个也能用,测试printf函数
Printf(USART1,"xxx=0,i=%d\r\n",i);//这个也能用,测试大写的Printf函数
//Printf(USART3,"xxx=0,i=%d\r\n",i);//这个也能用,测试大写的Printf函数
while(1)
{printf("x=%3d\r\n",x);delay_ms(500);printf("y=%0.2f\r\n",y);delay_ms(500);
}

}

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
int main(void)
{u16 i=0;int x;float y;Nvic_Init(NVIC_PriorityGroup_4);//中断分组第四组 高优先打断低优先Set_Nvic_Irq(USART1_IRQn,0,3);//设置串口1的中断等级;Delay_Init();//延时函数默认中断优先级是最低的。LED_Init();//LED灯初始化BEEP_Init();//蜂鸣器初始化uart1_init(115200);//设置串口1的波特率是115200//uart3_init(115200);//设置串口1的波特率是115200Usart_SendByte(USART1,'a');//测试单字节发送函数Usart_SendByte(USART1,'b');//测试单字节发送函数Usart_SendString(USART1,"tab\r\n");//测试字符串发送函数printf("hello world\r\n");//这个也能用,测试printf函数printf("aaa=1,i=%d\r\n",i);//这个也能用,测试printf函数Printf(USART1,"xxx=0,i=%d\r\n",i);//这个也能用,测试大写的Printf函数//Printf(USART3,"xxx=0,i=%d\r\n",i);//这个也能用,测试大写的Printf函数while(1){printf("x=%3d\r\n",x);delay_ms(500);printf("y=%0.2f\r\n",y);delay_ms(500);}
}

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

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

相关文章

zctf2016_note2-堆利用-unlink

一、题目 题目:zctf2016_note2 题目描述:二、WriteUp (一)题目环境 glibc版本2.23 通过patchelf进行修改(二)信息收集 $ checksec note2Arch: amd64-64-littleRELRO: Partial RELRO # (.plt.got)段依…

一些宏观理解

跳板机(Jump Server) 跳板机是一种中间服务器,用于在用户与目标服务器之间提供一个安全的访问点。它通常用于增强安全性,通过跳板机可以控制和审计对目标服务器的访问。用户首先连接到跳板机,然后从跳板机连接到目标服…

Redis-HyperLogLog数据类型及其常用命令详解

1.Redis概述 2.HyperLogLog数据类型 HyperLogLog(HLL)是一种用于近似计算大数据集合中唯一元素数量(基数)的概率性数据结构。 概率数据结构: HyperLogLog 使用的是一种概率算法,它可以在极少的内存消耗下估…

SpringBoot2+Vue3开发博客管理系统

项目介绍 博客管理系统,可以帮助使用者管理自己的经验文章、学习心得、知识文章、技术文章,以及对文章进行分类,打标签等功能。便于日后的复习和回忆。 架构介绍 博客管理系统采用前后端分离模式进行开发。前端主要使用技术:Vu…

黑龙江等保测评的具体流程是怎样的

黑龙江等保测评的具体流程 黑龙江等保测评是根据《中华人民共和国网络安全法》及相关法律法规,对信息系统安全保护能力进行评估和验证的过程。以下是黑龙江等保测评的具体流程: 系统定级:根据业务、资产、安全技术、安全管理等方面的情况&am…

鸿蒙HarmonyOS服务卡片实战

引言 在现代开发中,服务卡片是不可或缺的一部分,比如音乐,天气类等应用,官网的介绍中写道:卡片让您便捷地预览服务信息,例如查看天气或日历日程等内容。您可将卡片添加到屏幕上,让这类信息触手…

[C++][设计模式][观察者模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一1.FileSplitter.cpp2.MainForm.cpp 2.代码二1.FileSplitter.cpp2.MainForm.cpp 1.动机 在软件构建过程中,需要为某些对象建立一种“通知依赖关系” 一个对象(目标对象)的状态发生改变,所有的依赖对象…

2024.6.22刷题记录-力扣周赛402跟练记录(未完)

目录 一、跟练视频 二、3184. 构成整天的下标对数目 I 暴力 三、3185. 构成整天的下标对数目 II 不会,来自视频。 一、跟练视频 【值域打家劫舍 树状数组【力扣周赛 402】-哔哩哔哩】 https://b23.tv/iDc49pt 二、3184. 构成整天的下标对数目 I 暴力 class …

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c…

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库,性能强是建立在专业运维之上的,需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批…

9、PHP 实现调整数组顺序使奇数位于偶数前面

题目: 调整数组顺序使奇数位于偶数前面 描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分, 所有的偶数位于位于数组的后半部分,并保证奇数和奇数&#xff…

基于深度学习的旋转包围盒检测

基于深度学习的旋转包围盒检测 旋转包围盒检测是一种高级目标检测方法,旨在识别图像中目标的精确位置和方向。与传统的轴对齐矩形框(水平包围盒)不同,旋转包围盒(Rotated Bounding Box, RBB)允许检测框随目…

速盾:视频cdn和网站cdn的区别

在互联网的发展过程中,视频的重要性越来越被人们所重视,视频内容的传播和观看需求也越来越大。为了提供更好的用户体验和满足视频内容的高负载需求,加快视频的加载速度,视频CDN(Content Delivery Network,内…

一、企业级架构设计-archimate基础概念

目录 一、标准 二、实现工具 1、Archimate 1、Archimate 基本概念 1、通用元模型 2、结构关系 3、依赖关系 1、服务关系 2、访问关系 3、影响关系 1、影响方式 2、概念 3、关系线 4、案例 4、关联关系 4、动态、节点和其他关系 1、时间或因果关系 2、信息流 …

缓存层持久化

** 读缓存** 分布式缓存 先将所有的缓存数据集中存储在同一个地方,而非重复保存到各个服务器节点中,然后所有的服务器节点都从这个地方读取数据 使用MongoDB的公司最少,目前,Redis比Memcached更流行: (1&…

MySQL——Insert语句详解

语法: INSERT INTO 表名([字段名1,字段名2,字段名3])VALUES(值1),(值2),(值3), 注意事项: 字段和字段之间,使用英文逗号隔开 字段是可以省略的,但是后面的值必须一一对应&…

采集数据类型和方法

采集的类型: 命名实体:命名实体包括人名、地点、组织、时间表达式、数量等。这些实体通常对理解和分类文本内容至关重要。 关键词和短语:这些是文本中的核心概念,可能代表了主题或中心思想。 句子或段落:根据需求,可…

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 …

【深度学习】Position Wise 到底是什么,有什么用

1. 遇到的问题 今天在看 Transformers 的前生今世 的时候,又一次看到了 Position Wise ,经常看到但老是一知半解,故索性查了一下,发现网上的都没怎么细讲其缘由,有点差强人意,于是我又用咱们最喜欢的 GPT-…

Django 路由系统详解

Django 路由系统详解 引言 Django 是一个高级 Python Web 框架,它鼓励快速开发和干净、实用的设计。在 Django 中,路由系统是其核心组件之一,负责将用户的请求映射到相应的视图函数或类。本文将深入探讨 Django 的路由系统,包括其工作原理、配置方式以及高级功能。 目录…