STM32---蓝牙模块ECB02(从机模式_与手机通信)

目录

1、ECB02 重点 参数

2、引脚说明

3、AT指令使用重点 

4、使用USB转TTL模块测试

5、STM32开发板的接线

6、STM32通信代码

7、手机小程序 连接ECB02


1、ECB02 重点 参数

  • 蓝牙协议: 5.2
  • 主从模式:主、从一体,可设置
  • 睡眠模式:芯片支持(不同的模块,需要有SLEEP或EN引脚才支持)
  • 工作电压:3.3V(有部分模块型号带LDO支持5V)
  • 串口通信:AT指令、115200-NULL-8-1、连接后透传
  • 通信距离:室内实测10米内,能隔一堵墙;  空旷几十米
  • 工作电流:大约5mA
  • 支持平台:Win10及以上、iPhone4S以上, Android 4.4以上,微信小程序、支付宝小程序
  • 每帧数量:244字节,  ≤511字节会自动分包并连续发送,≥512字节会发生数据错乱

2、引脚说明


3、AT指令使用重点 

ECB02的AT指令总数量有60+,配置灵活性相当高。

出厂的默认固件,已配置好常用参数,使用时只需要几个简单的配置指令。

链接1:ECB02 官方资料下载

链接2:ECB02 指令集说明整理

AT指令重点:

  • 通信方式: UART
  • 波特率:    115200。注意:ECB01默认9600,ECB02默认115200
  • 大小写:    必须大写
  • 结尾标志:”\r\n",即通用的 0x0D、0x0A。串口助手打勾“加回车换行”。
  • 参数修改:自动保存,掉电不失。
  • 指令特色:1-连接成功进入透传后,AT指令仍可生效,这个特有意思。
  •                   2-AT指令,成功时返回信息中都包含 "OK",方便判断;  不成功不返回任何作息。
  •                   3-连接成功返回:“CONNECT OK”, 连接断开返回:"DISCONNECT"

 

从机 常用指令

即:被动地等待其它主机设备的搜索发现、连接,如另一模块、手机等

  1. AT+FACTORY\r\n ;               // 恢复出厂设置,         返回:“OK\r\n” 
  2. AT+ROLE=2\r\n ;                  // 设置从机模式,         返回:“OK\r\n”
  3. AT+MODE=1\r\n ;                 // 连接后AT指令有效, 返回:“OK\r\n”
  4. AT+NAME=myECB02\r\n ;    // 设置蓝牙名称,        返回:“OK\r\n”

主机 常用指令

即:作为主控方,主动地搜索、连接其它从机设备

  1. AT+FACTORY\r\n  ;                         // 恢复出厂设置,         返回:“OK\r\n” 
  2. AT+ROLE=1\r\n ;                             // 设置主机模式,         返回:“OK\r\n”
  3. AT+BONDC\r\n ;                              // 清除旧的从机绑定,  返回:“OK\r\n”
  4. AT+MODE=1\r\n ;                            // 连接后AT指令有效, 返回:“OK\r\n”
  5. AT+BONDNAME=myECB02\r\n ;    // 绑定从机蓝牙设备,  返回:“OK\r\n”

4、使用USB转TTL模块测试

建议刚上手使用ECB02模块时,先通过USB转TTL模块测试、熟悉AT指令。

待测试成功,再连接至STM32板子,以减少代码调试的时间。

4.1  连接USB转TTL模块

      使用最常用的串口通信接线方式即可。重点:双方的RX、TX反接

蓝牙 HC-08 模块USB转TTL模块 
RXDTXD
TXDRXD
GNDGND
VCC3.3V 或 5V

4.2   串口软件 参数设置

打开任意一款串口软件,如XCOM, SSCOM等等。本笔记中,使用SSCOM的串口助手。

( SSCOM串口助手,已包含在文末网盘的资料包中 。)

  1. 选择相应的串口号
  2. 选择波特率,模块默认 115200
  3. 打开串口

4.3   AT指令通信测试

在串口助手 右方,输入如图所示AT指令组合 。如图,分了上下两组,上面是作为从机模式的指令组合 ,下面是作为主机模式时绑定从机蓝牙名字的指令组合。

点击发送按钮,可返回相应的指令反馈信息。

如果没有返回信息,逐一检查下面步骤:

  • 查看接线, TX、RX有没有反接
  • 查看串口号,查看波特率
  • 保证AT指令大写
  • 保证AT指令尾部已带回车换行符,或打勾"回车换行“

5、STM32开发板的接线

ECB02模块,与STM32开发板的连接,本笔记使用UART4(TX-PC10, RX-PC11)。

当然,没有规定一定要使用串口4, 可自行修改为其它空闲的串口引脚

本篇,引脚连接,如下表:

蓝牙 ECB02 模块STM32 开发板
RXDTX-PC10
TXDRX-PC11
GNDGND
VCC3.3V 


6、STM32通信代码

下面代码包括:

