完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32实现蓝牙与手机通信
使用的蓝牙 本文使用的蓝牙是市面上常用的HC-05蓝牙模块 其引脚和STM32的连接为 [tr]蓝牙模块单片机[/tr]
前面配置时钟树的基础操作就不演示了 配置串口通信,注意波特率要选择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不能做到一个蓝牙与多个设备同时通信的效果 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1376 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1368 浏览 1 评论
791 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
568 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1410 浏览 2 评论
1762浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
489浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
422浏览 3评论
415浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
391浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-30 16:20 , Processed in 0.719403 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号