HC-05嵌入式蓝牙串口通讯

来源:互联网 发布:传智软件科技有限公司 编辑:程序博客网 时间:2024/05/16 18:51

1.简介

HC05 模块,是 ALIENTEK 生成的一款高性能主从一体蓝牙串口模块,可以同各种带
蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP 等智能终端配对,该模块支持非常宽的波特
率范围:4800~1382400,并且模块兼容 5V 或 3.3V 单片机系统,可以很方便与您的产品进行
连接。使用非常灵活、方便。

原理图:


2.AT指令与工作模式

HC-05 嵌入式蓝牙串口通讯模块(以下简称模块)具有两种工作模式:命令响应工作
模式和自动连接工作模式,在自动连接工作模式下模块又可分为主(Master)、从(Slave)
和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定
的方式连接的数据传输;当模块处于命令响应工作模式时能执行下述所有 AT 命令,用户可
向模块发送各种 AT 指令,为模块设定控制参数或发布控制命令。通过控制模块外部引脚
(PIO11)输入电平,可以实现模块工作状态的动态转换。

串口模块用到的引脚定义:
1、PIO8 连接 LED,指示模块工作状态,模块上电后闪烁,不同的状态闪烁间隔不同。
2、PIO9 连接 LED,指示模块连接成功,蓝牙串口匹配连接成功后,LED 长亮。
3、PIO11 模块状态切换脚,高电平-->AT 命令响应工作状态,低电平或悬空-->蓝牙常规工
作状态。
4、模块上已带有复位电路,重新上电即完成复位。
设置为主模块的步骤:
1、PIO11 置高。
2、上电,模块进入 AT 命令响应状态。
3、超级终端或其他串口工具,设置波特率 38400,数据位 8 位,停止位 1 位,无校验位,
无流控制。
4、串口发送字符“AT+ROLE=1\r\n”,成功返回“OK\r\n”,其中\r\n 为回车换行。
5、PIO 置低,重新上电,模块为主模块,自动搜索从模块,建立连接。

对于AT指令非常多,具体请查看HC05蓝牙指令集,这里只是列出几个常用的指令



3.HC05的使用

接下来我们用STM32来对HC05进行配置与通信的实现

初始化:

//初始化HC05模块
//返回值:0,成功;1,失败.
u8 HC05_Init(void)
{
u8 retry=10,t;   
u8 temp=1;
RCC->APB2ENR|=1<<4;    //使能PORTC时钟
  GPIOC->CRL&=0XFF00FFFF;//PC4,推挽输出;PC5,输入
GPIOC->CRL|=0X00830000; 
GPIOC->ODR|=1<<5; //PC5上拉   
USART2_Init(36,9600);//初始化串口2为:9600,波特率.
while(retry--)
{
HC05_KEY=1; //KEY置高,进入AT模式
delay_ms(10);
u2_printf("AT\r\n");//发送AT测试指令
HC05_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<10;t++) //最长等待50ms,来接收HC05模块的回应
{
if(USART2_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART2_RX_STA&0X8000)//接收到一次数据了
{
temp=USART2_RX_STA&0X7FFF;//得到数据长度
USART2_RX_STA=0; 
if(temp==4&&USART2_RX_BUF[0]=='O'&&USART2_RX_BUF[1]=='K')
{
temp=0;//接收到OK响应
break;
}
}    
}    
if(retry==0)temp=1;//检测失败
return temp;  
}

通过AT模式来判断是否有蓝牙存在

//获取HC05模块的角色
//返回值:0,从机;1,主机;0XFF,获取失败.  
u8 HC05_Get_Role(void)
{    
u8 retry=0X0F;
u8 temp,t;
while(retry--)
{
HC05_KEY=1; //KEY置高,进入AT模式
delay_ms(10);
u2_printf("AT+ROLE?\r\n");//查询角色
for(t=0;t<20;t++) //最长等待200ms,来接收HC05模块的回应
{
delay_ms(10);
if(USART2_RX_STA&0X8000)break;
}
HC05_KEY=0; //KEY拉低,退出AT模式
if(USART2_RX_STA&0X8000)//接收到一次数据了
{
temp=USART2_RX_STA&0X7FFF;//得到数据长度
USART2_RX_STA=0; 
if(temp==13&&USART2_RX_BUF[0]=='+')//接收到正确的应答了
{
temp=USART2_RX_BUF[6]-'0';//得到主从模式值
break;
}
}
}
if(retry==0)temp=0XFF;//查询失败.
return temp;
}

通过AT指令来判断是什么模式

//ATK-HC05设置命令
//此函数用于设置ATK-HC05,适用于仅返回OK应答的AT指令
//atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
//返回值:0,设置成功;其他,设置失败.  
u8 HC05_Set_Cmd(u8* atstr)
{    
u8 retry=0X0F;
u8 temp,t;
while(retry--)
{
HC05_KEY=1; //KEY置高,进入AT模式
delay_ms(10);
u2_printf("%s\r\n",atstr);//发送AT字符串
HC05_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<20;t++) //最长等待100ms,来接收HC05模块的回应
{
if(USART2_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART2_RX_STA&0X8000)//接收到一次数据了
{
temp=USART2_RX_STA&0X7FFF;//得到数据长度
USART2_RX_STA=0; 
if(temp==4&&USART2_RX_BUF[0]=='O')//接收到正确的应答了
{
temp=0;
break;  
}
}
}
if(retry==0)temp=0XFF;//设置失败.
return temp;

通过AT模式来设置主从模式

void HC05_Sta_Show(void)
{  
if(HC05_LED)LCD_ShowString(120,140,120,16,16,"STA:Connected ");//连接成功
else LCD_ShowString(120,140,120,16,16,"STA:Disconnect");//未连接  
}

#define HC05_LED  PCin(5) //蓝牙连接状态信号

通过PIO9 来判断是否连接

接收和发送都是用STM32的串口

蓝牙的通讯协议则与串口类似,其实就是将数据通过串口传给MCU处理。



0 0
原创粉丝点击