使用STM32实现 蓝牙插座

硬件介绍

蓝牙模块HC-01

蓝牙模块,又叫做蓝牙串口模块
串口透传技术:透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里

以太网,蓝牙,Zigbee, GPRS 等模块玩法一样,对嵌入式程序员来说,不需要关心通讯模块内部数据及协议栈工作原理,只要通过串口编程获得数据即可

项目需求

通过蓝牙的串口发送open打开LED|继电器同理,输入close关闭LED

接线

HC-01 的 TXD和RXD 分别接到单片机的RX1和TX1

由于HC-01模块先前的波特率设置成9600,要将stm32的波特率也设置成9600,所以我在cubemx将其设置

使用非中断的方式实现

CubeMX配置

惯例配置+上节的串口配置(此时不用打开中断)+配置GPIO口,LED灯(PB8拉高)

Keil

记得在魔术棒里打开Micro-lib,这样才能重写printf函数

#include <stdio.h>
#include <string.h>int fputc(int a,FILE *f)//一个字符一个字符发送
{unsigned char temp[1] = {a};HAL_UART_Transmit(&huart1,temp,1,0xffff);return a;
}int main(void)
{while (1){HAL_UART_Receive(&huart1,buff,19,100);//19是因为我定义了20位字节的缓冲区,但实际字符串的发送结束会有\0,所以要预留一位,也就是说最多接收19个字符if(strcmp((const char *)buff,"open") == 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) == GPIO_PIN_RESET){printf("LED1已经打开\r\n");}}else if(strcmp((const char *)buff,"close") == 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) == GPIO_PIN_SET){printf("LED1已经关闭\r\n");}}printf("shion\r\n");//心跳包memset(buff,0,strlen((const char *)buff));}}

 注:使用超时管理机制时,蓝牙不用勾选“发送新行”,因为超时管理机制不是检测"\r\n"即<回车><换行>”,而是检测代码的条件

'\r'是回车,前者使光标到行首,(carriage return)0X0D
'\n'是换行,后者使光标下移一格,(line feed)0x0A

 使用中断的方式实现

#include <stdio.h>
#include <string.h>//串口接收缓存(1字节)
uint8_t buf=0;
//定义最大接收字节数 200,可根据需求调整
#define UART1_REC_LEN 200// 接收缓冲, 串口接收到的数据放在这个数组里,最大UART1_REC_LEN个字节
uint8_t UART1_RX_Buffer[UART1_REC_LEN];//  接收状态
//  bit15,      接收完成标志
//  bit14,      接收到0x0d
//  bit13~0,    接收到的有效字节数目
uint16_t UART1_RX_STA=0;// 接收完成回调函数,收到一个数据后,在这里处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{// 判断中断是由哪个串口触发的if(huart->Instance == USART1){// 判断接收是否完成(UART1_RX_STA bit15 位是否为1)if((UART1_RX_STA & 0x8000) == 0){// 如果已经收到了 0x0d (回车),if(UART1_RX_STA & 0x4000){// 则接着判断是否收到 0x0a (换行)if(buf == 0x0a)// 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1UART1_RX_STA |= 0x8000;else// 否则认为接收错误,重新开始UART1_RX_STA = 0;}else	// 如果没有收到了 0x0d (回车){//则先判断收到的这个字符是否是 0x0d (回车)if(buf == 0x0d){// 是的话则将 bit14 位置为1UART1_RX_STA |= 0x4000;}else{// 否则将接收到的数据保存在缓存数组里UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;UART1_RX_STA++;// 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收if(UART1_RX_STA > UART1_REC_LEN - 1)UART1_RX_STA = 0;}}}// 重新开启中断HAL_UART_Receive_IT(&huart1, &buf, 1);}
}int fputc(int ch, FILE *f)
{      unsigned char temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,0xffff);  return ch;
}int main(void)
{// 开启接收中断HAL_UART_Receive_IT(&huart1, &buf, 1);while (1){		//判断判断串口是否接收完成if(UART1_RX_STA & 0x8000){printf("收到数据:%s\r\n",UART1_RX_Buffer);if(strcmp((const char *)UART1_RX_Buffer,"open") == 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) == GPIO_PIN_RESET){printf("LED1已经打开\r\n");}}else if(strcmp((const char *)UART1_RX_Buffer,"close") == 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) == GPIO_PIN_SET){printf("LED1已经关闭\r\n");}}else{if(UART1_RX_Buffer[0] != '\0'){printf("指令发送错误:%s\r\n",UART1_RX_Buffer);}}printf("\r\n");// 重新开始下一次接收UART1_RX_STA = 0;memset(UART1_RX_Buffer,0,strlen((const char *)UART1_RX_Buffer));//初始化UART1_RX_Buffer}printf("hello shion\r\n");HAL_Delay(1000);}

使用中断方式时,蓝牙助手或者串口调试助手要采用”发送新行”或者手动换行

串口和 蓝牙模块HC08-CSDN博客

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

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

相关文章

农业地物反演采用卫星影像技术方法

一、引言 随着空间技术的快速发展&#xff0c;卫星影像已经成为一种重要的工具&#xff0c;用于提供全球尺度的数据收集和分析。在农业领域&#xff0c;卫星影像被广泛应用于植物反演&#xff0c;以获取关于作物生长和健康的实时信息。本文旨在全面概述卫星影像在农业植物反演中…

【排序,找规律,站队型】

茵茵所在的合唱队共有N个人&#xff08;N为奇数&#xff09;。为了准备一次演出&#xff0c;老师开始为她们安排合唱队形了。大家都知道&#xff0c;合唱队形通常是中间高两端低的。老师是这样安排他们的队形的&#xff1a;先让所有的同学按高个儿在前的顺序排成一队。然后&…

baseline SE SP YI是什么?

SE、SP和YI是评估分类模型性能时常用的几个统计指标&#xff0c;特别是在医学影像处理、疾病诊断等领域&#xff0c;这些指标帮助了解模型对于正负类样本的识别能力。 SE (Sensitivity)&#xff0c;也称为真正率&#xff08;True Positive Rate, TPR&#xff09;或召回率&#…

鸿蒙ArkUI实例:【自定义组件】

组件是 OpenHarmony 页面最小显示单元&#xff0c;一个页面可由多个组件组合而成&#xff0c;也可只由一个组件组合而成&#xff0c;这些组件可以是ArkUI开发框架自带系统组件&#xff0c;比如 Text 、 Button 等&#xff0c;也可以是自定义组件&#xff0c;本节笔者简单介绍一…

《LeetCode力扣练习》代码随想录——二叉树(二叉搜索树的最小绝对差---Java)

《LeetCode力扣练习》代码随想录——二叉树&#xff08;二叉搜索树的最小绝对差—Java&#xff09; 刷题思路来源于 代码随想录 530. 二叉搜索树的最小绝对差 二叉树-中序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

hive词频统计---文件始终上传不来

目录 准备工作&#xff1a; 文件内容&#xff1a; 创建数据库及表 将文件上传到&#xff1a;上传到/user/hive/warehouse/db1.db/t_word目录下 hive里面查询&#xff0c;始终报错&#xff1a;&#xff08;直接查询也是不行&#xff09; 解决方案&#xff1a; 准备工作&am…

OPC UA遇见chatGPT

最近opc 基金会将召开一个会议&#xff0c;主题是”OPC UA meets IT“。由此可见&#xff0c;工业自动化行业也开始研究和评估chatGPT带来的影响了。 本文谈谈本人对OPC UA 与chatGPT结合的初步实验和思考。 构建OPC UA 信息模型 chatGPT 的确非常强大了&#xff0c;使用自然…

Stable Diffusion文生图技术详解:从零基础到掌握CLIP模型、Unet训练和采样器迭代

文章目录 概要Stable Diffusion 底层结构与原理文本编码器&#xff08;Text Encoder&#xff09;图片生成器&#xff08;Image Generator&#xff09; 那扩散过程发生了什么&#xff1f;stable diffusion 总体架构主要模块分析Unet 网络采样器迭代CLIP 模型 小结 概要 Stable …

C++设计模式:装饰器模式(四)

1、定义与动机 装饰器模式定义&#xff1a;动态&#xff08;组合&#xff09;地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少子类个数&#xff09;。 在某些情…

如何理解CDN?说说实现原理?

文章目录 一、是什么二、原理分析负载均衡系统缓存代理 三、总结参考文献 一、是什么 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络 构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内…

【开启自启动】软件设置开机自启动的相关问题

。 。 。 。 。 。 。 。 1、这个是设置开启自动启动的代码 //这个是设置开启自动启动的代码 #define REG_RUN_MANAGE "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run" //#define REG_RUN_MANAGE "HKEY_LOCAL_MACHINE\…

Wooden Toy Festival 题解

Wooden Toy Festival题解 题目在这 题目在这 题目在这 思路 &#xff1a; &#xff1a; &#xff1a; 二分&#xff0c;二分距离&#xff0c;首先肯定要排序&#xff0c;然后这题还得去一下重(因为题目说了"雕刻师们都是非常熟练的人&#xff0c;可以同时为不同的人完成…

成为一个ATE工程师是什么体验?

当你成为ATE工程师&#xff0c;是什么感受&#xff1f; 按照业内资深工程师的玩笑话来说&#xff1a;整的是比劳斯莱斯还贵的设备&#xff0c;更高端的机台顶得起上海几套房。 1、什么是ATE测试&#xff1f; 一颗芯片的生命周期始于市场需求&#xff0c;从产品的定义与设计&…

蓝桥杯-dfs搜索模板题(一)

蓝桥杯-dfs搜索模板题&#xff08;一&#xff09; P2089 烤鸡P1088 火星人P1149 火柴棒等式P2036 PERKETP1135 奇怪的电梯结语 P2089 烤鸡 对于每个位置枚举数字 #include<bits/stdc.h>using namespace std;const int N1010;int n;int arr[N];//临时方案 int res0;//方案…

蓝桥杯题目中的二分查找

前言 众所周知蓝桥杯会暴力&#xff0c;那么拿奖也是很轻松&#xff0c;甚至拿省一&#xff0c;有些题甚至直接用暴力就是对的&#xff0c;二分查找就是暴力中常用的算法&#xff0c;这篇文章就用蓝桥杯中的题目去介绍如何用二分查找去解题&#xff0c;对于二分查找的基础知识…

163 Linux C++ 通讯架构实战17,本地套接字整理对比,IPC:pipe,fifo,mmap,信号,本地套

IPC&#xff1a; Linux环境下&#xff0c;进程地址空间相互独立&#xff0c;每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程和进程之间不能相互访问&#xff0c;要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲…

并发编程三大特性之可见性

一、什么是可见性&#xff1f; 可见性问题是基于CPU位置出现的&#xff0c;cpu处里速度非常快&#xff0c;相对CPU来说去主内存 获取数据这个事情太慢了&#xff0c;CPU就提供了 L1&#xff0c;L2&#xff0c;L3的三季缓存&#xff0c;每次去主内存拿完 数据后&#xff0c;数据…

MBTI职业性格测试:发现你的内在力量,探索职业新世界!

MBTI简介 MBTI是根据荣格的心理类型理论著成&#xff0c;已经成为权威的性格测试。 MBTI&#xff08;Myers-Briggs Type Indicator&#xff09;&#xff0c;是一种迫选型、自我报告式的性格评估测试&#xff0c;用以衡量和描述人们在获取信息、作出决策、对待生活等方面的心理…

【从零到一手撕脚手架 | 第五节】自定义命令行下载cli工具

【从零到一手撕脚手架 | 第五节】自定义命令行下载cli工具 Hello大家好我是⛄&#xff0c;之前我们已经成功搭建了一套Vue3的快速开发模板&#xff0c;提高我们搭建新项目的效率&#xff0c;但是当我们的模板逐渐增多&#xff0c;如果依然使用git clone的方式去下载模板较为繁琐…

使用LIKE进行模糊查询

查询包含字符‘e’的信息 % 代表不确定个数的字符&#xff08;零个或多个&#xff09; SELECT employee_id, first_name FROM employees WHERE first_name LIKE %e%; 查询以字符‘e’开头的字符 SELECT employee_id, first_name FROM employees WHERE first_name LIKE e%; _…