IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> B站记录——STM32的串口 -> 正文阅读

[嵌入式]B站记录——STM32的串口

对看过的STM32教程进行记录,省着忘。

?

在整个框架下进行串口的配置,串口接收采用中断方式接收,全局变量数组作为缓冲区,每次接收到一个字节,进入中断服务函数,把接收到的内容保存在数组里,使用定时器的方法判断一个数据帧的结束,定时对接收到的数据进行处理,这两个处理都需要滴答定时器衍生的软件定时器

#define Usart1RecTimer sysTimer[4] //串口1接收定时器,如果超时,表示一帧接收完毕
#define Usart1ControlBeepTimer  sysTimer[5] //Usart1ControlBeepTask使用

中断服务函数

//USART1_IRQHandler,串口1中断回调函数
void USART1_IRQHandler(void)
{
	uint8 RecCh;
	if( USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=RESET )				// 串口接收数据 
	{		
		Usart1RecTimer = 10;
		RecCh =(uint8)USART_ReceiveData(USART1);
		g_USART1_RxBuf[g_USART1_RecPos++] =RecCh;
		USART_ClearFlag(USART1, USART_FLAG_RXNE);
	}
	if( USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET ) 				// 串口溢出错误
	{
			USART_ClearFlag(USART1, USART_FLAG_ORE);
	}
}

Usart1RecTimer在串口的接收中断服务函数中被设置为10,在滴答定时器的中断服务函数里递减,当减到0的时候,说明有10ms没有接收到新的字节,代表接受完一个数据帧。如果在10ms内接收到新的字节,会把Usart1RecTimer重新赋值为10,继续接收新的字节。这样,用10ms判断是否接收完一帧数据

串口的接收处理函数

unsigned char Usart1_RecProcess(void)
{
	if(Usart1RecTimer) return FALSE;
	if(!g_USART1_RecPos) return FALSE;
	
	g_USART1_RxBuf[g_USART1_RecPos]='\0';
	
	//收包处理
//	"Beep On" 
//	"BeeP Off"
	if(strstr((char *)g_USART1_RxBuf,"Beep On")!= NULL)
	{
		BeepOn();
	}
	else if(strstr((char *)g_USART1_RxBuf,"Beep Off")!= NULL)
	{
		BeepOff();
	}
	//memset(g_USART1_RxBuf,0,USART1_RX_BUF_SIZE);
	g_USART1_RecPos = 0;
	return TRUE;
}

处理函数对应的时间是20ms,也采用软件定时器的方法,即20ms执行一次这个函数。这个函数是对接收到的数据帧进行处理,首先要判断是否接收完一帧,即采用上面提到的利用定时的方法,判断Usart1RecTimer的值是否为0,为0,接收完一帧,往下执行;不为0,没接收完,返回。其次判断是否接收到数据,g_USART1_RecPos代表缓冲区数据的下标,如果它为0,则没有接收到数据,返回即可。

主要是这两个量,Usart1RecTimer?? Usart1ControlBeepPeriod想清楚就好了

串口接收处理,见过好多种方法,想弄一个一劳永逸,可以用在各种场合的方法,可能不是个好主意,根据实际情况灵活采用吧,可能实际工作中,没有完美,够用就好。

头一次接触到用定时器判断是否完成帧的接收,也挺有意思。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:56:09  更:2021-09-09 11:56:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:48:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计