做一个小项目的原因,需要使用无线传输数据,实现双向通信。恰好实验室有几对蓝牙模块,就用了这个模块。本来为了图快速实现功能,直接使用了正点原子的蓝牙例程,总是显示检测不到蓝牙模块。被坑了一天也总算弄出来了,在此记录自己调试笔记。方便以后调试自己调试说明。这里我选用的是蓝牙模块HC-05主从一体蓝牙模块。
如下是选用的蓝牙模块
1. 硬件连接
VCC: 接电源的正极(这里需要接+5V)
GND:接电源的负极
RXD:接收端,蓝牙模块接收从其他设备发来的数据;正常情况接其他设备的发送端TXD
TXD: 发送端,蓝牙模块发送数据给其他设备;正常情况接其他设备的发送端RXD
STATE:状态端
EN:使能端,需要进入AT模式时接3.3V(需要注意的是这里是按住按键进入AT模式,而直接给EN端接3.3V是进不去AT模式的,后面原理图会分析原因)
(通过电平进入AT模式正确的做法应该是设置PIO11引脚的电平,而不是EN端的电平)
2. 进入AT模式
USB转TTL和蓝牙模块连接好后,插上电脑。进入AT模式的两种方法。
方法一:先按住按键不放,再给模块上电。此时LED 2S闪一次,进入AT模式。波特率固定为38400。
方法二:模块直接上电。此时LED灯快闪(1s两次)。再按下按键,模块也会进入AT指令,此时LED还是快闪。这个时候的波特率和自己设置的一样,默认为9600。1位停止位,无奇偶校验。
在文档上说可以听过给EN脚高电平直接进入AT模式。但是自己实际测试,进不了。最后我直接用万用表测量EN脚悬空的电平,有4.0V。查看原理图,折腾了半天也没通过单片机直接给EN脚电平进入AT指令状态。经过分析原理图也发现了一些问题
当VCC接5V时,EN脚悬空由分压原理,可以看出EN脚差不多也是4V多。当EN脚接低电平时,CE电压为0。IC电源芯片都没有使能,所以没有3.3V电压输出,当然蓝牙模块也没有工作。所以通过设置EN端电平进入AT模式这种说法是错误的。应该是通过设置PIO11脚的高低电平进入AT模式才是正确的。
这也是我直接拿这个模块用正点原子蓝牙历程,总是显示检测不到模块的原因。因为根本单片机根本就没有让这个模块进入AT模式。为什么正点原子的蓝牙模块可以呢?
一起看看它的原理图。
为什么人家可以通过单片机设置进入AT模式,人家直接通过操作BS KEY引脚(相当于PIO11脚),当然可以直接AT进入咯。
所以拿到这个模块怎么办呢?两种方法
第一种:自己把PIO11引脚自己引出来,这样就可以通过单片机进去AT模式。设置相应的参数了。
第二种:自己在电脑串口上把两个模块的参数设置好,然后直接拿来通信。
下面详细讲解第二种方法:
进入AT指令模式后。
串口调试助手中一定要勾上发送新行,才会在发送字符后面添加\r\n 。不然每次就自己添加
1.测试通信是否有问题
发送: AT
返回:OK
2.设置波特率
发送:AT+UART=115200,0,0 (详细意义看它的AT指令集即可)
返回:OK
查询波特率:
发送:AT+UART?
返回:+UART=115200,0,0
OK‘’
3.设置蓝牙的名称和密码
发送:AT+NAME=xxx(默认名称HC-05)
返回:OK
这里使用AT+NAME?是查询不到名字的
设置密码
发送:AT+PSWD=XXXXXX
返回:OK
AT+PSWD?查询密码
注意(两个模块通信时,设置好主从模块后,他们的密码必须一样)
4.设置/查询—模块角色
这里设置两个相互通信的蓝牙模块,一个设置为从角色,一个设置为主角色。
5.设置/查询——连接模式
发送:AT+CMODE=0
返回:OK
两个模块都设置为指定蓝牙地址连接
6.获取远程蓝牙的名称以及地址
两个模块主从角色,分别获到自己的地址。记录下地址,以便于下一步的相互绑定蓝牙地址
7.设置/查询——绑定蓝牙地址:
这里需要注意的是相互绑定地址。
比如:从机绑定主机的地址,主机绑定从机的地址。
这里仅举例:使用从模块绑定主模块的地址。
已知:主模块地址为98d3:31:4046ca
从模块绑定主模块地址
指令: AT+BIND=98d3,31,4046ca (绑定时,需要把获取的地址的:改为 ,符号)
返回:OK
完成以上步骤即可,就设置好了。接下来只需要通过串口发送接收数据就可以进行蓝牙发送接收数据。