无线通信——HC-05蓝牙模块学习笔记

在单片机的无线通信方面,HC-05蓝牙模块应该是使用最广泛,也是最方便的。

但目前网上关于hc05的资料有些杂乱,故在此做一个简单的整理方便后续使用,也希望能给大家提供一些帮助。

ps:本文仅涉及模块的使用,不包含原理。

一、使用准备

1、USB转TTL模块

HC-05在使用前需要用AT指令进行配置,要用USB转TTL模块连接电脑。

注意,使用USB转TTL需要下载CH340驱动,没有安装过的可以通过链接下载 提取码:nu5y

手头没有所以这里用下载器顶替一下。

2、串口调试工具

这里推荐windows系统商店里自带的免费串口调试助手,比较方便,也挺好用的。

3、常用AT指令 

指令名响应作用
ATOK测试指令发送是否正常
AT+RESETOK模块复位
AT+ORGLOK恢复出厂设置
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);
}
  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值