赞
踩
目录
ECB02的AT指令总数量有60+,配置灵活性相当高。
出厂的默认固件,已配置好常用参数,使用时只需要几个简单的配置指令。
AT指令重点:
从机 常用指令
即:被动地等待其它主机设备的搜索发现、连接,如另一模块、手机等
主机 常用指令
即:作为主控方,主动地搜索、连接其它从机设备
建议刚上手使用ECB02模块时,先通过USB转TTL模块测试、熟悉AT指令。
待测试成功,再连接至STM32板子,以减少代码调试的时间。
4.1 连接USB转TTL模块
使用最常用的串口通信接线方式即可。重点:双方的RX、TX反接。
蓝牙 HC-08 模块 | USB转TTL模块 |
---|---|
RXD | TXD |
TXD | RXD |
GND | GND |
VCC | 3.3V 或 5V |
4.2 串口软件 参数设置
打开任意一款串口软件,如XCOM, SSCOM等等。本笔记中,使用SSCOM的串口助手。
( SSCOM串口助手,已包含在文末网盘的资料包中 。)
4.3 AT指令通信测试
在串口助手 右方,输入如图所示AT指令组合 。如图,分了上下两组,上面是作为从机模式的指令组合 ,下面是作为主机模式时绑定从机蓝牙名字的指令组合。
点击发送按钮,可返回相应的指令反馈信息。
如果没有返回信息,逐一检查下面步骤:
ECB02模块,与STM32开发板的连接,本笔记使用UART4(TX-PC10, RX-PC11)。
当然,没有规定一定要使用串口4, 可自行修改为其它空闲的串口引脚
本篇,引脚连接,如下表:
蓝牙 ECB02 模块 | STM32 开发板 |
---|---|
RXD | TX-PC10 |
TXD | RX-PC11 |
GND | GND |
VCC | 3.3V |
下面代码包括:
初始化、发送AT指令、发送字符串、发送数据、接收判断、接收处理;
略过串口通信部分,因为,就是普通的、通用串口通信, 所不同的,只是增加了:
返回确认函数:UART4_WaitACK(待确认的返回字符,等待超时值ms);
- #include <stm32f10x.h> // 头文件引用(标准库); 内核、芯片外设....;(stm32f10x.conf.h, 对标准库头文件进行调用)
- #include "stm32f10x_conf.h" // 头文件引用(标准库); 内核、芯片外设....;(stm32f10x.conf.h, 对标准库头文件进行调用)
- #include "bsp_led.h" // LED指示灯
- #include "bsp_key.h" // 按键
- #include "bsp_usart.h" // USART1、2、3,UART4、5
-
-
-
-
- /******************************************************************************
- * 函 数: delay_ms
- * 功 能: 简单的延时函数
- * 参 数: uint32_t _ms 毫秒值
- * 返回值: 无
- ******************************************************************************/
- static void delay_ms(uint32_t ms) // 定义一个ms延时函数,减少移植时对外部文件依赖; 本函数仅作粗略延时使用,而并非精准延时;
- {
- ms = ms * 10286; // 注意:此参考值运行条件:打勾 Options/ c++ / One ELF Section per Function
- for (uint32_t i = 0; i < ms; i++); // 72MHz系统时钟下,大约多少个空循环耗时1ms
- }
-
-
-
- /******************************************************************************
- * 函 数: 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);
-
- 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=2\r\n"); // 设置主从机模式:0-由ROLE引脚配置、1-主机模式、2-从机模式
- if (UART4_WaitACK("OK", 2000) == 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+NAME=myECB02\r\n"); // 修改蓝牙名称。最大20字节,如果需要显示中文,请使用URL编码
- if (UART4_WaitACK("OK", 1000) == 0) // 等待指令执行返回; AT指令执行成功返回"OK"、执行失败不返回任何数据;
- goto error_ECB02_Init; // 错误:等待超时; 跳到错误处理
- printf("4- ECB02 蓝牙名称 配置完成\r"); // 输出提示:修改成功
-
- return 1; // 配置顺利完成,函数返回:1
-
- error_ECB02_Init: // 失败处理
- printf("ECB-02 配置失败!已跳过配置\r"); // 输出提示:配置失败
- return 0; // 返回:0-失败、1-成功
- }
-
-
-
- /******************************************************************************
- * 函 数: main
- * 功 能: 程序主函数
- ******************************************************************************/
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断分组,组2:抢占级0~3,子优先级0~3 ; 全局只设置一次,尽量放在显眼的地方
- USART1_Init(115200); // 串口1初始化; 用于与串口软件通信,方便代码调试; USART1(115200-N-8-1), 且工程已把printf重定向至USART1输出
- Led_Init(); // LED 初始化
- LED_BLUE_ON ; // 点亮蓝灯
- Key_Init(); // 按键 初始化
-
- ECB02_Init(); // 初始化ECB02:配置串口、从机模式、AT模式、蓝牙名称; 返回:0-失败、1-成功
-
- while (1) // while函数死循环,不能让main函数运行结束,否则会产生硬件错误
- {
- delay_ms(1); // 间隔延时
-
- if (xUSART1.ReceivedNum) // 检查串口助手所连接的USART1, 是否收到数据; 如果收到,就通过ECB02发出
- {
- UART4_SendString((char *)xUSART1.ReceivedData); // 把上位机发过来的数据,发送给ECB02
- printf("\r\n发送数据>>>:%s\r", (char *)xUSART1.ReceivedData); // 把所发送的数据,输出到串口上位机,方便观察
- xUSART1.ReceivedNum = 0; // 清空串口1的接收标志
- }
-
- if (xUART4.ReceivedNum) // 检查ECB02所连接的UART4, 否收到数据; 如果收到,就输出到串口助手,并判断其它动作
- {
- printf("\r\nECB02收到%d字节<<<:\r", xUART4.ReceivedNum); // 把接收收到的数据,输出到串口上位机,方便观察
- printf("%s\r", xUART4.ReceivedData); // 把接收收到的数据,输出到串口上位机,方便观察
- if (strstr((char *)xUART4.ReceivedData, "LED_ON")) LED_BLUE_ON; // 判断APP发过来的数据包,是否包含字符串:LED_RED_ON
- if (strstr((char *)xUART4.ReceivedData, "LED_OFF")) LED_BLUE_OFF; // 判断APP发过来的数据包,是否包含字符串:LED_RED_OFF
- xUART4.ReceivedNum = 0; // 清空串口1的接收标志
- }
- }
- }
-
6.1 解释---串口初始化
上面代码中,初始化了两个串口,
第一个是USART1,(PA9、PA10),波特率115200, 用于与串口助手通信,输出程序调试信息。
第二个是UART4,(PC10、PC11),波特率115200, 用于与蓝牙模块ECB02通信。
6.2 解释---如何发送
发送AT指令或数据,直接调用串口发送函数。模块会自动识别是指令,还是普通透传的数据。
注意:示例中所用发送函数,不是标准库的函数,而是用了魔女开发板提供的示例函数。
- UART4_SendString("AT指令\r\n"); // 发送AT指令字符串
- UART4_SendData(uint8_t *, Num) // 发送指定长度数据
6.3 解释---模块作为从机的配置
四个指令 :
6.4 解释---等待AT指令执行返回
在发送AT指令后:
- /******************************************************************************
- * 函 数: 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-正常返回期待值
- }
6.5 解释---如何接收、处理数据
- if (xUART4.ReceivedNum) // 检查ECB02所用的串口是否收到数据
- {
- printf("\r\nECB02收到%d字节<<<:\r", xUART4.ReceivedNum); // 把接收收到的数据,输出到串口上位机,方便观察
- printf("%s\r", xUART4.ReceivedData); // 把接收收到的数据,输出到串口上位机,方便观察
- // 判断数据以执行动作
- if (strstr((char *)xUART4.ReceivedData, "LED_ON")) LED_RED_ON; // 判断APP发过来的数据包,是否包含字符串:LED_RED_ON
- if (strstr((char *)xUART4.ReceivedData, "LED_OFF")) LED_RED_OFF; // 判断APP发过来的数据包,是否包含字符串:LED_RED_OFF
-
- xUART4.ReceivedNum = 0; // 清空串口1的接收标志
- }
注意1:ECB02需要配置好从机模式(名称不重要),才能被手机搜索到并连接。
注意2:下面二维码中小程序,是模块官方提供,功能虽简单,但测试方便。
至此,在电脑串口助手、手机小程序上,点击发送数据,即可自动收发数据,开发板收到数据后,判断进行处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。