STM32串口详解

news2024/9/22 5:21:25

实验一:简单的利用串口接收中断回调函数实现数据的返回

 

关于串口调试助手,还应知道:

  • 发送英文字符需要用一个字符即8位,发送汉字需要两个字符即16位,如上图,发送汉字“姜”实际是发送“BD AA”而发送英文字符X实际是发送“58”,本质上没有太大区别;
  • 勾选了下方“发送新行”后,XCOM就会再你输入的需要发送的数据后自动加上一个回车(0X0D+0X0A),如果不勾选则我们在手动输入完“宋S”后还需敲一个回车键只有这样点击发送后,调试助手上方窗体才能将其显示,这是因为我们在程序的串口中断中自定义了一个数据接收协议,即只有当接受的数据以回车结尾(0X0D+0X0A),串口才认可数据接受完毕

这里可以看出下列代码中的 0D回车,0A换行 是用来判断结束位的

if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D))

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>//meset()函数调用
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
#define RXBUFFERSIZE  256     //最大接收字节数
char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
    HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);   //中断接收一个字符
  /* USER CODE END 2 */
/*
串口接收中断回调函数
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
	{
		if (Uart1_Rx_Cnt >= 255)
		{
			memset(RxBuffer,0x00,sizeof(RxBuffer));//对数组进行清零操作
			HAL_UART_Transmit(&huart1,(uint8_t *)"数据溢出",4,0xffff);//
		}
		else
		{
			RxBuffer[Uart1_Rx_Cnt++]=aRxBuffer;   //接收数据转存
			if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位 0D回车,0A换行 
					{
						HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
						
						while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
						
						Uart1_Rx_Cnt = 0;
						memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
					}

		
		}
		    HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);	//使得程序可以重新触发接收中断	+

} 

上述代码实现的是 发送数据被返回

实验二:

1、串口发送/接收函数

  • HAL_UART_Transmit();串口发送数据,使用超时管理机制 
  • HAL_UART_Receive();串口接收数据,使用超时管理机制
  • HAL_UART_Transmit_IT();串口中断模式发送  
  • HAL_UART_Receive_IT();串口中断模式接收
  • HAL_UART_Transmit_DMA();串口DMA模式发送
  • HAL_UART_Transmit_DMA();串口DMA模式接收

2、串口中断函数

  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
  • HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
  • HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
  • HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
  • HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
  • HAL_UART_ErrorCallback();串口接收错误函数

3串口查询函数

  HAL_UART_GetState();  判断UART的接收是否结束,或者发送数据是否忙碌

UART几个标志位

TXE、TC、RXNE、ORE。

TXE:发送数据寄存器为空 (Transmit data register empty)

  • 0:数据未传输到移位寄存器
  • 1:数据传输到移位寄存器

TC:发送完成 (Transmission complete)

  • 0:传送未完成
  • 1:传送已完成

RXNE:读取数据寄存器不为空 (Read data register not empty)

  • 0:未接收到数据
  • 1:已准备好读取接收到的数据

ORE:上溢错误 (Overrun error)

  • 0:无上溢错误
  • 1:检测到上溢错误

UART接收丢失数据

UART接收丢失数据与软件和硬件都有可能有关系,下面说几个常见丢失数据的原因及解决办法。

1.接收溢出丢失数据

指未及时取走数据导致溢出错误而丢失数据,通常是发生在大量数据、以查询方式接收数据的情况下。在MCU启动过程中、接收数据过多处理不及时、复杂系统响应不及时等情况都会出现数据丢失的情况。

解决办法:

  • 及时清除溢出错误标志
  • 利用通信协议过滤因数据丢失导致的问题

2.接收中断丢失数据

使用UART中断接收数据相比查询接收数据的方式更常见,中断方式比查询方式响应更及时,但不合理处理同样也会存在数据丢失的情况。

在数据量大时,UART接收中断函数耗时、优先级低等情况下容易丢失数据。

解决办法:

  • 中断函数里减少不必要的耗时
  • 合理分配中断优先级
  • 使能中断前清除标志位

3.时钟误差导致丢失数据

在通信波特率较高的情况下,如果时钟误差加大,很可能导致数据丢失。

解决办法:

  • 使用更高精度晶振
  • 降低通信波特率

UART发送丢失数据

UART发送丢失数据很多工程师都遇到过,通常情况下是传输未完成的原因。

HAL库已经有几年了,但还是有很多工程师都使用标准外设库,这时如果自己封装接口不当,就会存在发送最后一字节数据丢失的问题。

1.UART传输未完成导致数据丢失

如下代码,只考虑非空,但实际传输并未完成。

//往USART1,发送 length长度的数据data
void SendData(u8 *data,u8 length)
{
    u8 i;
    for(i=0;i<length;i++)
    {
        USART_SendData(USART2, data[i]);
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//等得发送完成
        {
        }  
    }
}

但发送非空不代表发送完成,虽然在某些场合更高效,但某些场合就会导致数据丢失。

比如:使用此函数发送之后进入休眠、关闭接收端设备电源等情况下。

解决办法:使用HAL封装的接口,代码包含判断传输完成

/*******************************************************************************
  * @函数名称	SendData1
  * @函数说明   向串口1发送数组信息
  * @输入参数 
			data:要发送的信息的首地址
			len: 发送的长度
  * @输出参数   无
  * @返回参数   无
*******************************************************************************/
void SendData1(u8 *data,u8 length)
{
    u8 i;
    for(i=0;i<length;i++)
    {
			HAL_UART_Transmit(&huart1,&data[i],length,0xFFFF); //将收到的信息发送出去,HAL封装的接口,代码包含判断传输完成
    }
}

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

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

