我尝试了重头开始进行蓝牙配置,最后生成的工程总是编译不过去,那么就只能用最稳妥的方法了,使用ST提公的例程进行修改,使用过蓝牙模块的都知道,我们其实不用太了解其内部的工作模式是什么样的,主要就是能够实现透传就可以,实现了透传,其就是一个串口。
接下来我们用例程中的“BLE_p2pServer”进行蓝牙功能的初步测试,本次使用MDK进行测试,也不知道哪里的问题CubeIDE编译一直报错,gcc编译方面的暂时无法解决,有可能是因为我的提示器版本的问题?之前灭有遇到过。
接下来还是继续看一下我们例程吧,参考的例程是STM32CubeMX下载的软件包中的,STM32CubeMX的Repository存储对应的软件包,默认是在C盘可以修改到自定义位置:
由于例程会管理一些引用的文件,比如:
这三个文件夹里面的一些应用部分,由于层级不同,我们在复制粘贴过去后要注意修改头文件相对路径,如果编译依然找不到就直接修改BLE_p2pServer.uvprojx里面的相对位置:
如图上面这种,或者直接在Repository复制粘贴一个更改。
接下来我们就测试一下例程的效果,编译下载后,demo的一个基本操作,整个测试过程可以在最终的效果展示中有讲解,感兴趣可以后期再回顾一下。
简单讲述一下操作过程,下载好历程后,如果一段时间不操作,蓝牙会处于非活跃状态,这个时候不会被手机搜索到,可以通过按键的方式激活,手机连接后,可以通过发送下行数据控制LED1,根据代码中的数据是第二个字节控制的,上行数据是通过B1按键控制的,按下会发送一次上行数据,也是第二个字节有差异,LED2(绿灯)可以指示蓝牙状态,熄灭为非活跃,慢闪为活跃未连接,快闪为已连接。
下图是上述体验demo的一个串口打印情况,基本上对于上述的操作过程有个全面的串口反馈暂时。
我们主要还是学习一些上下行数据处理,这一部分我们可以直接在p2p_server_app.c中进行处理就可以,下行的控制数据在直接可以在如下位置处理:
case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT: /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */ if(p_Notification->DataTransfered.p_Payload[1] == 0x01) { BSP_LED_On(LED_BLUE); LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n"); P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */ } if(p_Notification->DataTransfered.p_Payload[1] == 0x00) { BSP_LED_Off(LED_BLUE); LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n"); P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */ } /* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */ break;
这个也是我们控制LED1的目前代码,根据透传的数据,对数据数组p_Notification->DataTransfered.p_Payload[n]进行处理就OK了。
上传数据是通过P2P_SERVER_UpdateValue(P2P_SERVER_CharOpcode_t CharOpcode, P2P_SERVER_Data_t *pData)实现的,我们可以通过创建一个类似void P2P_SERVER_Switch_c_SendNotification(void)的程序进行控制,也可以直接在这个里面修改,毕竟按键定义或者LED控制模式我们都要进行修改。
对于整个蓝牙工作的流程,实际上不用完全精通,我们就把他想象成是一个透传的工具,通过这些回调函数进行处理接可以了,如果需要修改蓝牙名这些内容,可以通过STM32CubeMX进行修改,方便快捷。