STM32串口通信

一、串口发送

1.初始化引脚

void Serial_Init(uint32_t BaudRate)
{
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA ,ENABLE );
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 ,ENABLE );
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//由于PIN9为TX,故初始化为发送引脚
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
	GPIO_Init (GPIOA ,&GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=BaudRate;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控
	USART_InitStructure.USART_Mode=USART_Mode_Tx;//引脚初始化为发送模式
	USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位为1位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长位8bit即没有校验位
	USART_Init(USART1,&USART_InitStructure);
	
	USART_Cmd(USART1,ENABLE);//USART硬件使能
}

2.写发送函数

1.发送一个字节

        每次对DR寄存器的写操作会清空TXE标志位,故不需要手动清除。

void Serial_SendByte(uint8_t data)
{
	USART_SendData(USART1,data);//通过DR寄存器发送一个字节
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待TDR位空再发送下一个字节的数据,TDR的写命令会自动清除TXE标志位
}

2.发送一个数组

void Serial_SendArry(uint8_t *arry,uint8_t length)
{
	for(int i=0;i<length;i++)
	{
		Serial_SendByte(arry[i]);
	}
}

3.发送一个字符串

void Serial_String(char* String)
{
	for(int i =0;String[i]!=0;i++)
	{
		Serial_SendByte(String[i]);
	}
}

4.发送数字

void Serial_SendNum(uint16_t Num)
{
	uint16_t weishu=1+log10(Num);
	uint8_t data=0;
	uint16_t chushu=0;
	for(int i = weishu-1;i>=0;i--)
	{
		chushu=(uint16_t) pow(10,i );
		data=Num/chushu;
		Num=Num%chushu;
		Serial_SendByte(data+0x30);
	}
}

5.printf重定向

        这里需要注意,需要在魔术棒中勾上相关选项

//重写fputc函数
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

二、串口接收

1.轮询方式接收数据

        即在主循环中不断查询DR寄存器中的RXNE标志位是否被置为,若被置位,则说明有数据被接收,此时便可以使用USART_ReceiveData()函数去取数据。同样,对DR寄存器的读操作也会被清零。故不需要手动清零。

	 while(1)
	 {
		 if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
		 {
			data=USART_ReceiveData(USART1);
			 printf("data=%d\r\n",data);
		 }
	 }

2.中断方式接收数据

1.在初始化中加入与中断相关的函数

	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	NVIC_InitTypeDef usart_InitStructure;
	usart_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	usart_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	usart_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	usart_InitStructure.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&usart_InitStructure);

2.写中断函数以及相关接口函数

uint8_t Serial_GetFlag(void)
{
	if(Rxflag==1)
	{
		Rxflag=0;
		return 1;
	}
	else
		return 0;
}
uint8_t Serial_GetData(void)
{
	return Rxdata;
}
void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
	{
		Rxdata=USART_ReceiveData(USART1);
		Rxflag=1;
	}
}

 3.主函数

	 while(1)
	 {
		 if(Serial_GetFlag()==1)
		 {
			printf("data=%d\r\n",Serial_GetData());
		 }
	 }
}	

4.或者直接在中断中输出也可以

void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
	{
		printf("rxdata=%d\r\n",USART_ReceiveData(USART1));
	}
}

3.串口接收HEX数据包

        原理就是使用状态机的方式

void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
	{
		static uint8_t status=0;
		static uint8_t PacketNum=0;
		if(status==0)
		{
			if(USART_ReceiveData(USART1)==0XFF)//如果接收到了包头OXFF,则进入下一个状态
			{
				status=1;
			}
		}
		else if(status==1)//不断接受数据包的内容,如果接收了四个,则进入下一个状态
		{
			if(PacketNum<4)
			{
				Rxdata[PacketNum]=USART_ReceiveData(USART1);
				PacketNum++;
			}
			else
				status=2;
		}
		else if(status==2)//如果接收到了OXFE,则说明接收到了包尾,则将状态位以及数组个数全部清零,同时至标志位为1,允许主循环检测
		{
			if(USART_ReceiveData(USART1)==0xFE)
			{
				status=0;
				PacketNum=0;
				Rxflag=1;
			}
		}
	}
}
	 while(1)
	 {
		 if(Serial_GetFlag()==1)
		 {
			for(int i =0;i<4;i++)
			 {
				printf("Rxdata的值为[%d]=:%d\r\n",i,Rxdata[i]);
			 }
		 
		 }
	 }
}	

