有关HC-05蓝牙模块的学习记录

2023-11-05


HC-05学习笔记

HC-05是一款不需要了解蓝牙通讯知识 便能应用在单片机上的模块,此文章将大概叙述如何应用HC-05实现手机控制单片机

图片源自网络

以下是本篇文章正文内容

一、HC-05的基本硬件介绍

HC-05共有六个引脚,分别为VCC、GND、Tx、Rx、STA和EN。

STA : 蓝牙连接状态指示,快闪表示没有蓝牙连接,慢闪表示进入AT模式,双闪表示蓝牙已连接并打开了端口

EN :使能端,需要进入AT模式时接3.3V(这里按住按键进入AT模式,而直接给EN端接3.3V进不去AT模式) 通过电平进入AT模式正确的做法应该是设置PIO11引脚的电平,而不是EN端的电平)

Rx : 与单片机的Tx引脚相连。

Tx :与单片机的Rx引脚相连。

VCC接5V GND接地。

二、工作原理

纯属本小白个人理解

HC-05作为一个模块,将他与单片机相连之后单片机就变成了一个拥有蓝牙功能的机器,它可以将蓝牙收发数据的复杂完全隐蔽,转化为较为简单的串口通信,通过单片机与它的串口通信,使得我们的单片机看起来拥有了蓝牙通讯功能。实际使用中我们完全不必了解复杂的蓝牙协议,只需要了解如何与该模块进行串口通信即可。


三、使用方法

一、硬件连接

这里VCC、GND连接到相应IO口即可
Rx选择连接PA2
Tx选择连接PA3
PIO11选择连接PC4
STA选择连接PA4


二、软件控制

1.第一个片段

PA2与PA3对应的是串口2的发送端口与接收端口
因此我们采用串口2进行数据的发送与接收
这里我给出白嫖的代码片段

void u2_printf(char* fmt,...)  
{  
	va_list ap;
	va_start(ap,fmt);
	vsprintf((char*)USART2_TX_BUF,fmt,ap);
	va_end(ap);
	while(DMA_GetCurrDataCounter(DMA1_Channel7)!=0);	 
	UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF)); 	//通过DMA发送
}

va_list为一种参数形式 追根溯源,其类型还是char
va_start()函数可以找到fmt这个字符串中对应ap所代表的多个参数的地址。
va_end()函数为清空ap这个参数列表

这里有两个知识点
1.vsprintf()函数的使用
vsprintf()函数:将可变参数列表的格式化数据写入字符串
举例:int vsprintf (char * s, const char * format, va_list arg );
对于这个语句,其作用为 运用va_list类型的指针arg将format所代表的一堆不确定长度以及类型的字符串加载到大字符串s中。

同时可以拓展一下sprintf()函数,这两个函数的应用类似
sprintf()函数:将一个格式化的字符串输出到一个目的字符串中。他与vsprintf()的区别就是前者的入口参数可以多个,但是后者只有三个。

2.DMA通讯:DMA直接翻译过来为direct memory access就是直接记忆传输,不需要cpu的处理,直接用DMA模块传输到另一个存储器上。具体的使用方法可以参考网上的视频,其实质就是一个串口通信,但其具有不占用cpu的优点,降低了cpu的工作压力,提升cpu幸福指数。

这里为什么要采用va_等等有关宏的运算,本小白也有一点自己的理解
从u2_printf()这个函数的入口参数可以看到,入口参数的最后部分是个没有确定个数的参数(省略号代表了可以输入多个参数),为了达到这个目的,我们需要用到va_list类型的指针,再运用va_start()宏以及vsprintf()函数来确定参数的长度,从而使得我们的函数可以有一个不确定数量的参数入口。

对于这样的 入口参数不限制个数的 函数,大部分都是使用va_list 、va_start 、va_end来达成这种效果。

这样做的好处当然非常明显,对于单片机的使用过程中,传输的数据结构将变得更加多元,不必确定参数类型,可以让我们的串口直接发出类似Vanilla.044这种混合类型的字符串。


2.第二个片段

void TIM4_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
	{	 			   
		USART2_RX_STA|=1<<15;	
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
		TIM4_Set(0);
	}	    
}

在整个过程中还运用一个定时器4来进行定时器中断
其作用就是不断判断串口2发送的数据有没有结束,他说一个时间,10ms,没有再次接收到数据就默认数据传输完成了。


四、具体应用

一.信息的传送

这里我以单片机发送数据到手机举例
给出以下主函数片段

