一、前言
最近在准备23电赛,考虑到之前21年有双车跟随题目要用到蓝牙通讯,所以在准备两个蓝牙之间的通信。翻了很多的博客,发现很少有针对双HC05蓝牙通讯的HAL库例程,所以在做好了自己实验过后写一篇博客,希望能帮助到有这方面需求的大家。
本篇文章适用人群:
1.基于HAL库用CubeMX生成代码
2.已掌握HC05指令配置的人群,如果AT配置还没搞好可以参照http://t.csdn.cn/qSTGE 这位博主的文章。
3.不喜欢看冗长代码博客的同学
二、准备器件
1.两块STM32F103C8T6(其它主控原理一样)
2.两块HC05蓝牙模块
3.一块OLED屏幕
4.两个LED灯
三、开干
1.先确保好自己的两块HC05已配置好:(1)相同密码(2)一块主机模式,一块从机模式(3)主机已绑定从机地址 |
如果没有配置好,请回到前言部分打开链接,跟着配置好,务必!!!!!!!!
2.打开Cubemx开始配置主机部分工程
点击左侧SYS配置Debug为Serial Wire
点击左侧RCC开启高速低速时钟
配置时钟树,在HCLK直接输入72按回车
配置USART2的模式为Asynchronous异步收发模式,并勾选中断
再勾选一个PB3的Output模式作为测试LED灯用。这就是全部的引脚图了。
接下来直接上代码!
主机部分(TX) (以下只展示需要添加的代码,因为初始化代码是cubemx配置的,因此不再展示,以免代码冗长恶心大家。)
/* USER CODE BEGIN 0 */
uint8_t dat_Txd=1;
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
}
}
/* USER CODE END 0 */
定义一个变量,让串口2把它发出去,也就是说发出去一个数字1。 中断回调函数作用:一旦串口2发送了数据,就让LED灯亮(LED灯正极接IO口,负极接地,高电平点亮)。
此代码写在int main()初始化的前面,记得写在用户框里,避免再次生成时代码丢失。
HAL_Delay(2000);
在初始化代码int main()里加入Delay,让供电稳定了之后再发送,也避免因为上电过快从机来不及接收。
HAL_UART_Transmit_IT(&huart2, &dat_Txd, sizeof(dat_Txd));
这段代码写在while里,作用:让串口2发送数据。
以上主机(TX)端代码结束,简洁吧!
从机部分(RX)
Cubemx部分和主机一致,再跟着配一遍就好了!
从机引脚图如下,串口用的USART3,多加了IIC接口以供OLED使用(结尾附工程代码,包含OLED IIC驱动代码),PB4用作LED测试。
/* USER CODE BEGIN 0 */
uint8_t dat_Rxd;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3)
{
OLED_ShowNum(30,3,dat_Rxd,2,12, 0);
if(dat_Rxd == 0x01)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}
}
/* USER CODE END 0 */
定义一个接收量dat_Rxd,中断回调函数作用:一旦接收到数据,OLED屏把它显示出来,如果该数据是0x01,那么让LED灯亮(高电平点亮,另一头接地)
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Clear();
HAL_UART_Receive_IT(&huart3, &dat_Rxd, 1);
/* USER CODE END 2 */
初始化int main()里加入这三句,OLED初始化,清屏,然后接收数据。
效果演示:
上电后,右边主机发送数据1,然后LED亮,接着从机OLED显示接收到的数据1,然后点亮LED屏幕。
四、尾言
CSDN上好像很少基于hal库的蓝牙通信例程,我个人也很不喜欢看复杂的代码,就希望自己写的简洁一些,让大家也能很好的看懂,这就是我的初心了。如果大家有什么不懂的也可以留言,本人才疏学浅难免有错误不足之处恳请斧正。特别鸣谢灵感来源:小蜜蜂Cubemx。
工程代码:链接:https://pan.baidu.com/s/1xFEsvyf673LfPEDOSmcr5Q?pwd=ynku
提取码:ynku