4.串口接收文本数据包

char Rxdata[100] ;
uint8_t Rxflag;

void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
	{
		static uint8_t status=0;
		static uint8_t PacketNum=0;
		if(status==0)
		{
			if(USART_ReceiveData(USART1)=='@')
			{
				status=1;
			}
		}
		else if(status==1) 
		{
			if(USART_ReceiveData(USART1)!='\r')
			{
				Rxdata[PacketNum]=USART_ReceiveData(USART1);
				PacketNum++;
			}
			else
				status=2;
				
		}
		else if(status==2) 
		{
			if(USART_ReceiveData(USART1)=='\n')
			{
				Rxdata[PacketNum]=0;//这里加上'\0',是字符串结束的标志
				status=0;
				PacketNum=0;
				Rxflag=1;
			}
		}
	}
}
	 while(1)
	 {
		 if(Serial_GetFlag()==1)
		 {
			Serial_String(Rxdata);
			Serial_SendByte('\r');
			Serial_SendByte('\n');
		 }
	 }

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

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

相关文章

python自动化之网易自动点歌

这个代码是是使用的pyautogui库和pyperclip库完成的&#xff0c;这个库是开源的地址如下&#xff1a;https://github.com/asweigart/pyautogui这里详细的用法想学习的可以到这看看 下面是代码&#xff1a; import pyautogui import subprocess import pyperclip import time i…

如何进行 ICP 备案/公安部联网备案

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

安装jmeter和ant

安装jmeter和ant 安装java环境 安装jdk和jre 下载Java SE Development Kit 8 Java SE subscribers will receive JDK 8 updates until at least December 2030. 选择指定包进行安装&#xff0c;如windows 共享账号参考&#xff1a;Oracle官网 账号及密码 目前官网下载低…

Java程序生成可执行的exe文件 详细图文教程

1.Java编辑器&#xff0c;如&#xff1a;idea、eclipse等&#xff0c;下载地址&#xff1a;IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrainshttps://www.jetbrains.com/idea/2.exe4j&#xff0c;下载地址&#xff1a;ej-technologies - Java APM, Java Prof…

吴恩达<用于LLM应用程序开发的LangChain> L1-Model_prompt_parser

问题预览/关键词 课程地址如何获取openAI的API Key如何根据日期设置不同模型?如何调用OpenAI的API?如何使用OpenAI的API&#xff1f;langchain如何抽象OpenAI的API接口&#xff1f;langchain如何创建提示词模板并查看模板内容&#xff1f;langchain如何使用提示词模板生成提…

使用Google reCAPTCHA防止机器注册

本文作者&#xff1a;陈进坚 博客地址&#xff1a;https://jian1098.github.io CSDN博客&#xff1a;https://blog.csdn.net/c_jian 简书&#xff1a;https://www.jianshu.com/u/8ba9ac5706b6 联系方式&#xff1a;jian1098qq.com 环境要求 能翻墙的电脑域名 验证原理 在谷歌…

python3--lxml pytoml.core.TomlError expected_equals报错解决

文章目录 一、问题二. 解决方法&#xff1a;三. 参考&#xff1a;四. 总结 一、问题 在ubuntu的armbian上的python3中安装lxml时报错了 安装命令是 pip3 install lxml报错简略信息如下图 File "/usr/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl/pytoml/par…

k8s 控制器StatefulSet原理解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s概述 2、有状态服务和无状态服务…

