蓝牙模块测试

蓝牙模块型号:BLE-CC41-A

本文中的测试方法有两种:第一种是直接使用USB转TTL工具来实现,接线如图,接好后直接插到电脑上即可:

蓝牙引脚 单片机引脚
VCC 5V
GND GND
TX RX
RX TX

下图是测试常见指令得出的结果,输入完按回车然后再点击发送

方式二:电脑 → STM32F407(USART1) → STM32F407(USART3) → BLE-CC41-A 蓝牙模块,并通过电脑发送 AT 指令测试蓝牙模块。

1. 硬件接线(关键步骤)

蓝牙模块(BLE-CC41-A)是 UART 接口,需要和 STM32 的 USART3 对应连接:

表格

BLE-CC41-A 引脚 STM32F407ZET6 引脚 说明
VCC 5V 丝印是3.6-6V单片机常见3.3和5V
GND GND 共地
TX PB11 (USART3_RX) 蓝牙发 → STM32 收
RX PB10 (USART3_TX) STM32 发 → 蓝牙收

注意:部分模块丝印可能是 TXD/RXD,含义相同;如果通信异常,可尝试交换 TX/RX 接线。


2. STM32 代码实现(串口转发逻辑)

下面是基于标准库的核心代码框架,你可以直接放到工程里使用:

① 串口初始化

c

运行

#include "stm32f4xx.h"

// USART1:电脑 <-> STM32
void USART1_Init(u32 baudrate) {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_AHB1Periph_GPIOA, ENABLE);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); // PA9 = TX
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // PA10 = RX

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = baudrate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    USART_Cmd(USART1, ENABLE);
}

// USART3:STM32 <-> 蓝牙模块
void USART3_Init(u32 baudrate) {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_AHB1Periph_GPIOB, ENABLE);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); // PB10 = TX
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); // PB11 = RX

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = baudrate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART3, &USART_InitStructure);

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    USART_Cmd(USART3, ENABLE);
}

// 串口发送单个字节
void USART_SendByte(USART_TypeDef* USARTx, u8 data) {
    while(!(USARTx->SR & USART_SR_TC));
    USART_SendData(USARTx, data);
}
② 中断服务函数(数据转发核心)

c

运行

// USART1 中断:电脑发来的数据 → 转发给蓝牙模块
void USART1_IRQHandler(void) {
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        u8 data = USART_ReceiveData(USART1);
        USART_SendByte(USART3, data); // 转发到串口3(蓝牙模块)
    }
}

// USART3 中断:蓝牙模块返回的数据 → 转发给电脑
void USART3_IRQHandler(void) {
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
        u8 data = USART_ReceiveData(USART3);
        USART_SendByte(USART1, data); // 转发到串口1(电脑)
    }
}
③ 主函数

c

运行

int main(void) {
    // 初始化串口1和串口3,波特率要和蓝牙模块默认一致(通常是9600或115200,以手册为准)
    USART1_Init(115200);
    USART3_Init(115200); 

    while(1) {
        // 主循环空转,所有转发工作由中断完成
    }
}

3. 电脑端操作步骤

  1. 打开串口助手(如 XCOM、SecureCRT 等)

    • 串口号:选择 STM32 虚拟串口
    • 波特率:和代码中一致(如 9600)
    • 数据位:8,停止位:1,校验位:无
    • 勾选「发送新行」(部分 AT 指令需要换行结尾)
  2. 发送 AT 指令测试常见 AT 指令(以 BLE-CC41-A 手册为准):

    • AT → 模块应返回 OK
    • AT+NAME → 查询模块名称
    • AT+BAUD → 查询 / 设置波特率
    • AT+PIN → 查询 / 设置配对密码
  3. 观察现象

    • 电脑发送 AT,串口助手会收到模块返回的 OK,说明通信正常 ✅
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