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

W801蓝牙收发数据与控制设计(一)-INDICATE
W801蓝牙收发数据与控制设计(二)-NOTIFY
W800-KIT-蓝牙-温湿度传感器(cht8305c)-RGB灯-demo

本文使用环境:
主控: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

注意: 有同学遇到过,indicate只能接收第一条信息,后续信息无法接收的情况请做如下修改:

int tls_ble_server_demo_api_send_msg(uint8_t *data, int data_len)
{
    int rc;
    struct os_mbuf *om;
    
    //屏蔽下列函数
    //TLS_BT_APPL_TRACE_DEBUG("### %s len=%d\r\n", __FUNCTION__, data_len);
    //if(g_send_pending) return BLE_HS_EBUSY;

    if(data_len<=0 || data == NULL)
    {
        return BLE_HS_EINVAL;
    }
    
    om = ble_hs_mbuf_from_flat(data, data_len);
    if (!om) {
        return BLE_HS_ENOMEM;
    }
    rc = ble_gattc_indicate_custom(g_ble_demo_conn_handle,g_ble_demo_attr_indicate_handle, om); 
	//可屏蔽可不屏蔽
	/*
    if(rc == 0)
    {
        g_send_pending = 1;
    }
	*/
    return rc;
}

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

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
基于W801单片机的智能手机充电器是一种能够更加智能化管理和保护手机充电的设计方案。这款充电器采用了W801单片机作为主控芯片,通过其强大的计算和控制能力,实现了多种功能和优化。 首先,基于W801单片机的充电器可以根据手机电池的容量和电压等信息,智能调节充电电流和电压。通过与手机之间的通信,充电器可以了解手机电池的具体状态,并根据需要进行快速充电或是低电流充电,以达到最佳充电效果,同时避免过度充电对手机电池的损害。 其次,充电器还具备安全保护功能。例如,基于W801单片机的充电器可以实现过充保护,当手机电池充满后自动停止充电,避免过度充电导致手机电池损坏。另外,充电器还可以监测电流和电压的异常情况,一旦发现异常即刻停止充电,确保手机充电安全。 此外,基于W801单片机的充电器还可以具备智能管理功能。它可以通过内置的计时器功能,记录手机充电时间和充电历史,帮助用户了解充电习惯和充电特点。同时,它还可以与用户的手机APP进行连接,实现远程控制和监测。用户可以通过手机APP查看充电器状态、调整充电参数等。 综上所述,基于W801单片机的智能手机充电器设计具备智能调节充电电流和电压、安全保护功能以及智能管理等特点,能够更好地满足用户对手机充电的需求,提供更加智能和安全的充电体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr·赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值