波特律动
课程中心/STM32基础教程/【BLE 蓝牙】蓝牙透传通信

【BLE 蓝牙】蓝牙透传通信

下载例程代码

注意

CubeIDE:请按照 例程使用方法🔗 导入例程,否则下载的可能不是例程而是其他工程。

Keil:请使用 ArmCC V6 编译,否则可能会出现编译错误。点击此处查看切换编译器方法🔗

通过蓝牙接收任意不定长的数据,并将接收到的数据通过蓝牙原样返回。

  • 使用配套的 DX-BT24 模块,实现蓝牙透传通信
  • 使用UARTEx扩展库,实现不定长数据的接收
  • 使用DMA通道,实现串口数据的快速传输,不占用CPU资源

如何使用例程

  • 编译并下载程序到学习板
  • 将蓝牙模块连接到学习板的 BLUETOOTH 接口
    需要使用:4P杜邦线、超声波模块
    连接模块时请核对好线序

    蓝牙模块

    学习板

    RXD

    TX

    TXD

    RX

    GND

    G

    5V

    5V

1、使用串口助手连接蓝牙

  • 点击搜索蓝牙设备
  • 选择 BT24,点击配对
  • 绿色圆点亮起,表示连接成功。若未连接成功,可点击【重连】按钮
  • 连接成功后,发送任意数据,即可看到接收到的数据原样返回

2、使用微信小程序连接蓝牙

  • 打开微信小程序【大夏无线传输助手】,点击【搜索】,找到 BT24,点击进行连接
  • 连接成功后,发送任意数据,即可看到接收到的数据原样返回

例程讲解

下面介绍了如何自己实现该例程的功能

1、工程配置

  • 打开串口3外设:Pinout&Configuration -> Connectivity -> USART3,将Mode选择为Asynchronous
    DX-BT24 模块连接到学习板的 USART3
  • 更改波特率:在 USART3 -> Configuration -> Parameter Settings 标签卡中,将 Baud Rate 更改为 9600
    DX-BT24 模块默认波特率为 9600
  • 添加DMA通道:在 USART3 -> Configuration -> DMA Settings 标签卡中,点击 Add 按钮,分别添加 USART3_RX 和 USART3_TX 的 DMA 通道
  • 使能串口中断:在 USART3 -> Configuration -> NVIC Settings 标签卡中,勾选 USART3 global interrupt 的 Enable

2、代码

  • 定义全局变量 rx_data 作为串口接收缓冲区
    由于是不定长数据的接收,因此缓冲区大小可以根据实际需求调整,只能大不能小,否则可能会丢失数据
C语言
1// 串口接收缓冲区
2uint8_t rx_data[256] = {0};
  • 在 main 函数中,使用 HAL_UARTEx_ReceiveToIdle_DMA 函数开启不定长数据DMA接收
    注意:需要关闭DMA传输过半中断,我们只需要接收完成中断
    此函数是以空闲中断作为接收完成的标志,而不是接收长度,因此可以接收任意长度的数据
C语言
1// 使用Ex函数,接收不定长数据
2HAL_UARTEx_ReceiveToIdle_DMA(&huart3, rx_data, sizeof(rx_data));
3// 关闭DMA传输过半中断(HAL库默认开启,但我们只需要接收完成中断)
4__HAL_DMA_DISABLE_IT(huart3.hdmarx, DMA_IT_HT);
  • 在中断函数 HAL_UARTEx_RxEventCallback 中,处理接收到的数据
    所有的串口接收和发送操作都在中断函数中进行,不会阻塞主程序
C语言
1// 不定长数据接收完成回调函数
2void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
3{
4 if (huart->Instance == USART3)
5 {
6 // 使用DMA将接收到的数据发送回去
7 HAL_UART_Transmit_DMA(&huart3, rx_data, Size);
8 // 重新启动接收,使用Ex函数,接收不定长数据
9 HAL_UARTEx_ReceiveToIdle_DMA(&huart3, rx_data, sizeof(rx_data));
10 // 关闭DMA传输过半中断(HAL库默认开启,但我们只需要接收完成中断)
11 __HAL_DMA_DISABLE_IT(huart3.hdmarx, DMA_IT_HT);
12 }
13}