STM32
直播中

周臻庸

7年用户 814经验值
私信 关注
[问答]

STM32是如何去实现HC-0蓝牙模块与手机进行通信的

HC-0蓝牙模块的引脚是如何与STM32连接的?

STM32是如何去实现HC-0蓝牙模块与手机进行通信的?

回帖(1)

孔维源

2021-11-25 10:17:09
STM32实现蓝牙与手机通信

使用的蓝牙

本文使用的蓝牙是市面上常用的HC-05蓝牙模块
其引脚和STM32的连接为
[tr]蓝牙模块单片机[/tr]
RXDTX
TXDRX
VCC5V
GNDGND
STM32Cubemax配置

前面配置时钟树的基础操作就不演示了
配置串口通信,注意波特率要选择9600,一般出厂的HC-05的默认与单片机通信波特率为9600





我这里还开启了DMA,方便测试蓝牙的接收功能




然后直接生成工程就ok了
手机连接蓝牙

若正常连接上电时,蓝牙模块会有红灯快闪,表示未连接。
手机使用蓝牙调试助手,可以自行在商店下载,然后可以看到出现蓝牙HC-05的名称(默认名称是蓝牙HC-05)





选择连接后,若成功连接,蓝牙模块的红灯会变成一秒两闪,表示连接成功
代码编写

重写printf函数,方便发送

/记得包含stdio的头文件
int fputc(int c,FILE *stream)  
{
                HAL_UART_Transmit(&huart2,(unsigned char *)&c,1,1000);
                return 1;
}


在main函数中发送数据
printf("this is a testn");




手机端接收成功
现在用手机通过蓝牙助手向单片机发送信息,在这里单片机接收的主要采用DMA接收,并且采用的是空闲中断的方法,满足日常使用接收不定长数据。
主要在中断处理函数中对串口和DMA进行处理。代码如下

HAL_UART_Receive(&huart2, RxBuffer, 1,0xffff);                //实现单个字节的接收
1
DMA的处理。简单的代码如下
编写代码前,还有些DMA的cubemax配置,详细看这篇文章
STM32 Cubemax(四) —— STM32利用DMA空闲中断与Openmv通信


1.加入DMA初始化


__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);  
HAL_UART_Receive_DMA(&huart2,RxBuffer,RXBUFFER_LEN);
1
2
——————————————————————————————————
2.编写中断函数


void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
        //DMA处理
        uint32_t temp_flag = 0;
        uint32_t temp;
        temp_flag = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);
        if((temp_flag!=RESET))
        {
                        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
                        temp = huart2.Instance->SR;   //通过读取清除标志位
                        temp = huart2.Instance->DR;   //读取数据寄存器中的数据
                        HAL_UART_DMAStop(&huart2);    //防止中途冲突
                        temp = hdma_usart2_rx.Instance->NDTR;  //获取未读取的数据个数
                        //F1的板子使用temp = hdma_usart2_rx.Instance->CNDTR;  //获取未读取的数据个数
                        Rx_len = RXBUFFER_LEN-temp;  //总共读取了多少个数
                        RX_flag = 1;   //完成标志
        }
        HAL_UART_Receive_DMA(&huart2,RxBuffer,RXBUFFER_LEN);//重新开启DMA接收
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */


  /* USER CODE END USART2_IRQn 1 */
}


通过判断RX_flag进行接收处理,这里是去判断接收到的个数和具体内容,并且返回给手机进行通信
下面这个函数别忘了在main.c的while(1)里使用!!


void Check_Rx()
{
                if(RX_flag == 1)   //如果完全接收了
                {
                                printf("Rx_len = %dn",Rx_len);
                                printf("I got the message %s",RxBuffer);
                                for(uint8_t i=0;i                                 {
                                                RxBuffer = 0;
                                }
                                Rx_len=0;
                                RX_flag = 0;
                }
}
结果如下





总结

HC-05是常用的蓝牙模块,使用起来还是非常简单的,但唯一的问题的是,HC-05不能做到一个蓝牙与多个设备同时通信的效果
举报

更多回帖

×
20
完善资料,
赚取积分