Stm32_标准库_14_串口蓝牙模块_手机与蓝牙模块通信_实现模块读取并修改信息

news/2024/6/3 19:11:21 标签: stm32, 单片机, 智能手机

由手机向蓝牙模块传输时间信息,Stm32获取信息并将已存在信息修改为传入信息

测试代码:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

uint16_t num = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
char News[100] = ""; 
uint8_t flag = 1;

/*初始化通用定时器TIM2*/
void Timer_Init(void){
	   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//APB1外设开启
	   
	   TIM_InternalClockConfig(TIM2);//选择内部时钟
	
	   /*初始化时基单元*/
	   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	   TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装
	   TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//psc预分频器
	   TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计时器内容直接给零
	   //记录1s 
	   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//刚初始化完就会进中断
	   
	   TIM_ClearFlag(TIM2, TIM_FLAG_Update);//消除中断标志位
	   //使能更新中断
	   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	   /*配置中断*/
	   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择组2
	   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器2在NVIC内的通道
	   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
		 NVIC_Init(&NVIC_InitStructure);
		 
		 TIM_Cmd(TIM2, ENABLE);//启动定时器
}
unsigned char time[] = {22, 59, 30};
unsigned int date[] = {2023, 12, 31};
char month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void Show_Time(void){
	   OLED_ShowNum(1,1,time[0], 2);
	   OLED_ShowString(1, 3, ":");
	   OLED_ShowNum(1,4,time[1], 2);
	   OLED_ShowString(1, 6, ":");
	   OLED_ShowNum(1,7,time[2], 2);
}
void Show_Date(void){
	   OLED_ShowNum(2,1,date[0], 4);
	   OLED_ShowString(2, 5, "/");
	   OLED_ShowNum(2,6,date[1], 2);
	   OLED_ShowString(2, 8, "/");
	   OLED_ShowNum(2,9,date[2], 2);
}
void Time_Control(void){
	       time[2] = time[2] + 1;
        if(time[2] >= 60){
          time[2] = 0;
          time[1] = time[1] + 1;
          if(time[1] >= 60){
            time[1] = 0;
            time[0] = time[0] + 1;
            if(time[0] >= 24){
              time[0] = 0;
              date[2] = date[2] + 1;
   	          if(date[2] >= month[date[1]] + 1){
   		        date[2] = 1;
   		        date[1] = date[1] + 1;
   		        if(date[1] >= 13){
   		        	date[1] = 1;
   		        	date[0] = date[0] + 1;
   		        	if(date[0] >= 9999){
   		        		date[0] = 2023;
					   }
				   }
	           }
            }
         }
       }
				 
				
}

void TIM2_IRQHandler(void){//定时器2的中断函数,名字固定
	   if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){
			  
			 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除标志位
			 Time_Control();
		 }
		  
}

void month2_Control(void){//判别闰平年 
	if((date[0] % 4 == 0 && date[0] % 100 != 0 )|| date[0] % 400 == 0) month[2] = 29;
	else month[2] = 28;
}

 
void Get_Hc05News(void){
	   uint32_t i = 0, j = 0;
	   while(j < 10000){//等待中断
	      while(Serial_GetRxFlag() == 1){//查看标志位并清除
					   News[i] =  Serial_GetRxData();//传入数据
					   i ++;
				     j = 0;
					   flag = 0;//标志传入了新数据
		    }
		    j ++;
		 }
}

void Array_NewsClear(void){//恢复数组初始化
	   uint16_t i = 0;
	   for(i = 0; i < 100; i ++) News[i] = '\0';
}

uint8_t StringLength(char * a){//计算数组长度函数
	      uint8_t length = 0;
	      uint8_t i = 0;
	      while(a[i] != '\0'){
					i ++;
					length ++;
				}
				return length;
}

uint8_t Check(char *a, uint8_t length){
	      if(length == 5 | length == 10){
					 return 1;
				}
				return 0;
}
 
int main(void){
	 
	OLED_Init();//初始化OLED
  Timer_Init();//开启计时器
	Serial_Init();//开启串口
	while(1){ 
		    Get_Hc05News();//时刻等待蓝牙传入数据
		     
		     if(flag == 0){//蓝牙传入了数据
					  //恢复标志位
					 if(Check(News, StringLength(News)) == 1){//若查看数据没有错误
						 OLED_ShowString(3, 1, "TRUE");
						 OLED_ShowString(4, 1, News);
						 Array_NewsClear();
					 }
					 else{
						   OLED_ShowString(3, 1, "FALSE");
						   OLED_ShowString(4, 1, News);
						   Array_NewsClear();
					 }
					 flag = 1;
				}
		    
	}
}



目前遇到的主要问题是OLED显示数字需要耗费时间,导致蓝牙模块传入信息不能及时抢占CPU导致数据漏传入,解决方法是修改蓝牙模块中断为更高级中断


待完善…


http://www.niftyadmin.cn/n/5092533.html

相关文章

Linux网络编程系列之服务器编程——信号驱动模型

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器…

Jmeter压测http接口和java代码放在Jmeter执行

Jmeter无缝支持java语言&#xff0c;使其在市场上有很高的占有率&#xff0c;一些公司还专门对JMenter进行二次开发&#xff0c;使其成为公司级压测平台。 本次介绍JMenter的一些入门级使用&#xff0c;方便大家继续深入探索。 1、启动Jmeter 2、压测简单http接口 添加线程组…

2024北京国际光学镀膜技术及设备展览会

2024北京国际光学镀膜技术及设备展览会 Beijing International Optical Coating Technology and Equipment Exhibition2024 基本信息 时间&#xff1a;2024年7月24-26日 地点&#xff1a;北京国家会议中心 展会简介 2024北京国际光学镀膜技术及设备展览会展会将集中展示光学镀膜…

FP64、FP32、FP16、int8

参考 全网最全-混合精度训练原理&#xff1a;https://zhuanlan.zhihu.com/p/441591808 FP64、FP32、FP16、FP8简介&#xff1a;https://blog.csdn.net/weixin_42330305/article/details/127518011 AI为何用fp32 你要搞清楚一点&#xff0c;深度学习场景下只要FP32就可以确保…

网络安全(黑客技术)——如何高效自学

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学&#xff1f;如何学&#xff1f; 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c…

奖学金答辩注意事项

奖学金答辩注意事项 1.PPT制作 注意字数不要太多&#xff0c;一页PPT里面不要堆满了文字。 评审老师主要是来听你演讲和答辩的&#xff0c;而不是来看你的文字叙述的。就算文字有些多&#xff0c;也要尽量以表格的形式呈现&#xff0c;不然看上去就会非常乱。多用图和表&…

【具身智能模型1】PaLM-E: An Embodied Multimodal Language Model

论文标题&#xff1a;PaLM-E: An Embodied Multimodal Language Model 论文作者&#xff1a;Danny Driess, Fei Xia, Mehdi S. M. Sajjadi, Corey Lynch, Aakanksha Chowdhery, Brian Ichter, Ayzaan Wahid, Jonathan Tompson, Quan Vuong, Tianhe Yu, Wenlong Huang, Yevgen C…

JDBC中ResultSet的使用

Java中ResultSet的使用 一、介绍二、常用方法三、使用示例四、ResultSetMetaData 一、介绍 ResultSet是Java中用于处理查询结果的接口。它提供了一种处理结果集的方式&#xff0c;使得我们可以遍历结果集中的每一行&#xff0c;并访问每一行中的每一列。 二、常用方法 Resul…