【已验证】基于STM32和HAL库的大夏龙雀BT311-10C02S蓝牙模块驱动
最近买了一个大夏龙雀家的蓝牙模块DX-BT311-10C02S这个蓝牙是一款基于BLE 5.4规范的串口透传模块支持AT指令配置、主从模式切换非常适合与单片机搭配实现无线数据传输。如果是第一次买还是很便宜的他家的模块有一说一是真的不错本文将分享如何使用STM32F103C6T6HAL库驱动该模块完成基础功能验证。一、模块简介DX-BT311-10C02S具有以下特点拷贝手册的支持BLE 5.4协议主从模式可切换默认串口参数9600bps/8/n/1提供UART接口支持AT指令配置默认从模式UUIDSERVICE UUID: 0xFFE0NOTIFY/WRITE UUID: 0xFFE1WRITE UUID: 0xFFE2支持数据透传连接后自动进入透传模式具有LINK-STATUS引脚高电平表示蓝牙已连接手册中AT指令格式说明所有指令以AT开头以\r\n结尾响应以开头成功时以OK结束失败返回ERRORcode例如修改名称发送ATNAME1234返回NAME1234后跟OK二、硬件连接STM32F103C6T6DX-BT311模块PB10 (USART3_TX)RXPB11 (USART3_RX)TX3.3VVCCGNDGNDPA0可选LINK-STATUS三、驱动设计思路为了高效处理不定长数据我们采用DMA 空闲中断 环形缓冲区的方案DMA接收开启USART3的DMA循环接收无需CPU干预。空闲中断当模块发送一帧数据以空闲状态结束时触发中断在中断中将DMA缓冲区数据拷贝到环形缓冲区。环形缓冲区用于暂存接收数据供主循环取用。AT命令同步发送AT命令后清空环形缓冲区然后循环调用行读取函数直到收到“OK”或“ERROR”或超时。这样既能与透传数据隔离又避免阻塞。关键点接收统一由环形缓冲区管理AT命令和透传数据共用缓冲区但通过状态标志区分。连接状态通过PA0引脚轮询检测并提供回调。支持GBK编码方便设置中文蓝牙名称。四、关键代码实现4.1 初始化与DMA启动void bt311_init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx) { g_bt311.huart huart; g_bt311.hdma_rx hdma_rx; ring_buffer_clear(); // 启动DMA空闲中断接收 HAL_UARTEx_ReceiveToIdle_DMA(huart, g_bt311.rx_dma_buf, BT311_RX_DMA_BUF_SIZE); }4.2 空闲中断回调void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart ! g_bt311.huart) return; for (uint16_t i 0; i Size; i) { // 存入环形缓冲区 uint16_t next_head (g_bt311.rx_ring_head 1) % BT311_RX_RING_SIZE; if (next_head ! g_bt311.rx_ring_tail) { g_bt311.rx_ring_buf[g_bt311.rx_ring_head] g_bt311.rx_dma_buf[i]; g_bt311.rx_ring_head next_head; } } g_bt311.rx_ready 1; HAL_UARTEx_ReceiveToIdle_DMA(huart, g_bt311.rx_dma_buf, BT311_RX_DMA_BUF_SIZE); }4.3 AT命令发送与同步bool bt311_send_cmd(const char *cmd, char *response, uint16_t resp_size, uint32_t timeout_ms) { // 发送命令添加\r\n char full_cmd[128]; snprintf(full_cmd, sizeof(full_cmd), %s\r\n, cmd); HAL_UART_Transmit(g_bt311.huart, (uint8_t*)full_cmd, strlen(full_cmd), 100); // 清空环形缓冲区 ring_buffer_clear(); uint32_t start HAL_GetTick(); char line[128]; while (HAL_GetTick() - start timeout_ms) { if (ring_buffer_read_line(line, sizeof(line))) { if (strstr(line, OK) ! NULL) return true; if (strstr(line, ERROR) ! NULL) return false; } bt311_process(); // 处理环形缓冲区从DMA搬运 HAL_Delay(1); } return false; }4.4 主循环处理void bt311_process(void) { // 处理透传数据用户回调 if (g_bt311.rx_ready g_bt311.user_rx_callback) { // 从环形缓冲区取数据调用回调 // ... } // 处理连接状态变化 if (g_bt311.link_status_port) { uint8_t cur HAL_GPIO_ReadPin(...); if (cur ! g_bt311.link_status) { g_bt311.link_status cur; if (g_bt311.link_status_callback) g_bt311.link_status_callback(cur); } } }4.5 测试函数提供全功能测试函数自动完成初始化、AT测试、版本查询、MAC读取、名称设置、连接状态检测、数据收发打印方便快速验证。void bt311_run_full_test(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx) { bt311_init(huart, hdma_rx); bt311_register_rx_callback(print_received_data); bt311_set_link_status_pin(GPIOA, GPIO_PIN_0); bt311_register_link_callback(print_link_status); // 执行AT测试 if (bt311_test()) printf(AT OK\r\n); char version[32]; bt311_get_version(version); char mac[18]; bt311_get_mac(mac); bt311_set_name(HealthMonitor); bt311_reset(); while (1) { bt311_process(); // 连接后每5秒发送模拟数据 if (bt311_get_link_status()) { static uint32_t last 0; if (HAL_GetTick() - last 5000) { bt311_send_data((uint8_t*)HR:75,SPO2:98\r\n, 14); last HAL_GetTick(); } } HAL_Delay(10); } }五、测试验证在STM32F103C6T6上运行后串口调试助手输出手机连接后发送的数据被正确打印同时模块每隔5秒自动发送模拟心率血氧数据。连接状态引脚PA0电平变化触发回调工作稳定。六、总结本文介绍了DX-BT311-10C02S蓝牙模块的驱动设计思路与关键实现。通过DMA空闲中断环形缓冲区的组合实现了高效、非阻塞的数据接收并统一处理AT命令响应与透传数据。该驱动已成功应用于健康监测项目可方便地扩展其他传感器。代码结构清晰移植方便可作为STM32与BLE模块通信的参考模板。七、参考代码通过网盘分享的文件HealthMonitor_BT.zip链接: https://pan.baidu.com/s/1y88ASSL0hksTsjAsc1txFw?pwdd37u 提取码: d37u--来自百度网盘超级会员v8的分享
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459134.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!