intelli J中添加maven依赖显示unable to import Maven project?如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

计算机网络练习-计算机网络体系结构与参考模型

计算机网络分层结构 ----------------------------------------------------------------------------------------------------------------------------- 1.在ISO/OSI参考模型中&#xff0c;实现两个相邻结点间流量控制功能的是( )。 A.物理层 B. 数据链路层 C.网络层 D.传…

图像分割:Pytorch实现UNet++进行医学细胞分割

图像分割&#xff1a;Pytorch实现UNet进行医学细胞分割 前言相关介绍项目结构具体步骤准备数据集读取数据集设置并解析相关参数定义网络模型定义损失函数定义优化器训练验证 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#x…

50-RGMIISGMIIQGMII电路设计

视频链接 RGMII&SGMII&QGMII电路设计01_哔哩哔哩_bilibili RGMII & SGMII & QSGMII电路设计 1、以太网简介&#xff08;参考第2课&#xff1a;千兆以太网电路设计&#xff09; 1.1、以太网的概述 以太网是一种计算机局域网技术。 从硬件的角度来说&#x…

祝贺十九岁的美创,一天拿了5个奖!

今天&#xff0c;和19岁的美创一起数奖&#x1f947;&#x1f947;&#x1f947; 刚刚&#xff0c;北京、杭州两地接连传来好消息—— 北京 被誉为中国IT业界延续时间最长的年度盛会——由赛迪顾问主办的2024年IT市场年会于今日隆重召开&#xff0c;备受瞩目的“首届IT创新大赛…

一份超详细的鸿蒙开发面经分享!上百道鸿蒙经典面试题整理~

鸿蒙&#xff08;HarmonyOS&#xff09;作为华为公司自主研发的全场景分布式操作系统&#xff0c;受到了广泛关注。 在面试中&#xff0c;面试官往往会关注申请人的技术能力、项目经验以及解决问题的能力。 下面是一些关于鸿蒙开发具有3年工作经验的面试题及其相关问答&#…

SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

1.MybatisPlus常用注解&#xff1a; 1.1 当数据库、表名和字段名和实体类完全一致时无需加注解&#xff0c;不一致时&#xff1a; TableName指定库名 TableId指定表名 TableField指定字段名 1.2 自增主键&#xff1a; TableId(typeIdType.AUTO) private Long id; 1.3 实体类中属…

python环境引用《解读》----- 环境隔离

首先我先讲一下Anaconda&#xff0c;因为我用的是Anaconda进行包管理。方便后面好理解一点。 大家在python中引用环境的时候都会经历下面这一步&#xff1a; 那么好多人就会出现以下问题&#xff08;我就是遇到了这个问题&#xff09;&#xff1a; 我明明下载了包&#xff0c…

编程填空题:麻烦的位运算

闲着没事干可以做做 可以看到&#xff0c;那个函数直接return了&#xff0c;也就是说&#xff0c;得找到一个表达式&#xff0c;直接求出结果 简单分析一下&#xff1a; 其第i位为1当且仅当n的右边i位均为1 也就是说&#xff0c;前i-1位有0&#xff0c;第i位就是0 也就是说…

针对springcloud gateway 跨域问题解决方案

springcloud gateway版本 <spring-boot.version>2.3.3.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version>跨域问题说明 application:1 Access to XMLHttpRequest at https://xxxxxxxxxx from origin http://l…

创新入门|用户体验设计策略:数字化成功的蓝图

今天,我们来深入探讨如何打造令人兴奋的用户体验设计策略。将数字产品和服务从“普通”提升到“太棒了”的高度,这将是我们的主题。为什么这一策略那么重要呢?在当今被各种数字产品“轰炸”的世界,一个可靠的体验策略可能决定用户是否长期使用,还是一弹而走。我们都曾深受那种…

【Canvas技法】六种环状花纹荟萃

【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用HTML5/Canvas绘制六种环状花纹</title><style type&quo…