在单片机的无线通信方面,HC-05蓝牙模块应该是使用最广泛,也是最方便的。
但目前网上关于hc05的资料有些杂乱,故在此做一个简单的整理方便后续使用,也希望能给大家提供一些帮助。
ps:本文仅涉及模块的使用,不包含原理。
一、使用准备
1、USB转TTL模块
HC-05在使用前需要用AT指令进行配置,要用USB转TTL模块连接电脑。
注意,使用USB转TTL需要下载CH340驱动,没有安装过的可以通过链接下载 提取码:nu5y
手头没有所以这里用下载器顶替一下。
2、串口调试工具
这里推荐windows系统商店里自带的免费串口调试助手,比较方便,也挺好用的。
3、常用AT指令
指令名 | 响应 | 作用 |
---|---|---|
AT | OK | 测试指令发送是否正常 |
AT+RESET | OK | 模块复位 |
AT+ORGL | OK | 恢复出厂设置 |
AT+ADDR? | +ADDR:<Param> OK | 获取蓝牙地址 |
AT+PSWD? | +PSWD:<Param> OK | 获取模块密码 |
AT+PSWD=<Param> | OK | 设置模块密码 |
AT+UART? | +UART:<Param1>,<Param2>,<Param3> OK | 获取模块参数 |
AT+UART=<Param1>,<Param2>,<Param3> | OK | 设置模块参数 |
AT+ROLE? | +ROLE:<Param> OK | 查询模块主从模式 |
AT+ROLE=<Param> | OK | 设置模块主从模式 |
AT+CMODE? | +CMODE:<Param> OK | 查询模块连接模式 |
AT+CMODE=<Param> | OK | 设置模块连接模式 |
AT+ BIND? | +BIND:<Param> OK | 查询蓝牙绑定地址 |
AT+BIND=<Param> | OK | 设置蓝牙绑定地址 |
4、AT指令参数说明
1、AT+UART指令
Param1:波特率 ,建议设置115200,或使用出场设置,通常为9600
Param2:停止位,0--1位,1--2位,一般设为0
Param3:校验位,0--None,1--Odd,2--Even,一般设为0
2、AT+ROLE指令
Param:0--从机,1--主机,2--回环角色,默认值为0
3、 AT+CMODE指令
Param:0--指定蓝牙连接模式,由绑定地址设置指定蓝牙
1--任意蓝牙连接模式,无绑定地址
2--回环角色
默认为0
二、蓝牙模块配置
蓝牙模块工作时分为两种模式,命令响应工作模式和自动连接工作模式,在自动连接模式下,蓝牙会按设定好的方式进行配对,配置蓝牙时,我们需要进入命令响应工作模式以执行AT指令。进入命令响应工作模式有两种方法:
1、HC-05带有一个按键,按住按键后上电自动进入命令响应工作模式,此时指示灯慢闪,约两秒翻转一次
2、正常上电,每发送一次AT指令,将PIO11置高一次,也就是按一次按键
通常我们使用第一种方法,比较方便。进入命令响应工作模式后就要根据使用场景进行配置。
1、在两个HC-05间配对
打开串口调试助手,将波特率、校验位等设置为命令响应工作模式默认值,波特率为38400
选择正确端口并打开,在发送区输入AT并发送,若接收区返回OK说明串口通信正常。
注意:AT指令后面必须加上回车,也就是每一条指令都包括两行,第一行是指令本身,第二行是回车
接下来进行两个蓝牙模块的配置
1、让蓝牙A、B进入AT模式并连接到串口助手
2、把两个蓝牙恢复出厂设置 AT+ORGL
3、修改A、B的模块密码 AT+PSWD=xxxx 四位,A、B的密码必须相同
4、配置A为主模式 AT+ROLE=1
5、配置B为从模式 AT+ROLE=0
6、配置A为指定蓝牙地址连接 AT+CMODE=0
7、查询B的蓝牙地址 AT+ADDR? 得到B地址为98D3:31:F7231D
8、将A绑定B AT+BIND=98D3,31,F7231D 注意将冒号改为逗号
9、将AB重新上电,上电后指示灯进行两秒周期的双闪则表示配对成功
也可以选择不用指定地址配对,只需给AB设置同样的模块密码,并将两个模块的连接模式均设为任意蓝牙连接模式,这样两个模块也能进行配对,但需要等待较长时间才能配对成功,有时候会长时间无法配对,因此这里建议大家使用地址配对。
再次提醒,每一条指令后面都要加上回车和换行
2、蓝牙串口调试助手与蓝牙模块配对
蓝牙模块与手机的连接就没有这么多步骤了,只需用AT指令修改模块密码,然后在蓝牙串口调试助手上搜寻蓝牙模块进行连接就行了。
当然,如果你是尊贵的苹果用户(bushi,你也可以选择在电脑上下一个蓝牙调试助手,亲测比苹果AppStore里那些乱七八糟的蓝牙调试助手好用多了,苹果商店里那些我当时用根本就搜不到HC-05......
我当时用的是这一个windows商店的蓝牙调试助手,挺好用的,就是需要购买,不过有7天试用。
三、远程通信实现
HC-05这个模块的原理,说白了就是将两个串口进行远程通信,就是将A串口接收的单片机信息通过蓝牙发送出去,再由从机接收到后通过串口与单片机通信。所以本质上跟串口通信是没有区别的,只要学会串口通信,就能使用了。
串口通信是单片机入门内容之一,这里就简单贴一段32标准库的代码供大家参考。
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include <stdarg.h>
void Serial_Init(void) //串口配置
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void Serial_SendByte(uint8_t Byte) //按位发送数据
{
USART_SendData(USART1, Byte);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Array[i]);
}
}
void Serial_SendString(char *String) //发送字符串
{
uint8_t i;
for (i = 0; String[i] != '\0'; i ++)
{
Serial_SendByte(String[i]);
}
}
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while (Y --)
{
Result *= X;
}
return Result;
}
void Serial_SendNumber(uint32_t Number, uint8_t Length) //发送数字
{
uint8_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
}
}
int fputc(int ch, FILE *f) //串口重定向
{
Serial_SendByte(ch);
return ch;
}
void Serial_Printf(char *format, ...)
{
char String[100];
va_list arg;
va_start(arg, format);
vsprintf(String, format, arg);
va_end(arg);
Serial_SendString(String);
}