HC-05的基本使用(STM32)

目录

一、HC-05

1、HC-05简介

2、接线方式

二、AT指令

1.基本指令

2、基本的使用

3、手机连接HC-05

三、CubuMX配置(基于stm32f407zgt6)

总结


一、HC-05

1、HC-05简介

        HC-05 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的
数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm,
接收灵敏度-85dBm,板载 PCB 天线,可以实现 10 米距离通信。
        模块采用邮票孔封装方式,模块大小 27mm×13mm×2mm,方便客户嵌入应用系统之
内,自带 LED 灯,可直观判断蓝牙的连接状态。
        模块采用 CSR 的 BC417 芯片,支持 AT 指令,用户可根据需要更改角色(主、从模式)
以及串口波特率、设备名称等参数,使用灵活。

 

2、接线方式

EN引脚:老师说的是控制模式的,如果给的是高电平就会进入AT模式,低电平就是正常模式。(但是我没有使用成功,所以我就放弃这种方法来设置了)

STATE没有了解,可以自行查阅。

AT指令模式现象:LED灯会慢闪

等待连接模式现象:LED灯会快闪

已连接模式现象:LED灯快慢交替闪烁

二、AT指令

1.基本指令

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指令不区分大小写,均已回车、换行结尾。 

 对于hc-05的基本使用了解这些AT指令就以及足够了。

2、基本的使用

 因为我在使用过程中没有使用EN引脚成功,所以我使用的用USB-TTL模块来直接和电脑上的串口通信,两者的RX和TX要反接,通信如下图。

要将波特率配置成38400,加上回车和换行。至于后续要设置名字、密码等自行修改。

3、手机连接HC-05

使用安卓手机下载SPP蓝牙串口或者HC蓝牙助手等APP,然后连接蓝牙,就会有对话框可以在里面进行发送数据。此时HC-05的灯也会快慢的交替闪烁。

三、CubuMX配置(基于stm32f407zgt6)

配置两个串口,一个用于重定义printf打印信息,另一个用于HC-05通信。我还配置了一个LED灯用于模拟发送信息来控制LED的亮灭。然后生成工程。

 main函数

int main(void)
{

  uint8_t Rx = 0;     //用于接收一位数据
  uint8_t Rx_Flag = 0;//用于标志是否接收到数据
  uint8_t Rx_Data[100];//用于存储接收到的数据
  uint8_t Rx_index = 0;//接收到的数据大小

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  printf("this is hc-05 test \r\n");
  while (1)
  {
    if(HAL_UART_Receive(&huart2,&Rx,1,10)==HAL_OK)//接收数据,10ms超时
    {
      Rx_Data[Rx_index++] = Rx;//存入数据
      Rx_Flag = 1;//给已接收到的标志位
      Rx = 0;//将临时存数据的变量清零
    }
    else
    {
      if(Rx_Flag==1)//判断是否刚接收到数据
      {
        printf("%s",Rx_Data);//先打印数据
        if(strncmp((char *)Rx_Data,"ledtoggle",sizeof("ledtoggle"))==0)//判断数据是否是让LED灯翻转
        {
          printf("0");//用于检查是否进入循环   
          HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);//翻转LED电平
        }
        memset(Rx_Data,0,strlen((char *)Rx_Data));//清空数组
        Rx_index=0;
        Rx_Flag=0;//清除标志,等待下一次接收
      } 
    }
  }
}

因为不知道怎么去接收多个字符,所以这个方法是有很大问题的。可能是因为数据比较小所以我自己测试的时候没有问题,如果有懂的大佬求指教!

实验现象也是发一次就翻转一次。 

总结

本人是个菜鸟,如有错误,请大佬指出,谢谢!

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hard-coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值