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的波特率是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);
	}
}
	

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

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

相关文章

小车启动底盘功能包

传感器与小车底盘的集成 新建功能包 catkin_create_pkg mycar_start roscpp rospy std_msgs ros_arduino_python usb_cam ydlidar_ros_driver功能包下创建launch文件夹&#xff0c;launch文件夹中新建launch文件&#xff0c;文件名start.launch。 内容如下 <!-- 机器人启动…

雷达标定与解析

融合雷达与解析雷达数据的相关代码。感谢开源社区的贡献。以下代码继承了很多人的工作。 如果是单雷达&#xff1a; 直接进行标定&#xff0c;所以就是接收相关的话题然后发布。 lidar_calibration_params.yaml&#xff1a; calibration:在这个接口里面x_offset: 0.0y_offset:…

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下&#xff0c;内网穿透技术越来越多的被人们所使用&#xff0c;使用内网穿透技术的好处有很多。 1&#xff1a;无需公网ip 物以稀为贵&#xff0c;由于可用的公网IP地址越来越少&#xff0c;价格也是水涨船高&#xff0c;一个固定公网IP一年的成本…

想让Python序列切片更高效?这些技巧你不可不知!

目录 1、自定义类实现切片 🍏 1.1 实现__getitem__方法 1.2 支持正负索引与步长 2、利用 collections.abc 模块 🧠 2.1 继承MutableSequence类 2.2 重写关键方法 3、使用标准库itertools.slice 🍲 3.1 itertools工具介绍 3.2 slice函数应用实例 4、通过生成器实…

Docker Compose--安装Nginx--方法/实例

原文网址&#xff1a;Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config │ ├── cert │ │ ├── xxx_bundle.pem │ │ └── xxx.key │ ├── conf.d │ …

APP客户端接口本地缓存,降低请求量和请求峰值,减少云资源成本

背景 静态信息&#xff1a;非实时有状态的数据 针对资源位、评价等静态信息在xx点高峰时进行缓存&#xff0c;达到降低请求量和请求峰值的目标。 在成本预算控制下&#xff0c;云资源成本和WAF都受限于请求峰值。 出于业务和数据安全考虑&#xff0c;公司希望接入阿里云的WAF&a…

头歌——机器、深度学习——手写体识别

第1关&#xff1a;神经网络基本概念 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.神经网络基本概念。 神经网络基本概念 神经网络由输入层、隐藏层、输出层组成&#xff1b;…

安卓逆向经典案例—H5appXX运维

H5app的class不一定是android.webkit.WebView 也可能是腾讯X5内核或者是uc webview 殊途同归也要去hook webview的系统函数和可调式方法setWebContentsDebuggingEnabled。突破sign算法&#xff0c;输出协议和加密算法的作用是什么&#xff1f;分析c-sign值 在加密的位置下断点 …

爱心商城管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;企业管理&#xff0c;用户管理&#xff0c;论坛管理&#xff0c;商品管理&#xff0c;公告管理&#xff0c;用户捐赠 企业账户功能包括&#xff1a;系统首页&#xff0c;个人中…

2009年-2022年 地级市-环境污染处罚数据

环境污染处罚数据是环境保护领域中重要的信息资源&#xff0c;它记录了因违反环保法律法规而受到行政处罚或法律制裁的具体情况。这些数据对于提高公众的环保意识、促进企业采取环保措施以及推动环境治理具有重要作用。 数据内容概述 违法行为的主体&#xff1a;即受到处罚的…

【树形dp 换根法 BFS】2581. 统计可能的树根数目

本文涉及知识点 CBFS算法 动态规划汇总 图论知识汇总 树形dp 换根法 BFS LeetCode 2581. 统计可能的树根数目 Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges 表示&#xff0c;其中 edges[i] [ai, bi] &#xf…

LoRaWAN在嵌入式网络通信中的应用:打造高效远程监控系统(附代码示例)

引言 随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;远程监控系统在各个领域的应用越来越广泛。LoRaWAN&#xff08;Long Range Wide Area Network&#xff09;作为一种低功耗广域网通信协议&#xff0c;因其长距离传输、低功耗和高可靠性等特点&#xff0c;成为…

Apollo9.0 PNC源码学习之Planning模块(二)—— planning_component

前面文章: Apollo9.0 PNC源码学习之Planning模块(一)—— 规划概览 0 Planning代码框架速览 1 planning_component源码解析 modules/planning/planning_component/planning_component.h #pragma once#include <memory>#

在vue项目中集成cesium

首先创建一个新的vue项目 安装vite中cesium插件 https://github.com/nshen/vite-plugin-cesium 安装插件 npm i cesium vite-plugin-cesium vite -D配置插件 注释原有样式 修改代码 效果

04--MySQL8.0_JDBC

第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系; 后来我们学习了数据库管理软件MySQL,可以方便的管理数据1。 那么如何将它俩结合起来呢?即…

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用

【面试干货】Java中的四种引用类型&#xff1a;强引用、软引用、弱引用和虚引用 1、强引用&#xff08;Strong Reference&#xff09;2、软引用&#xff08;Soft Reference&#xff09;3、弱引用&#xff08;Weak Reference&#xff09;4、虚引用&#xff08;Phantom Reference…

【Docker】Docker操作容器命令

1、容器 1.1简介 容器镜像是一个软件的轻量级独立可执行软件包&#xff0c;包含运行它所需的一切&#xff1a;代码&#xff0c;运行时&#xff0c;系统工具&#xff0c;系统库&#xff0c;设置。不管环境如何&#xff0c;集装箱化软件都可以运行相同的Linux和Windows应用程序…

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了&#xff0c;难不成是被华为淘汰的&#xff1f;在华为混不下去了吧&#xff1f;身体没啥毛病吧&#xff0c;我们这体检可是很严的。” 近日&#xff0c;一位华为员工在朋友圈爆料&#xff0c;自己在面试时遭到了面试官的无理取闹和人身攻击&#xff0c;原因仅仅是因…

C语言中操作符详解(二)

OK&#xff0c;今天继续为诸君带来有关C语言中操作符的讲解 一 . 位操作符 C语言中的位操作符我相信大家并不陌生&#xff0c;我们在之前就已经接触过了一些 位操作符&#xff08;位操作符的操作数只能是整数&#xff09;&#xff1a; &#xff08;1&#xff09;& &…

头歌——机器学习——集成学习案例

第1关&#xff1a;基于集成学习模型的应用案例 任务描述 本次任务我们将会使用银行营销数据集&#xff08;来源于UCI数据集&#xff1a;UCI Machine Learning Repository &#xff09;,该数据集共45211条数据&#xff0c;涉及葡萄牙银行机构的营销活动&#xff0c;通过一些与…