初始化、发送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 Functionfor (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;                                        // 配置顺利完成,函数返回:1error_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);                        // 把上位机发过来的数据,发送给ECB02printf("\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_ONif (strstr((char *)xUART4.ReceivedData, "LED_OFF"))    LED_BLUE_OFF;   // 判断APP发过来的数据包,是否包含字符串:LED_RED_OFFxUART4.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  解释---模块作为从机的配置

四个指令 :

  1. AT+FACTORY\r\n ;               // 恢复出厂设置,         返回:“OK\r\n” 
  2. AT+ROLE=2\r\n ;                  // 设置从机模式,         返回:“OK\r\n”
  3. AT+MODE=1\r\n ;                 // 连接后AT指令有效, 返回:“OK\r\n”
  4. AT+NAME=myECB02\r\n ;    // 设置蓝牙名称,        返回:“OK\r\n”

6.4  解释---等待AT指令执行返回

在发送AT指令后:

  • 执行成功,返回消息中会包含"OK”字符串;
  • 执行失败,不返回任何消息。同时,连接后发送数据,也不返回任何消息。
/******************************************************************************* 函  数: 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  解释---如何接收、处理数据

  • bsp_USART.c中,已封装好接收中断,外部只管判断接收字节数量>0, 即为接收到新数据
  • 处理完一帧数据后,记得要把串口的接收字节数量,赋0,不然下个循环会误判出错。
        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_ONif (strstr((char *)xUART4.ReceivedData, "LED_OFF"))    LED_RED_OFF;    // 判断APP发过来的数据包,是否包含字符串:LED_RED_OFFxUART4.ReceivedNum = 0;                                                // 清空串口1的接收标志}

7、手机小程序 连接ECB02

注意1:ECB02需要配置好从机模式(名称不重要),才能被手机搜索到并连接。

注意2:下面二维码中小程序,是模块官方提供,功能虽简单,但测试方便。

  • 手机,打开蓝牙功能;
  • 用微信扫描下方二维码,以打开小程序;
  • 打开小程序后,稍等两秒,它将自动搜索附近的蓝牙设备; 下拉也可以刷新列表。
  • 点击要连接的蓝牙名称,如myECB02,将自动连接,并跳转到通信收发页面。

至此,在电脑串口助手、手机小程序上,点击发送数据,即可自动收发数据,开发板收到数据后,判断进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac远程桌面连接工具:Microsoft Remote Desktop正式版

Microsoft Remote Desktop 是一款由微软开发的远程桌面控制软件。它允许用户通过互联网连接到远程计算机&#xff0c;从而可以在本地计算机上访问和控制远程计算机的桌面、文件和应用程序。 下载地址&#xff1a;https://www.macz.com/mac/1004.html?idOTI2NjQ5Jl8mMjcuMTg2Lj…

x264 码率控制 MBtree 原理:mbtree_propagate_list 函数分析

mbtree_propagate_list 函数功能 是视频编码中宏块树传播算法的一部分,用于在编码决策过程中更新参考帧的传播成本。这个过程特别关注于如何处理运动向量(Motion Vectors, MVs)以及如何根据这些MVs对参考帧的成本进行加权,从而影响最终的编码选择。 该函数作为x264编码器…

Servlet的request对象

request对象的继承关系 1.HttpServletRequest接口继承了ServletRequest接口&#xff0c;对其父接口进行了扩展&#xff0c;可以处理满足所有http协议的请求 2.HttpServletRequest和ServletRequest都是接口&#xff0c;不能创建对象&#xff0c;因此在tomcat底层定义实现类并创…

modbus开源库libmodbus的C语言使用记录(实现简单的modbus主机/丛机程序,解决libmodbus库安装出现的问题)

libmodbus简介 libmodbus 是一个开源的、跨平台的C库,用于实现Modbus通讯协议。它支持Modbus RTU(RS-232/485)和Modbus TCP协议,可以使开发者方便地在项目中集成Modbus通讯功能。libmodbus的设计目标是简单、灵活和高效,适用于各种大小的嵌入式和桌面应用。 编译运行测试…

ffpmeg windows WSl 编译so

1.NDK 环境变量配置 2.git clone ffpmeg 3.创建脚本&#xff08;需先下载gcc编译器&#xff09; 64位脚本如下 #!/bin/bashexport NDK/home/test/ndk20 #这里配置先你的 NDK 路径 TOOLCHAIN$NDK/toolchains/llvm/prebuilt/linux-x86_64function build_android {./configure \ …

鸿蒙ArkUI-X跨平台技术:【SDK结构介绍】

ArkUI-X SDK目录结构介绍 简介 本文档配套ArkUI-X&#xff0c;将OpenHarmony ArkUI开发框架扩展到不同的OS平台&#xff0c;比如Android和iOS平台&#xff0c;让开发者基于ArkUI&#xff0c;可复用大部分的应用代码&#xff08;UI以及主要应用逻辑&#xff09;并可以部署到相…

RedHat9 | 配置转发DNS服务器

一、实验环境 1、介绍 转发服务器&#xff08;Forwarding Server&#xff09;接收查询请求&#xff0c;但不直接提供DNS解析&#xff0c;而是将所有查询请求发送到另外的DNS服务器&#xff0c;将查询的结果返回后保存到缓存中。如果没有指定转发服务器&#xff0c;DNS服务器会…

【Unity Shader入门精要 第8章】透明效果(二)

1. 透明度测试 透明度测试的原理是将片元的 Alpha 值与某个指定的阈值进行比较&#xff0c;当 Alpha 超过阈值时&#xff0c;该片元正常显示&#xff0c;若 Alpha 值低于指定的阈值&#xff0c;则将该片元丢弃。准确来讲&#xff0c;透明度测试并不是为了渲染一种半透的效果&a…

IS-IS基本配置 IS-IS邻接关系

一.IS-IS基本配置 原理概述 和 OSPF 路由协议一样&#xff0c; IS-IS 也是一个应用非常广泛的 IGP 路由协议&#xff0c;很多 ISP 网络、特别是大型的ISP网络都部署了IS-IS网络协议。 RIP 、 OSPF 等许多 IGP 都是针对 IP ( Internet Protocol &#xff09;这个网络层协议而开…

二、信号连接槽函数

需求&#xff1a;点击Button按钮&#xff08;下班&#xff09;&#xff0c;label显示淦饭 信号发出者&#xff1a;Button 发送的信号&#xff08;signals&#xff09;&#xff1a;被点击 信号接收者&#xff1a;label 信号的处理&#xff08;slots&#xff09;&#xff1a;显示…

0基础安装 composer

解决&#xff1a; composer 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 php composer.phar可以运行 安装环境&#xff1a;系统w11 官网地址&#xff1a;Composer 1.安装composer 1.1打开命令行窗口 在命令行窗口里&#xff0c;右键是粘贴&#xff0…

精准安全运维,统信UOS服务器版V20(1070)漏洞修复指南丨年度更新

随着信息安全威胁的不断升级&#xff0c;操作系统的安全性已成为企业运维的关键要素。 为了确保业务运行环境的安全无忧&#xff0c;统信软件持续致力于技术创新和优化&#xff0c;并于日前重磅推出了统信UOS服务器版V20&#xff08;1070&#xff09;。该系统提供了高频补丁更…

Excel模板计算得出表格看板

背景 表格看板及导出&#xff0c;单元格时间年是根据筛选器时间变化的 较往年和往年是计算单元格 思路 1.通过excel模板来把数据填入excel再数据清洗得到数据返回前端 2.数据填充&#xff0c;通过行列作为key 列如&#xff1a;key整体20241月&#xff0c;根据key匹配数据填…

马蹄集 oj赛(双周赛第二十七次)

目录 栈的min 外卖递送 奇偶序列 sort 五彩斑斓的世界 括号家族 名次并列 栈间 双端队列 合并货物 逆序对 活动分组 栈的min 难度:黄金巴 占用内存:128 M时间限制:1秒 小码哥又被安排任务了&#xff0c;这次他需要要设计一个堆栈&#xff0c;他除了可以满足正常的栈…

半导体测试基础 - AC 参数测试

AC 测试确保 DUT 的时特性序满足其规格需求。 基本 AC 参数 建立时间(Setup Time) 建立时间指的是在参考信号(图中为 WE)发生变化(取中间值 1.5V)前,为了确保能被正确读取,数据(图中为 DATA IN)必须提前保持稳定不变的最短时间。在最小建立时间之前,数据可以随意变…

ROS | 实现SLAM的功能

用launch文件启动Hector_Mapping的建图功能 1.引入launch文件 2.args是引入的设置好的rviz文件 Hector_Mapping建图的参数设置

141.字符串:重复的字符串(力扣)

题目描述 代码解决 class Solution { public:// 计算字符串s的next数组&#xff0c;用于KMP算法void getNext(int *next, const string& s){int j 0; // j是前缀的长度next[0] 0; // 初始化next数组&#xff0c;第一个字符的next值为0for (int i 1; i < s.size(); …

2024 中青杯高校数学建模竞赛(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 长三角高校数学建模竞赛&#xff08;A题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过…

ubuntu server 22.04 使用docker安装 onlyoffice 8.0同时添加中文字体、字号

本文主要介绍在ubuntu server 22.04 系统上使用docker安装onlyoffice 8.0同时添加中文字体、字号方法。 1、硬件要求 CPU&#xff1a;双核2 GHz或更高 内存&#xff1a;最少4GB 硬盘&#xff1a;至少40 GB可用空间 Swap file&#xff1a;至少4 GB&#xff0c;但取决于主机操作…

[GUET-CTF2019]encrypt

我自己大致分析的是输入flag然后先 RC4加密再 base64加密&#xff0c;解了一下发现不对。 那就只能仔细分析了&#xff0c;看有没有魔改 嗯&#xff0c;可以动调试试&#xff0c;嗯就是要找其 key 的值 &#xff1a;0x10,0x20,0x30,0x30,0x20,0x10,0x40 aaaaaaaaaa--->dd…