W801蓝牙收发数据与控制设计(一)-INDICATE
这是目录
- 一、项目概述
- 二、程序设计
- 三、收发控制测试
- 四、功耗测试
- 五、参考
W801蓝牙收发数据与控制设计(一)-INDICATE
W801蓝牙收发数据与控制设计(二)-NOTIFY
本文使用环境:
主控:W801 (开发板)
兼容:W800 AIR101
一、项目概述
^^^^这篇教程主要介绍W801的BT使用,之前我一直存在畏难情绪,看着官方提供的硕大的SDK,难以下手。幸亏有前辈将BT剥离了出来,因此本文在前辈的基础上进一步完善程序,并将程序上传github,供大家参考。本文github地址。
^^^^程序功能: 通过手机蓝牙控制开发板的多个LED亮灭,同时开发板通过蓝牙返回收到的数据。
注意: 在蓝牙发送数据时,数据长度必须要小于256,否者接收不成功,同时数据接收按照u8类型接收,大家可以根据实际情况进行修正。
二、程序设计
1、修改demo文件
^^^^打开 wm_demo.h文件,做如下修改:
//demo console#define DEMO_CONSOLEDEMO_ON//DEMO_OFF
2、修改main文件
^^^^打开 mian.c文件,做如下修改:
void UserMain(void){//add by zxx startMy_task();//add by zxx end}
3、添加task任务
^^^^打开 wm_demo_console_task.c文件,添加如下函数:
//add by zxx start//以下几行代码添加在文件的开头#define MYBLE_TASK_SIZE 2048static 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 buffsend_data[i] = msg[i+1];}printf("\n");if(msg[1] != 0)tls_gpio_write(WM_IO_PB_05,1);elsetls_gpio_write(WM_IO_PB_05,0);if(msg[2] != 0)tls_gpio_write(WM_IO_PB_25,1);elsetls_gpio_write(WM_IO_PB_25,0);if(msg[3] != 0)tls_gpio_write(WM_IO_PB_26,1);elsetls_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 starttls_os_queue_t *ble_q = NULL;//重新定义一个数据uff//ble_data[0] 表示数据的长度,往后依次为数据u8 ble_data[255] = {0};//add by zxx endstatic intgatt_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 startif(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 startextern 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