✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
一、蓝牙及HC-05简介
蓝牙(Bluetooth)是一种无线技术标准,可在固定设备、移动设备和楼宇个人域网之间进行短距离数据交换,工作在2.4 - 2.485GHz的ISM波段的UHF无线电波频段。它最初由爱立信公司于1994年创制,作为RS232数据线的替代方案,能连接多个设备,解决数据同步难题。
HC-05是一款常用的蓝牙串口模块,支持主从模式切换,广泛应用于各类嵌入式项目中。其具备以下特点:
- 易用性:硬件连接和软件配置相对简单,方便开发者快速上手。
- 性价比高:价格较为亲民,在对成本敏感的项目中具有优势。
- 模式灵活:可设置为主模式或从模式,能满足不同的应用场景需求。
二、硬件连接
将HC-05与STM32连接时,需要注意以下引脚连接:
- 电源连接:HC-05的VCC连接到STM32的3.3V(注意,有些HC-05模块也支持5V供电,但需确认模块规格),GND连接到STM32的GND,为模块提供稳定电源。
- 串口连接:HC-05的TX(发送端)连接到STM32的RX(接收端,例如PA10引脚) ;HC-05的RX(接收端)连接到STM32的TX(发送端,例如PA9引脚),用于数据的收发通信。
三、HC-05模块配置(使用AT指令)
HC-05模块默认工作在从机模式,波特率为9600bps。若需更改配置,可通过以下步骤利用AT指令进行设置:
- 进入配置模式:按住HC-05模块上的按钮(部分模块有此按钮),再给模块上电,此时模块上的LED会慢速闪烁,表示进入配置模式。
- 连接串口工具:使用USB转TTL模块连接HC-05模块,并将USB端连接到电脑,通过串口调试助手发送AT指令。注意,配置模式下,HC-05的默认波特率为38400bps。
- 常用AT指令 :
- AT:检查模块是否连接正常,若正常,模块会回复“OK”。
- AT+NAME=名字:配置HC-05的名称,配置成功后返回“OK”,例如“AT+NAME=MyHC05” 。
- AT+PSWD=密码:设置配对密码,如“AT+PSWD=1234”。
- AT+UART=波特率,停止位,校验:设置串口参数,例如“AT+UART=115200,0,0”表示设置波特率为115200,一位停止位,无校验。
- 退出配置模式:配置完成后,断电重新上电,模块按新配置开始工作,LED快速闪烁。
四、STM32软件配置(以STM32F103为例)
- 初始化GPIO:将连接HC-05的STM32引脚(如PA9、PA10)配置为串口功能对应的复用推挽输出和浮空输入模式。
- 初始化USART:设置串口的波特率、数据位、停止位、校验位等参数,使能串口。
- 编写数据收发函数:
- 发送数据:使用HAL库函数
HAL_UART_Transmit
发送数据到HC-05模块。例如:
- 发送数据:使用HAL库函数
void USART_SendString(UART_HandleTypeDef *huart, char *str)
{
while(*str != '\0')
{
HAL_UART_Transmit(huart, (uint8_t *)str, 1, 0xFFFF);
str++;
}
}
- **接收数据**:可采用中断方式或轮询方式。以中断方式为例,使能串口接收中断,在中断处理函数中处理接收到的数据。
// 使能接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1);
// 中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
// 处理接收到的数据,例如存储到数组
RxBufferArray[RxBufferIndex] = RxBuffer;
RxBufferIndex++;
// 继续开启接收中断
HAL_UART_Receive_IT(huart, (uint8_t *)&RxBuffer, 1);
}
五、完整代码示例(STM32F103)
#include "stm32f1xx_hal.h"
UART_HandleTypeDef huart1;
char RxBuffer;
uint8_t RxBufferArray[100];
uint8_t RxBufferIndex = 0;
// 系统时钟配置函数
void SystemClock_Config(void)
{
// 具体配置代码省略
}
// GPIO初始化函数
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// PA9配置为复用推挽输出(TX)
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA10配置为浮空输入(RX)
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// USART1初始化函数
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
}
// 发送字符串函数
void USART_SendString(UART_HandleTypeDef *huart, char *str)
{
while(*str != '\0')
{
HAL_UART_Transmit(huart, (uint8_t *)str, 1, 0xFFFF);
str++;
}
}
// 接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
RxBufferArray[RxBufferIndex] = RxBuffer;
RxBufferIndex++;
HAL_UART_Receive_IT(huart, (uint8_t *)&RxBuffer, 1);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
// 开启接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1);
while (1)
{
// 示例:接收到数据后回传
if(RxBufferIndex > 0)
{
USART_SendString(&huart1, (char *)RxBufferArray);
RxBufferIndex = 0;
}
}
}
六、通信测试
- 确保STM32和HC-05模块电源正常,连接无误。
- 使用手机或其他蓝牙设备,搜索并连接HC-05模块(连接时需输入设置的配对密码)。
- 打开蓝牙调试APP,发送数据,观察STM32是否能正确接收并处理;STM32发送的数据也可在APP上查看,验证通信是否正常。