if(sendmask)					
			{
				sprintf((char*)sendbuf,"ALIENTEK HC05 %d\r\n",sendcnt);
	  			LCD_ShowString(30+40,160,200,16,16,sendbuf);		
				u2_printf("ALIENTEK HC05 %d\r\n",sendcnt);		
				sendcnt++;
				if(sendcnt>99)sendcnt=0;
			}

此处sendmask为一个判断是发出消息还是暂停发消息的参数,当其值非零时进入该片段函数。
sprintf()函数将要发送的数据sendcnt替换绿色代码里的%d然后存储在char类型的字符串sendbuf中
LCD显示函数显示sendbuf,u2_printf函数将数据通过串口2发送给蓝牙模块从而使数据到达手机。

这里的数据是从电脑通过串口连接发送给的单片机,实际使用中可以直接运用单片机相连的模块所产生的数据,来达到手机与机器互传数据的目的。

二.手机操纵单片机

这里给出一段代码

reclen=USART2_RX_STA&0X7FFF;
		  	USART2_RX_BUF[reclen]=0;	 	
			if(reclen==9||reclen==8) 	
			{
				if(strcmp((const char*)USART2_RX_BUF,"+LED1 ON")==0)LED1=0;	
				if(strcmp((const char*)USART2_RX_BUF,"+LED1 OFF")==0)LED1=1;
			}

这里reclen为判断接受到的数据长度,如果长度等于9或者等于8,则再进行判断是否为+LED ON或者+LED OFF,从而控制LED的亮与灭。

实际应用中,可以控制任何你想控制但是前提是你会控制的IO口或者模块。


五、注意事项

一、AT状态

AT状态可以查询我们的设备名称设备状态等等信息,可以通过AT指令的发送与接收情况判断我们的蓝牙连接是否成功。
对于HC-05有两种方式进入AT状态:

1.第一种方法

上电同时或者上电之前将KEY接VCC,上电后,模块就进入AT模式。

2.第二种方法

上电之前PIO11并没有连接VCC,模块上电之后再将PIO11连接VCC,此时就进入了AT模式。
没有将PIO11连接到VCC上之前是蓝牙连接模式。

OS:第一种方法进入的AT模式波特率为38400,而第二种方法进入的AT模式波特率与通信波特率一致。

二、连接方式

HC-05模块须使用TTL信号,所以应适当添加USB转TTL模块。

三、代码

对于不同的开发板,应该注意接口的数量,我这里使用的为正点原子的STM32mini板,接口相对充足,而C8T6这种小板子,则需要根据IO口数量合理选择串口以及定时器的使用,尤其是还需要LCD或者OLED 屏幕显示的时候更应该好好分配。

六、总结

在学习HC-05的过程让我更多的了解了一部分有关mini板的知识。
对于PA9、PA10这两个引脚,之所以在这两个引脚上加跳线帽,是因为Rx与Tx连接到板载的CH340G芯片,并且PA9、PA10对应芯片的串口1,通过串口1的作用,才使得我们的mini板子可以用USB烧录程序。

其次还了解了vsprintf()、va_list、va_start()、va_end的大致作用,并大致了解了如何写出入口参数不限制个数的函数。

蓝牙模块的可用性还是很高的,对外设与单片机互通提供了更多可能。

写在最后

本人小白一枚,这些仅仅是我个人的经验与认知,也许含有多处错误,希望读者给我指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有关HC-05蓝牙模块的学习记录 的相关文章

