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 條評論

發布
問題