完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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 %drn",sendcnt); LCD_ShowString(30+40,160,200,16,16,sendbuf); u2_printf("ALIENTEK HC05 %drn",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的大致作用,并大致了解了如何写出入口参数不限制个数的函数。 蓝牙模块的可用性还是很高的,对外设与单片机互通提供了更多可能。 |
|
|
|
只有小组成员才能发言,加入小组>>
2555 浏览 0 评论
1153浏览 2评论
752浏览 1评论
505浏览 0评论
269浏览 0评论
436浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 17:38 , Processed in 1.325629 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号