W801 蓝牙收发数据与控制设计 (一) -INDICATE

发布于 2022-04-16 17: 39: 17

@TOC

W801 蓝牙收发数据与控制设计 (一) -INDICATE
W801 蓝牙收发数据与控制设计 (二) -NOTIFY

本文使用环境:
主控: W801 (开发板)
兼容: W800 AIR101

一, 项目概述

^^^^这篇教程主要介绍 W801 的 BT 使用, 之前我一直存在畏难情绪, 看着官方提供的硕大的 SDK, 难以下手. 幸亏有前辈将 BT 剥离了出来, 因此本文在前辈的基础上进一步完善程序, 并将程序上传 github, 供大家参考. 本文 github 地址.

^^^^程序功能: 通过手机蓝牙控制开发板的多个 LED 亮灭, 同时开发板通过蓝牙返回收到的数据.

注意: 在蓝牙发送数据时, 数据长度必须要小于 254, 否者接收不成功, 同时数据接收按照 u8 类型接收, 大家可以根据实际情况进行修正.

二, 程序设计

1, 修改 demo 文件
^^^^打开 wm_demo. h文件, 做如下修改:

//demo console
#define DEMO_CONSOLE                DEMO_ON//DEMO_OFF

2, 修改 main 文件
^^^^打开 mian. c文件, 做如下修改:

void UserMain (void) 
{
//add by zxx start
    My_task () ; 
//add by zxx end
}

3, 添加 task 任务
^^^^打开 wm_demo_console_task. c文件, 添加如下函数:

//add by zxx start

//以下几行代码添加在文件的开头
#define    MYBLE_TASK_SIZE      2048
static OS_STK             MyBLETaskStk[MYBLE_TASK_SIZE]; 
#define  MYBLE_TASK_PRIO               32

