系列文章目录
STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯
STM32CubeIDE(CUBE-MX hal库)----按键控制
STM32CubeIDE(CUBE-MX hal库)----串口通信
STM32CubeIDE(CUBE-MX hal库)----定时器
前言
HC-05是一种常用于无线通信的蓝牙模块,它提供了便捷的蓝牙连接和数据传输解决方案,只需要串口就可以进行数据的发送与接收。该模块具有简单易用的特性,适用于各种电子设备和嵌入式系统。
一、蓝牙配置
HC-05蓝牙模块有两个模式一个是AT模式,一个是透传模式。
- AT模式是配置模式,允许用户通过串口发送AT指令与模块进行交互,配置蓝牙模块的参数,例如蓝牙名称、波特率、PIN码等。使用场景: 在AT模式下,用户可以通过串口终端或者其他设备向蓝牙模块发送AT指令,进行初始化配置。这种模式通常用于设备的初始化阶段,用于设置蓝牙模块的各种参数。
- 透传模式是用于实现数据透明传输的模式,蓝牙模块在此模式下将串口接收到的数据通过蓝牙无线传输至远端设备,并将蓝牙接收到的数据透明传递给串口输出。使用场景: 在透传模式下,蓝牙模块充当了蓝牙串口透明传输的角色,将串口数据通过蓝牙传输到其他蓝牙设备。这种模式通常用于实现蓝牙串口通信,使得两个设备之间可以通过蓝牙进行无线串口通信。
配置步骤:
如何进入AT模式:(1)按住蓝牙模块上的按键通过USB转TTL模块接入电脑,:若模块以两秒的间隔闪烁,表示连接成功,进入AT命令模式(2)若无按键,则将en引脚接高,如图二所示,用一根杜邦线接到3.3v,就可以进入AT模式。再通过USB转TTL接入电脑.(3)如果没有USB转TTL可以使用开发板上面的USB-TTL如图三所示。
打开SSCOM(串口调试助手),选择连接的串口,配置波特率38400,打开串口:
如果没有USB转TTL模块的小伙伴,如果你的开发板上有USB-TTL模块也可以进行使用,把开发板的跳线帽拿开。将蓝牙模块的TX–RXD,RX–TXD。同时按住蓝牙模块上的按键或者将en引脚接高,再给单片机供电。也可以进入AT模式进行调试。
常用的AT指令
指令名 | 响应 | 含义 |
---|---|---|
AT | OK | 测试指令 |
AT+RESET | OK | 模块复位 |
AT+ORGL | OK | 恢复默认状态 |
AT+ADDR? | +ADDR:<地址> OK | 获得蓝牙模块地址 |
AT+NAME=<名称> | OK | 设置设备名称 |
AT+PSWD=<密码> | +PSWD:<密码> OK | 获得模块密码 |
AT+UART=<波特率> | OK | 设置串口参数 |
AT+UART? | +UART:<参数>OK | 获得串口参数 |
AT+ROLE=<0 从,1主,2回环角色> | + ROLE:<参数>OK | 查询蓝牙模块角色 |
注意:
- AT+ORGL设置为默认状态,模块的默认状态是:①.设备类:0 ②.查询码:0x009e8b33 ③.模块工作角
色:SlaveMode ④.连接模式:指定专用蓝牙设备连接模式⑤.串口参数:波特率—38400bits/s;停止位:1位;校验位:无
⑥.配对码:“1234” ⑦.设备名称:“H-C-2010-06-01”。每款产品的状态可能不同。 - AT+ROLE=<参数>,0:Slave(从角色)——被动连接;1:Master(主角色)——查询周围 SPP 蓝牙从设备,并主动发起连接,从而建立主、从蓝牙设 备间的透明数据传输通道。2:Slave-Loop(回环角色)——被动连接,接收远程蓝牙主设备数据并将数据原样返回给远程蓝牙主设备;根据自己的需求选择合适的方式,如果想要例如手机主动连接蓝牙模块,那么就设为Slave(从角色)
二、CUBE-MX可视化配置
usart 端口配置
开启中断
DMA设置
保存生成代码
三、蓝牙APP调试助手
下载地址 http://www.2265.com/soft/268047.html,好多蓝牙APP搜不到蓝牙模块的信号,亲测这款APP比较好用。支持自定义控件,这里是以文本的方式发送数据。详细介绍可以参考这篇文章,https://www.jianshu.com/p/1a8262492619。
四、实验
实验一:实现通过手机蓝牙APP发送数据控制单片机小灯亮灭。这款APP有自带的数据发送协议,在单片机接收过程中我们只需要按照规定的进行解析就可以了。如下图所示。例如,我们想要根据发送一字节的数据0x01控制小灯的暗灭,则我们从APP发送的数据为 A5 01 01 5A 校验和是01.
函数解析:
以下是stm32端接收数据的代码,对接收数据进行解析。如果首字节和尾字节分别是0xA5和0x5A,可以判断是我们要接收的数据包,再进一步计算校验和,对比数据是否发生错误。如果数据没有发生错误则判断数据如果是0x01则对小灯的电平进行反转。
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart==&huart3)
{
// 将接收到的数据通过串口三发送出去
HAL_UART_Transmit_DMA(&huart3, receiveData, Size);
printf("Size=%d\n",Size);
printf("receiveData=%s\n",receiveData);
// uint8_t i=0;
//利用接收到的数据进行�?单的命令,判断校验和和数据是否是原数据�?有字节之和的�?8�?
if(receiveData[0]==0xA5 && receiveData[Size-1]==0x5A ){
uint8_t sum=0;
for(uint8_t i=1;i<Size-2;i++)
{
sum+=receiveData[i];
}
if(sum==receiveData[Size-2])
{
if(receiveData[1]==0x01)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
}
}
}
memset(receiveData,0,sizeof(receiveData));
// 再次�?启数据的接收
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, receiveData, sizeof(receiveData));
//关闭DMA接收过半中断
__HAL_DMA_DISABLE_IT(&hdma_usart3_rx,DMA_IT_HT);
}
}
实验现象
总结
如果连接不到蓝牙,可能是蓝牙当前角色是主机模式,无法被搜索到和配对,解决办法:
方法1. 先将蓝牙设置为从机模式(AT+ROLE=0\r\n),再进行配对。(推荐)
方法2. 通过AT指令与手机配对,具体操作参见HC05-AT指令集手册。