相关文章

外卖项目06---套餐管理业务开发(移动端的后台代码编辑开发)

菜品展示、购物车、下单 目录 一、导入用户地址簿相关功能代码 90 1.1需求分析 90 1.2数据模型 90 1.3导入功能代码 90 二、菜品展示 91 2.1需求分析 91 2.2商品展示---代码开发---梳理交互过程 92 2.3菜品展示---代码开发---修改DishController的list方法并测试 93 2…

OpenGL原理与实践——核心模式(二):Shader变量、Shader类的封装以及EBO

目录 Shader内的一些关键字 向量 举例&#xff1a;shader之间的数据传输&#xff0c;并实现渐变颜色 举例&#xff1a;C向shader传输数据的过程 代码整理——shader类的封装 加入颜色信息 索引绘制——EBO 整体代码以及渲染结果 Shader内的一些关键字 in&#xff1a;上…

网站被劫持勒索怎么办

互联网出现后的几十年时间里&#xff0c;世界便由一张张网串联了起来&#xff0c;给我们的生活带来了无限的便利。但在互联网飞速发展的同时&#xff0c;恶意网络攻击也随之而来&#xff0c;近年来&#xff0c;互联网攻击事件频发&#xff0c;不法分子利用常见的DDoS攻击、CC攻…

【生成式网络】入门篇(二):GAN的 代码和结果记录

GAN非常经典&#xff0c;我就不介绍具体原理了&#xff0c;直接上代码。 感兴趣的可以阅读&#xff0c;里面有更多变体。 https://github.com/rasbt/deeplearning-models/tree/master/pytorch_ipynb/gan GAN 在 MINIST上的代码和效果 import os # os.chdir(os.path.dirname(_…

springBoot集成websocket实现消息实时推送提醒

在浏览某些网页的时候&#xff0c;例如 WebQQ、京东在线客服服务、CSDN私信消息等类似的情况下&#xff0c;我们可以在网页上进行在线聊天&#xff0c;或者即时消息的收取与回复&#xff0c;可见&#xff0c;这种功能的需求由来已久&#xff0c;并且应用广泛,和pc端web系统待办…

新建anaconda使用jupyter出现的一系列问题

1&#xff0c;运行一段机器学习代码&#xff0c;报缺少h5py的错误. 使用conda install h5py1.8.0 安装无法安装&#xff0c;因为当前环境的python版本是3.9&#xff0c;只能用3.7及以下的版本。无奈只能新建一个conda 环境。 2&#xff0c;新建一个 python3.7的conda 环境。运行…

「风控算法服务平台」高性能在线推理服务设计与实现

本文作者&#xff1a;郁昌存 来自京东科技-风险管理中心 一、背景/目标 1&#xff09; 风控智能化体系建设依赖大量深度学习/机器学习模型进行实时在线的风险识别、智能决策。要求可以将算法模型快速部署为在线服务&#xff0c;供决策引擎调用。 2&#xff09; 风控决策引擎…

文献 | 教师主观幸福感变迁:横断历史研究的视角

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是莹~ 疫情带来的社会经济变化正在改变着我们的求职意向&#xff0c;越来越多的人参与到考公考编的大军中。其中&#xff0c;教师这一职业的稳定性和社会认同度吸引了越来越多的年轻人参加教资考试。 教…

Linux Top 详细介绍,包含task排序

Linux Top 当我们在终端输入 top 命令时&#xff0c;会弹出一个变化的页面&#xff0c;打印出当前系统的大量重要指标&#xff0c;以及很多进程当前的运行情况&#xff1a; 可以看到&#xff0c;top 命令主要是两部分&#xff0c;第一部分为 头部指标&#xff0c;打印的是当…

