简介
HC-05 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的
数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm,接收灵敏度-85dBm,板载 PCB 天线,可以实现 10 米距离通信。
模块有6个IO口,别分是VCC(3.3-6V),GND,TX,RX,AT,State。
与单片机连接用uart通讯,全双工。
工作方式有2种:AT指令模式,透传模式。
使用方式
按着模块key键上电,等待模块指示灯慢闪进入模块AT模式,松开手指,模块指示灯慢闪,波特率38400,要用资料提供的串口工具如XCOM,我的友善串口助手发送的数据都没有反应,发送对应AT指令得到响应
重新上电模块,不按按键,模块指示灯快闪,1s闪烁2次,模块进入配对透传模式。利用HC的蓝牙助手连接上模块(尽量使用官方工具调试,本人利用其他第三方工具很多搜索不到),将PC端的串口波特率设置为9600,这是透传模式的波特率。连接上后主从端可以互相发送数据。
连接说明
HC-05 模块用于代替全双工通信时的物理连线。左边的设备向模块发送串口数据,模块的 RXD 端口收到串口数据后,自动将数据以无线电波的方式发送到空中。右边的模块能自动接收到,并从 TXD 还原最初左边设备所发的串口数据。从右到左也是一样的。
AT指令集
1,AT+ROLE设置主从模式: AT+ROLE?是查询主从状态;AT+ROLE=1是设成主,AT+ROLE=0是设成从,AT+ROLE=2设成回环角色(Slave-Loop(回环角色)——被动连接,接收远程蓝牙主设备数据并将数据原样返回给远程蓝牙)。
2,AT+RESET:HC-05复位
3,AT+VERSION?:获取HC-05的软件版本号,只能获取,不能修改。
4,AT+ORGL:恢复出厂默认设置,当把模块设置乱了,使用此命令进行恢复默认值。
5,AT+ADDR?:获取HC-05的蓝牙地址码,只能获取,不能修改。
6,AT+NAME?:获取HC-05的名字,AT+NAME=BSP-06,修改模块的名字为BSP-06,具体名字自行修改。
7,AT+CLASS?:设置查询设备的类型,尽量不要去修改此参数。默认是1F00。
8,AT+IAC?:查询设置查询访问码,默认是9E8B33,尽量不要去修改此参数。
9,AT+PSWD?:查询设置配对密码,AT+PSWD=”0000”,密码要有双引号,密码是四位数字.
10, AT+UART:AT+UART?是查询当前模块的波特率,AT+UART=波特率是设置.
11, AT+CMODE:AT+CMODE?是查询当前连接模式。AT+CMODE=0,1,2(0——指
定蓝牙地址连接模式(指定蓝牙地址由绑定指令设置)1——任意蓝牙地址连接模式(不受绑定指令设置地址的约束)2——回环角色(Slave-Loop)默认连接模式:0)。
12, AT+BIND:AT+BIND?查询当前绑定地址,AT+BIND=NAP,UAP,LAP(用逗号隔开)。
13, AT+RMADD:从蓝牙配对列表中删除所有认证设备.
14, AT+STATE?:获取蓝牙模块工作状态.
15, AT+LINK=NAP,UAP,LAP:与远程设备建立连接。
16, AT+DISC:断开连接.
17, AT+RNAME?NAP,UAP,LAP:获取远程蓝牙设备名称.
18, AT+ADCN?:获取蓝牙配对列表中认证设备数。
19, AT+MRAD?获取最近使用过的蓝牙认证设备地址。
20, AT+INQM:设置查询模式,AT+INQM=1,9,48(1-带RSSI信号强度指示,9-超过9个
蓝牙设备响应则终止查询,48-设定超时为48*1.28=61.44秒)
实战:透传控制LED灯
/**
* @brief 初始化控制LED的IO
* @param 无
* @retval 无
*/
void HC05_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIO时钟*/
RCC_AHB1PeriphClockCmd( BLT_INT_GPIO_CLK|BLT_KEY_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = BLT_INT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(BLT_INT_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = BLT_KEY_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(BLT_KEY_GPIO_PORT, &GPIO_InitStructure);
}
/*
* 函数名:USARTx_Config
* 描述 :USART GPIO 配置,工作模式配置
* 输入 :无
* 输出 : 无
* 调用 :外部调用
*/
void BLT_USART_Config(u16 BaudRate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(BLT_USART_GPIO_CLK, ENABLE);
/* config USART clock */
RCC_APB1PeriphClockCmd(BLT_USART_CLK, ENABLE);
/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(BLT_USART_TX_PORT,BLT_USART_TX_SOURCE, BLT_USART_TX_AF);
/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(BLT_USART_RX_PORT,BLT_USART_RX_SOURCE,BLT_USART_RX_AF);
/* USARTconfig */
/* Configure USART as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = BLT_USART_TX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(BLT_USART_TX_PORT, &GPIO_InitStructure);
/* Configure USART as input floating */
GPIO_InitStructure.GPIO_Pin = BLT_USART_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(BLT_USART_RX_PORT, &GPIO_InitStructure);
/* USART mode config */
USART_InitStructure.USART_BaudRate = BaudRate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(BLT_USARTx, &USART_InitStructure);
/* 配置中断优先级 */
NVIC_Configuration();
/* 使能串口接收中断 */
USART_ITConfig(BLT_USARTx, USART_IT_RXNE, ENABLE);
//使能串口总线空闲中断
USART_ITConfig (BLT_USARTx, USART_IT_IDLE, ENABLE );
USART_Cmd(BLT_USARTx, ENABLE);
USART_ClearFlag(BLT_USARTx, USART_FLAG_TC);
}
/***************** 发送一个字符 **********************/
static void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
{
/* 发送一个字节数据到USART1 */
USART_SendData(pUSARTx,ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/***************** 发送指定长度的字符串 **********************/
void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen )
{
unsigned int k=0;
do
{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while(k < strlen);
}
/***************** 发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
{
unsigned int k=0;
do
{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while(*(str + k)!='\0');
}
//获取接收到的数据和长度
char *get_rebuff(uint16_t *len)
{
*len = BLT_USART_ReceiveData.datanum;
return (char *)&BLT_USART_ReceiveData.uart_buff;
}
//清空缓冲区
void clean_rebuff(void)
{
uint16_t i=UART_BUFF_SIZE+1;
BLT_USART_ReceiveData.datanum = 0;
BLT_USART_ReceiveData.receive_data_flag = 0;
while(i)
BLT_USART_ReceiveData.uart_buff[--i]=0;
}
/**
* @brief 初始化GPIO及检测HC05模块
* @param 无
* @retval HC05状态,0 正常,非0异常
*/
uint8_t HC05_Init(u16 BaudRate)
{
uint8_t i;
HC05_GPIO_Config();
BLT_USART_Config(BaudRate);
BLT_KEY_HIGHT;
for(i=0;i<BLTDEV_MAX_NUM;i++)
{
sprintf(bltDevList.unpraseAddr[i]," ");
sprintf(bltDevList.name[i]," ");
}
bltDevList.num = 0;
return HC05_Send_CMD("AT\r\n",1);
}
void control_led_func(void)
{
/* 处理蓝牙串口接收到的蓝牙数据 */
if(BLT_USART_ReceiveData.receive_data_flag == 1)
{
BLT_USART_ReceiveData.uart_buff[BLT_USART_ReceiveData.datanum] = 0;
//串口助手显示接收到的数据
Usart_SendString( DEBUG_USART, "\r\nrecv HC-05 data:\r\n" );
Usart_SendString( DEBUG_USART, BLT_USART_ReceiveData.uart_buff );
Usart_SendString( DEBUG_USART, "\r\n" );
if( strstr((char *)BLT_USART_ReceiveData.uart_buff,"1") == (char *)BLT_USART_ReceiveData.uart_buff )
{
LED1_TOGGLE;
}
//清零蓝牙串口数据缓存
BLT_USART_ReceiveData.receive_data_flag = 0; //接收数据标志清零
BLT_USART_ReceiveData.datanum = 0;
}
}