随机推荐

  • elasticsearch地理位置总结

    参考 https blog csdn net tang jian dong article details 104446526 https blog csdn net u013041642 article details 94416631
  • linux内核编译问题解决方法

    在linux内核编译过程中 可能会遇到有些文件没有的可能 下面是我用gcc4 6 2编译linux2 6 30 5内核过程中提示的错误 gcc error elf i386 No such file or directory OBJCOPY
  • linux下select()函数

    1 I O处理的模型有5种 1 gt 阻塞I O模型 在这种模型下 若所调用的I O函数没有完成相关的功能 则会使进程挂起 直到相关数据到达才会返回 如常见的对管道 终端 网络设备进行读写时经常会出现这种情况 2 gt 非阻塞I O模型 在
  • Python——基础学习xpath(爬虫)

    python三种解析方法 1 正则 2 bs4 3 xpath Python xpath解析 xpath解析是最常用且最便捷高效的一种解析方法 通用性最强 xpath解析原理 1 实例一个etree的对象 且需要将被解析的页面的源码数据加载
  • 转载,envi对高光谱进行辐射定标和大气校正

    原文地址 http blog sina com cn s blog 764b1e9d0102v59e html 目录 辐射定标和大气校正 概述 辐射定标 多光谱数据FLAASH大气校正 3 1 FLAASH输入数据要求 3 2 详细操作步骤
  • 去除list of list中的引号与括号

    经常分词后是List of list的结构 输出后会存在很多引号与方括号 它其实是一个list的嵌套结构 可以通过将内层的List转化为str再放入新的list中实现转化 a 我要发 SCI 然后 去 四川大学 读博士 result for
  • Laya 实操十七:物理引擎

    物理引擎 export default class test extends Laya Script constructor super Laya Scene3D load res LayaScene SampleScene Convent
  • Python清洗数据具体操作

    数据清洗是指在处理数据之前对数据进行预处理的过程 这个过程通常包括检查数据的完整性 清除数据中的缺失值 异常值和重复值 以及对数据进行格式转换和数据转换等 在 Python 中 可以使用 pandas 库来方便地进行数据清洗 下面是一些常见
  • Android 禁止RecycleView的滑动

    1 问题 使用RecycleView 时 如果数据量很少只有几个 需求不需要它上下左右滑动 在xml配置中加上Android scrollbars none 这只是去掉了滑动bar 但是RecycleView 上下还是能滑动 且有阴影 2
  • 【message:发生错误 Error: D:\微信小程序\second-demo\package.json 对应的 node_modules 不存在】

    微信小程序安装vant weapp报 node module不存在 提示 这里简述项目相关背景 想使用vant weapp写小程序 在安装的时候踩了一些坑 记录一下 1 安装 vant weapp 提示 这里一个一个来描述遇到的问题 我是根
  • 网络驱动程序snull

    由于下次开会要做报告 所以就先把字符设备驱动程序那块搁浅了 先来复习下网络驱动这块 虽然以前看过 学习过网络驱动的相关内容 但是当再次学习这块的时候 仍然有新的收获 或许是时间长不看了 有些东西的印象浅了 或者应了那句话 温故而知新 ok
  • 多线程能有事务吗?

    需求 多线程插入 保证原子性 要么都成功 要么都失败 其中一个线程报错 所有线程回滚 为什么做不了 首先事务的四大特性 ACID 特性都知道吧 面试中张口就来 原子性 Atomicity 一个事务要么全部提交成功 要么全部失败回滚 不能只执
  • SpringFramework核心技术五:面向切面编程(AOP)和代理机制

    AOP与代理 Spring AOP使用JDK动态代理或CGLIB为给定目标对象创建代理 只要有选择 JDK动态代理就是首选 一 代理机制 如果要代理的目标对象实现至少一个接口 则将使用JDK动态代理 目标类型实现的所有接口都将被代理 如果目
  • socket异步编程--libevent的使用

    http www cnblogs com cnspace archive 2011 07 19 2110891 html 这篇文章介绍下libevent在socket异步编程中的应用 在一些对性能要求较高的网络应用程序中 为了防止程序阻塞在
  • Spring Boot集成RocketMq(一看就会)

    目录 1 创建topic 2 新建Spring boot项目 3 导入依赖 4 配置yml文件 5 新建Controller 生产服务 6 新建消费者 7 配置类 定义topic 8 添加消息以及 消费者查看 8 1 调用接口 往Mq中添加
  • 岛屿数量(Java)

    分析 把1当成陆地 0当成海 简单来说只要上下左右如果是1的话就可以看成一个陆地 从示例中也可以很清楚的看懂 思路 用一个和grid大小一样的整型二维数组arr来代表岛屿的生成过程 遍历grid 如果遇到grid i j 1 arr i j
  • 软件生命周期与技术人的职业周期

    话题有点大 但还是忍住想说两句 也算把自己曾经的困惑落在纸上 做个记录 什么是软件的生命周期的 相信你能比我还熟练的罗列出来 从初步规划 到需求分析 再到系统设计 接着系统实现 往下系统测试 跟着发布部署 最后运行维护 中途免不了打些小补丁
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • python国内镜像源

    让python pip使用国内镜像 国内源 清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pyp
  • 有关HC-05蓝牙模块的学习记录

    文章目录 HC 05学习笔记 一 HC 05的基本硬件介绍 二 工作原理 三 使用方法 一 硬件连接 二 软件控制 1 第一个片段 2 第二个片段 四 具体应用 一 信息的传送 二 手机操纵单片机 五 注意事项 一 AT状态 1 第一种方法