磨金石教育摄影技能干货分享|那些酷炫的照片是怎么拍出来的?

在网上我们经常会看到一些非常有创意&#xff0c;非常炫酷的照片。喜欢摄影的朋友肯定会想&#xff0c;这样的照片怎么拍呢&#xff1f;由于照片的创意度很高&#xff0c;导致很多人想模仿却不知道怎么模仿。以前学的那些构图、选景等技巧&#xff0c;好像不太够用。 今天我们…

2022年文化艺术品产权交易所研究报告

第一章 文化艺术品产权交易所发展概述 1.1 文交所概念 文化产权交易所&#xff08;简称“文交所”&#xff09;从事文化产权交易及相关投融资服务工作&#xff0c;促进文化产业要素跨行业、跨地域、跨所有制流动。文交所从事的创新业务主要是文化艺术品的份额化&#xff0c;即…

idea 配置ssm项目后配置文件的简要解析及功能类之间的联系

注&#xff1a;本文不包含怎么配置 idea ssm 项目&#xff0c;仅做个人向配置好之后&#xff0c;对于各个文件的分析及跳转之间的的浅解析&#xff08;之前照着配的文章找不到了qwq&#xff09;。 叠甲&#xff1a;新手&#xff0c;刚学&#xff0c;不太会&#xff0c;如有错请…

初识Python_数据容器_字符串str

一、再识字符串字符串---字符的容器。一个字符串可以存放任意数量的字符1、字符串的下标&#xff08;索引&#xff09;和其他容器如&#xff1a;列表、元组一样&#xff0c;字符串也可以通过下标进行访问从前向后 下标从0开始从后向前&#xff0c;下标从-1开始同元组一样&#…

11个精美网页——Web前端开发技术课程大作业,期末考试,Dreamweaver简单网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

罗茨气体流量计的结构设计

目 录 摘 要 I ABSTRACT II 1绪 论 1 1.1 引言 1 1.2 罗茨气体流量计的特点 1 1.&#xff13;罗茨气体流量计的应用场合[3] 2 1.4 发展前景[5] 6 2罗茨气体流量计的工作及结构原理 7 2.1 罗茨气体流量计的工作原理[3] 7 2.2罗茨气体流量计的结构原理 7 2.2.1 罗茨气体流量计的结…

echarts——实现3D地图+3D柱状图 效果——粗糙代码记录——技能提升

最近看到同事在弄下面的这个图&#xff0c;这个图是从网上看到的&#xff0c;是某个网站的收费项目&#xff1a; 收费模板&#xff1a;&#xffe5;29.9元购买&#xff0c;且必须是高级版尊享版才能够购买这个。。。 死贵&#xff01;&#xff01;&#xff01; 所以&#xf…

多臂PEG衍生物——8-Arm PEG-N3,8-Arm PEG-Azide,八臂-PEG-叠氮

多臂PEG衍生物八臂-聚乙二醇-叠氮&#xff0c;化学试剂其英文名为8-Arm PEG-Azide&#xff0c;8-Arm PEG-N3&#xff0c;它所属分类为Azide PEG Multi-arm PEGs。 八臂PEG叠氮的分子量均可定制&#xff0c;有&#xff1a;八臂-peg 5k-叠氮、八臂PEG 2k叠氮、叠氮-聚乙二醇 10k…

19 06-读取DTC扩展数据记录

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;19服务作为UDS中子功能最多的服务&#xff0c;一共有28种子功能&#xff0c;本文将介绍常用的19 06服务&#xff1a;读取DTC扩展数据。 关联文章&#xff1a; 19服务List 19 01-通过状态掩码读取DTC数目 19 02-检…

PL/Java的安装及使用

安装步骤 1.1 下载相应扩展包 https://network.pivotal.io/products/vmware-tanzu-greenplum#/releases/1193700 1.2 上传并安装pljava-2.0.4-gp6-rhel7_x86_64.gppkg [gpadmingp_master ~]$ gppkg -i pljava-2.0.4-gp6-rhel7_x86_64.gppkg 重启数据库 [gpadmingp_master ~]$…

企业管理中,商业智能BI主要做哪些事情?

开门见山的告诉大家&#xff0c;在企业管理中商业智能BI 主要就做三件事&#xff1a;拉通数据、整合数据、数据可视化展现。 技术角度的商业智能BI 从技术的角度来讲&#xff0c;商业智能BI是一套完整的由数据仓库、查询报表、数据分析等组成的数据类技术解决方案。它有一个非…