相关链接:STM32---蓝牙模块ECB02(从机模式_与手机通信)
上篇ECB02笔记,已经整理:模块参数、AT指令、使用要点等。
本文,省略重复描述,重点整理ECB02配置主机模式,示例两模块一主一从通信。
目录
1、ECB02 主机模式 重点
- 无需、不能设置蓝牙名称;
- 上电后,会根据保存的绑定记录,自动搜索、连接从机设备;
- 连接新的设备前,要先清除旧的绑定记录;
- 3种绑定从机的方式:蓝牙名称、MAC地址、设备的设备号(不建议使用);
- 设定绑定参数后,如绑定名称,就会自动开始搜索、连接(无需干预);
- 可以通过指令,灵活设置搜索从机的间隔、搜索的时长;
2、主机模式 需要的AT指令
下列是配置的重要指令,其它配置使用默认参数即可。
- AT+FACTORY\r\n ; // 恢复出厂设置, 返回:“OK\r\n”
- AT+ROLE=1\r\n ; // 设置主机模式, 返回:“OK\r\n”
- AT+BONDC\r\n ; // 清除旧的从机绑定, 返回:“OK\r\n”
- AT+MODE=1\r\n ; // 连接后AT指令有效, 返回:“OK\r\n”
- AT+BONDNAME=myECB02\r\n ; // 绑定从机蓝牙设备, 返回:“OK\r\n”
3、STM32 接线
两个ECB02,分别在两块STM32板上,使用相同的UART端口、接线。
本文引脚连接,如下表:
蓝牙 ECB02 模块 | STM32 开发板 |
---|---|
RXD | TX-PC10 (UART4) |
TXD | RX-PC11 (UART4) |
GND | GND |
VCC | 3.3V |
4、主机模式 配置代码
/******************************************************************************
* 函 数: UART4_WaitACK
* 功 能: 等待指令返回值 *
* 参 数: char* _ackStr 期待返回的字符串
* uint32_t _timeout 超时值
* 返回值: 0-超时、返回异常
* 1-正常返回期待值
******************************************************************************/
static uint8_t UART4_WaitACK(char *_ackStr, uint32_t _timeout)
{
while (_timeout--) // 判断是否起时(这里只作简单的循环判断次数处理)
{
if (xUART4.ReceivedNum) // 判断是否接收到数据
{
xUART4.ReceivedNum = 0; // 清0接收字节数
if (strstr((char *)xUART4.ReceivedData, _ackStr)) // 判断返回数据中是否有期待的字符
return 1; // 返回:0-超时没有返回、1-正常返回期待值
else
return 0;
}
delay_ms(1); // 延时; 用于超时退出处理,避免死等
}
return 0; // 返回:0-超时、返回异常,1-正常返回期待值
}
/******************************************************************************
* 函 数: ECB02_Init
* 功 能: 初始化ECB02:主机模式
* 配置串口、主从机模式、AT模式、蓝牙名称
* 参 数: 无
* 返回值: 0-失败、1-成功
******************************************************************************/
static uint8_t ECB02_Init(void)
{
delay_ms(200); // 上电后稍作延时,等待ECB02进入工作状态
UART4_Init(115200); // 串口4初始化; 用于与ECB02通信; 波特率115200; 使用引脚PC10、PC11
/** 1-恢复出厂设置**/
UART4_SendString("AT+FACTORY\r\n"); // 恢复出厂时的默认配置
if (UART4_WaitACK("OK", 1000) == 0) // 等待指令执行返回; AT指令执行成功返回"OK"、执行失败不返回任何数据;
goto error_ECB02_Init; // 错误:等待超时; 跳到错误处理
printf("1- ECB02 默认配置 配置完成\r"); // 输出提示:修改成功
delay_ms(500); // 注意:执行恢复出厂配置指令后,要稍等500ms后,才能操作其它指令
/** 2-主机模式 **/
UART4_SendString("AT+ROLE=1\r\n"); // 设置主从机模式:0-由ROLE引脚配置、1-主机模式、2-从机模式
if (UART4_WaitACK("OK", 1000) == 0) // 等待指令执行返回; AT指令执行成功返回"OK"、执行失败不返回任何数据;
goto error_ECB02_Init; // 错误:等待超时; 跳到错误处理
printf("2- ECB02 主机模式 配置完成\r"); // 输出提示:修改成功
delay_ms(500); // 注意:执行主从机模式指令后,要稍等500ms后,才能操作其它指令
/** 3-连接后AT指令仍然有效 **/
UART4_SendString("AT+MODE=1\r\n"); // 设置连接后仍可使用AT指令; 0-AT_EN引脚控制、1-连接后AT指令有效、2-连接后AT指令无效,所有数据数据透传;
if (UART4_WaitACK("OK", 1000) == 0) // 等待指令执行返回; AT指令执行成功返回"OK"、执行失败不返回任何数据;
goto error_ECB02_Init; // 错误:等待超时; 跳到错误处理
printf("3- ECB02 AT模式 配置完成\r"); // 输出提示:修改成功
/** 4-清除旧的绑定 **/
UART4_SendString("AT+BONDC\r\n"); // 清除旧的绑定记录:如果最后一次连接的是设备A,那么,在连接设备B前,要清除旧的绑定记录
if (UART4_WaitACK("OK", 1000) == 0) // 等待指令执行返回; AT指令执行成功返回"OK"、执行失败不返回任何数据;
goto error_ECB02_Init; // 错误:等待超时; 跳到错误处理
printf("4- ECB02 清除绑定 配置完成\r"); // 输出提示:修改成功
delay_ms(500); // 注意:执行清除旧绑定记录指令后,要稍等500ms后,才能操作其它指令
/** 5-连接指定设备 **/
UART4_SendString("AT+BONDNAME=myECB02\r\n"); // 设置要绑定的从机设备名称,在设置后,ECB02会开始自动搜索,并尝试连接设备; 注意:如果是汉字的名称,要使用URL编码,具体可翻查官方pdf
if (UART4_WaitACK("OK", 1000) == 0) // 等待指令执行返回; AT指令执行成功返回"OK"、执行失败不返回任何数据;
goto error_ECB02_Init; // 错误:等待超时; 跳到错误处理
printf("4- ECB02 连接设备...\r\n"); // 输出提示:尝试连接设备
return 1; // 配置顺利完成,函数返回:1
error_ECB02_Init: // 失败处理
printf("ECB-02 配置失败!已跳过配置\r"); // 输出提示:配置失败
return 0; // 返回:0-失败、1-成功
}