//以下文件添加在文件的末尾
void my_ble_msg_task (void *sdata) 
{
    //传过来的消息队列指针,  这里我定义的是 u8 类型的
    u8 *msg; 
    //蓝牙发送数据
    u8 send_data[20] = {0x00};  
    
    demo_bt_enable () ; 
    while (bt_adapter_state == WM_BT_STATE_OFF) 
    {
        tls_os_time_delay (5000 /HZ) ; 
    }
    tls_os_time_delay (5000 /HZ) ; 
    demo_ble_server_on () ; 
    printf ("ble ready ok \r\n") ; 
    
    tls_gpio_cfg (WM_IO_PB_05,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
    tls_gpio_cfg (WM_IO_PB_25,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
    tls_gpio_cfg (WM_IO_PB_26,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
    
    for (; ; ) 
    {
        tls_os_queue_receive (ble_q, &msg,  0,  0) ; 
        //打印 le 收到数据的长度
        printf ("ble revice len: %d\n", msg[0]) ; 
        //依次打印收到的 ble 数据
        for (u8 i=0; i msg[0]; i++) {
            printf ("%x ", msg[i+1]) ; 
            //收到的数据存到 send_data buff
            send_data[i] = msg[i+1]; 
        }printf ("\n") ; 
        
        if (msg[1] ! = 0) 
            tls_gpio_write (WM_IO_PB_05, 1) ; 
        else
            tls_gpio_write (WM_IO_PB_05, 0) ; 
        if (msg[2] ! = 0) 
            tls_gpio_write (WM_IO_PB_25, 1) ; 
        else
            tls_gpio_write (WM_IO_PB_25, 0) ; 
        if (msg[3] ! = 0) 
            tls_gpio_write (WM_IO_PB_26, 1) ; 
        else
            tls_gpio_write (WM_IO_PB_26, 0) ; 
            //返回收到的数据
            printf ("send state: %d \r\n", tls_ble_server_demo_api_send_msg (send_data, 3) ) ; 
    }
}
void My_task (void) 
{
    if (tls_os_queue_create (&ble_q,  32) ! =TLS_OS_SUCCESS) 
    {
        printf ("create queue fail\n") ; 
        return; 
    }
    tls_os_task_create (NULL,  NULL, 
                       my_ble_msg_task, 
                       NULL, 
                        (void *) MyBLETaskStk,           /* task's stack start address */
                       MYBLE_TASK_SIZE * sizeof (u32) ,  /* task's stack size,  unit: byte */
                       MYBLE_TASK_PRIO, 
                       0) ; 
}
//add by zxx end

4, 修改蓝牙数据接收函数
^^^^打开 wm_ble_server_api_demo. c文件, 对gatt_svr_chr_demo_access_func函数做如下修改:


//add by zxx start
tls_os_queue_t     *ble_q = NULL; 

//重新定义一个数据 uff
//ble_data[0] 表示数据的长度,  往后依次为数据
u8 ble_data[255]  = {0}; 

//add by zxx end
static int
gatt_svr_chr_demo_access_func (uint16_t conn_handle,  uint16_t attr_handle, 
                               struct ble_gatt_access_ctxt *ctxt,  void *arg) 
{
    int i = 0; 
    struct os_mbuf *om = ctxt- om; 
    
    switch  (ctxt- op)  {
        case BLE_GATT_ACCESS_OP_WRITE_CHR: 
              while (om)  {
                  if (g_ble_uart_output_fptr) 
                  {
                    g_ble_uart_output_fptr ( (uint8_t *) om- om_data,  om- om_len) ; 
                    
                  }else
                  {
                     
                    //print_bytes (om- om_data,  om- om_len) ;  
                    //add by zxx start
                    if (om- om_len   200) 
                    {
                        printf ("ble om- om_len is too long: %d  return 0 please check send data length. . . \r\n", om- om_len) ; 
                        return 0; 
                    }
                    
                    ble_data[0] = om- om_len; 
                    //将数据转存到 buff 中,  ble_data[0]是数据的长度,  长度必须小于 255-1,  否者下列循环会出问题.  
                    for  (u8 i = 0;  i   om- om_len;  i++)  {
                        ble_data[i+1] = om- om_data[i]; 
                    }
                     if (om- om_len 0) 
                        {
                            tls_os_queue_send (ble_q, ble_data,  0) ; 
                        }
                    //add by zxx end
                  }
                  om = SLIST_NEXT (om,  om_next) ; 
              }
              return 0; 
        default: 
            assert (0) ; 
            return BLE_ATT_ERR_UNLIKELY; 
    }
}

^^^^打开 wm_ble_server_api_demo. h文件, 做如下修改:

//add by zxx start
extern tls_os_queue_t     *ble_q; 
//add by zxx end

5, 添加头文件
wm_include. h文件中添加如下头文件:

#include "wm_bt_app. h"
#include "wm_ble_server_api_demo. h"

6, 编译工程并下载到开发板.

三, 收发控制测试

1, 下载助手
^^^^手机下载蓝牙调试助手, (不一定是我这款)
在这里插入图片描述

2, 连接 app
^^^^打开并连接到 WM-XX: XX: XX 的蓝牙上. 第一次使用需要打开配置如下所示:
在这里插入图片描述
必须进行如下配置: ==TX 选择 xxxxf1, RX 选择 xxxxf2==, 否者无法正常接收数据.

3, 测试
^^^^正常连接后, 电脑端的串口助手会显示如下:
在这里插入图片描述

^^^^发送消息: == -00 01 00==, 可以看到正常收到开发板返回的消息: - 00 01 00
手机显示如下:
在这里插入图片描述

串口助手显示如下:
在这里插入图片描述
开发板状态如下:
在这里插入图片描述

4, 写在后面
多说一句, 这个 app 还是很不错的, 有界面可以控制发送不同指令:
在这里插入图片描述
设定每一个按钮过后, 可以直接点击发送, 方便快捷, 最上方可以显示收到的数据.

四, 功耗测试

本次测试仅供参考:
在这里插入图片描述

五, 参考

参考文章: link

0 条评论

发布
问题