700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > STM32CubeMX(2)——串口实现HC-05蓝牙模块与手机通信

STM32CubeMX(2)——串口实现HC-05蓝牙模块与手机通信

时间:2021-01-12 16:47:05

相关推荐

STM32CubeMX(2)——串口实现HC-05蓝牙模块与手机通信

STM32实现蓝牙与手机通信

使用的蓝牙STM32Cubemax配置手机连接蓝牙代码编写总结

使用的蓝牙

本文使用的蓝牙是市面上常用的HC-05蓝牙模块

其引脚和STM32的连接为

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 test\n");

手机端接收成功

————————————

现在用手机通过蓝牙助手向单片机发送信息,在这里单片机接收的主要采用DMA接收,并且采用的是空闲中断的方法,满足日常使用接收不定长数据,不想使用DMA也可以使用普通的串口接收实现定长接收,或者采用一定技巧,使用串口实现不定长接收。

HAL_UART_Receive(&huart2, RxBuffer, 1,0xffff);//实现单个字节的接收

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);

——————————————————————————————————

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 = %d\n",Rx_len);printf("I got the message %s",RxBuffer);for(uint8_t i=0;i<Rx_len;i++) //清空buffer{RxBuffer[i] = 0;}Rx_len=0;RX_flag = 0;}}

结果如下

总结

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

具体代码链接:代码仓库链接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。