本帖最后由 Zhao_kar 于 2023-10-5 20:12 编辑
【STM32L476RG】第四节——蓝牙HC05的基本使用
闲聊:前面两节讲了基本的串口操作和串口屏操作,然后这一篇我懒得改了,前面写了开头没保存,不小心关掉网页了,悲,只能重新写开头,然后这一节就讲怎么使用stm32驱动HC05,向手机里面发送信息
备注:蓝牙HC05有很多可以操作的空间,包括手机软件里面的蓝牙调试助手,可以使用很多组件,但是里面需要考虑到一个数据包的东西,这一篇不需要这么麻烦,因为我只需要调试页面接受到数据就行了,所以具体操作如下,三点实验:
- HC05的初始配置
- HC05和CH340的基础PC通信调试
- HC05和STM32的通信和调试
一、HC05的初始配置
1、首先是硬件连接,HC05的供电为3.6-6V,所以只需要CH340接5V给他就行了,然后剩下引脚只需要连接RX和TX,硬件连接图不放出来了
2、然后是AT的配置,连接好后,上电前,长按按钮,上电后,进入BOOT
3、打开串口调试助手(这里不用VOFA是因为vofa平时也只是我拿来看波形的工具,这里暂时不需要,所以直接使用一个调试助手就行了)
4、波特率设置为38400,然后按照如下操作,注:命令需要回车哦,没返回ok,多半是没用回车
返回OK表示执行正常
AT+ROLE=0 //0表示主模式,1表示从模式,2表示回环模式
AT+NAME="" //配置名称,返回OK,自己设定名字哦
AT+PSWD="1234" //设置配对码,自己定
/*这里设置自动连接工作模式的波特率,也就是通信的当蓝牙接收发送数据模式的波特率*/
AT+UART=115200,0,0 //波特率115200,停止位,不进行校验
AT+RESET //重启模块
二、HC05和PC的调试助手的连接
1、上面配置好参数后,我们打开蓝牙调试助手,软件名叫(蓝牙调试器)
2、连接蓝牙
3、进入对话模式
4、然后通过PC发送数据给蓝牙,如图
- 注释:这里为什么会出现这些显示不了的符号
- 一般都是因为编码问题,我们只需要到最后的设置里面更改成对应的编码就可以正常查看了
- 这边分别用了UTF8、GBK、GB2312来测试
5、然后使用蓝牙发送数据给PC也是可以的,如图
三、HC05和stm32的通信
1、说明,老样子,我们使用蓝牙发送16进制的01和02,从而使得单片机接收,进入中断回调函数
2、然后根据接受到的值去printf对应的文本,并且开关灯
3、代码部分去用上一节的就行了,只需要改回调函数,改成如下
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
switch(Rx)
{
case 0x01:
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
printf("close");
printf("01");
// printf("t2.txt=\"%u \"\xff\xff\xff", TX1);
} break;
case 0x02:
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
printf("open");
printf("02");
// printf("t3.txt=\"%u \"\xff\xff\xff", TX2);
} break;
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&Rx, 1);//循环使能,才能不断接政
}
}
/* USER CODE END 4 */
4、然后连接蓝牙,切换16进制发送,HEX,发送01,可以看到返回16进制的"63 6C 6F 73 65 30 31",led没亮
5、这个字符串 "63 6C 6F 73 65 30 31" 是一个十六进制编码的字符串,你可以将其转换为ASCII字符。每两个十六进制数字代表一个字符的ASCII码值。下面是将其转换为字符串的结果:
"63 6C 6F 73 65 30 31" 转换为 "close01"。
6、然后发送02,可以发现led变亮,且返回”6F 70 65 6E 30 32“
7、这个十六进制编码 "6F 70 65 6E 30 32" 转换成ASCII字符为 "open02"
详细视频见下,就不截图了
video1
五、总结和补充
1、本次也就是简单的使用HC05,如果涉及组件的,建议去看看别的教程学习一下,翻翻官方手册也不错,我这里补个题外话,把我之前学的时候的简单笔记放这
2、下一期讲oled的显示
1、首先是蓝牙传输中的各种类型数据转换成蓝牙的Byte类型,然后调用的时候Int_to_Byte(z,&USART_TX_BUF[4]);这里面的Z就是变量,其实就是放数据的,然后后面的这个是数据包对应的字节位置,下面两个一个道理
```c
void Int_to_Byte(int i,uint8_t *byte)//整形转换
{
unsigned long longdata = 0;
longdata = *(unsigned long*)&i;
byte[3] = (longdata & 0xFF000000) >> 24;
byte[2] = (longdata & 0x00FF0000) >> 16;
byte[1] = (longdata & 0x0000FF00) >> 8;
byte[0] = (longdata & 0x000000FF);
}
void Float_to_Byte(float f,uint8_t *byte)//浮点转换
{
unsigned long longdata = 0;
longdata = *(unsigned long*)&f;
byte[3] = (longdata & 0xFF000000) >> 24;
byte[2] = (longdata & 0x00FF0000) >> 16;
byte[1] = (longdata & 0x0000FF00) >> 8;
byte[0] = (longdata & 0x000000FF);
}
void Short_to_Byte(short s,uint8_t *byte)//短转换
{
byte[1] = (s & 0xFF00) >> 8;
byte[0] = (s & 0xFF);
}
```
2、在蓝牙传输数据包的过程中,主要分为包头包尾和校验位,还有数据。数据格式支持 bool,char,short,int,float四种c语言常用的数据类型
- 起始字节:0xA5
- 原始数据
- 校验和
- 结束字节:0x5A
3、校验和的意思和使用方法,首先是蓝牙的数据包,他是按照你的设置给定位数的,首先是包头包尾和校验和,包头和包尾就是起始和结束