当前位置: 首页 > news >正文

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

由手机向蓝牙模块传输时间信息,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);//选择组2NVIC_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();//初始化OLEDTimer_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.lryc.cn/news/194075.html

相关文章:

  • UDP 的报文结构
  • torch.hub.load报错urllib.error.HTTPError: HTTP Error 403: rate limit exceeded
  • 测试左移右移-理论篇
  • 【TensorFlow2 之015】 在 TF 2.0 中实现 AlexNet
  • Python进阶之迭代器
  • Vue鼠标右键画矩形和Ctrl按键多选组件
  • 【MySQL JDBC】使用Java连接MySQL数据库
  • 字节码学习之常见java语句的底层原理
  • Godot C#连接信号不能像GDScirpt一样自动添加代码
  • 快速自动化处理JavaScript渲染页面
  • 通过API接口进行商品价格监控,可以按照以下步骤进行操作
  • (vue3)大事记管理系统 文章管理页
  • springboot 使用RocketMQ客户端生产消费消息DEMO
  • 第三章 内存管理 四、连续分配管理方式
  • npm install报--4048错误和ERR_SOCKET_TIMEOUT问题解决方法之一
  • 合并两个有序数组
  • 自动泊车系统设计学习笔记
  • 基于Java的家电销售网站管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 设计模式~备忘录模式(memento)-22
  • 【Agora UID 踩坑记录 Java 数据类型】
  • ESP8285 RTOS SDK OTA
  • Hadoop3教程(四):HDFS的读写流程及节点距离计算
  • [0xGameCTF 2023] web题解
  • Qt之submodule编译
  • Python实现带图形界面的计算器
  • $ vue -Vbash: vue: command not found
  • 专业音视频领域中,Pro AV的崛起之路
  • vscode 右侧滚动条标记不提示,问题解决纪录
  • 【Java 进阶篇】JavaScript特殊语法详解
  • PCL点云处理之配准中的匹配对连线可视化显示 Correspondences(二百一十九)