本文使用环境:
主控:W801 (开发板)
兼容:W800 AIR101
蓝牙调试器:如下图
参考前文:
W801蓝牙收发数据与控制设计(一)-INDICATE
W801蓝牙收发数据与控制设计(二)-NOTIFY方式
一、项目概述
^^^^这篇文章在前两文的代码基础上完成。本文github地址
^^^^程序功能: 使用蓝牙调试器搭建界面,控制开发板的七个LED亮灭,并将开发板的电压和温度上传到蓝牙app上。
二、程序设计
1、接收程序设计
接收一字节即八位数据,分别控制七个灯,一位空闲不用。开发板接收数据格式为:
代码如下:
//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...rn",om->om_len);
return 0;
}
//有效数据需要减三
ble_data[0] = om->om_len-3;
//将数据转存到buff中,ble_data[0]是数据的长度,长度必须小于255-1,否者下列循环会出问题。
//蓝牙发送过来的数据格式为:0xA5 数据(n个) 校验 0x5a,因此数据的第二位才是有效数据,同时需要将数据的前一位和后三位排除
for (u8 i = 1; i <= om->om_len-3; i++) {
ble_data[i] = 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;
}
}
2、task程序设计
^^^^和前文的区别在于本文需要发送两个float类型的数据,使用共同体对数据进行封装。数据存入adc_f,发送adc_i即可。开发板发送数据格式:
//add by zxx start
//发送数据的长度:0x5a+data_len+校验+0xa5
//校验位是有效数据的和不包括帧头和尾部
send_data_len = 11;
typedef union ADC_DATA
{
u8 adc_i[8];
float adc_f[2];
}ADC_DATA;
//add by zxx end
^^^^控制LED需要单独提取每一位,具体任务函数,LED的IO分别是:B5、B25、B26、B18、B17、B16、B11。具体看代码
//add by zxx start
void my_ble_msg_task(void *sdata)
{
//传过来的消息队列指针,这里我定义的是u8类型的
u8 *msg;
//蓝牙发送数据
u8 send_data[20] = {0x00};
//定义共同体
ADC_DATA adc_data;
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 rn");
//初始化IO口,注意对应开发板上的IO 这里使用5 25 26
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);
tls_gpio_cfg(WM_IO_PB_18, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_17, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_16, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_11, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
for(;;)
{
//接收手机发送的数据,注意是数据是按照字节进行的接收
tls_os_queue_receive(ble_q,&msg, 0, 0);
//打印ble收到数据的长度
printf("ble revice len:%dn",msg[0]);
//依次打印收到的ble数据,只算有效数据的长度
for(u8 i=0;i }printf("n"); //分别判断每一位数据,注意需要把每一位数据移到最低位进行判断,对应开关灯:00 开 其他数据 关 if(msg[1]&0x01 != 0) tls_gpio_write(WM_IO_PB_05,0); else tls_gpio_write(WM_IO_PB_05,1); if(msg[1]>>1&0x01 != 0) tls_gpio_write(WM_IO_PB_25,0); else tls_gpio_write(WM_IO_PB_25,1); if(msg[1]>>2&0x01 != 0) tls_gpio_write(WM_IO_PB_26,0); else tls_gpio_write(WM_IO_PB_26,1); if(msg[1]>>3&0x01 != 0) tls_gpio_write(WM_IO_PB_18,0); else tls_gpio_write(WM_IO_PB_18,1); if(msg[1]>>4&0x01 != 0) tls_gpio_write(WM_IO_PB_17,0); else tls_gpio_write(WM_IO_PB_17,1); if(msg[1]>>5&0x01 != 0) tls_gpio_write(WM_IO_PB_16,0); else tls_gpio_write(WM_IO_PB_16,1); if(msg[1]>>6&0x01 != 0) tls_gpio_write(WM_IO_PB_11,0); else tls_gpio_write(WM_IO_PB_11,1); //返回打开成功信息: adc_data.adc_f[0] = (float)adc_get_interVolt()/1000.0; adc_data.adc_f[1] = (float)adc_temp()/1000.0; //0xa5(0) 8个数据(1-8字节) 校验(9) 0x5a(10) send_data[0] = 0xA5; send_data[send_data_len-2] = 0; for(u8 i=0;i<8;i++) { //转存数据到发送数组 send_data[i+1] = adc_data.adc_i[i]; //计算校验和 send_data[send_data_len-2] += adc_data.adc_i[i]; } /* send_data[1] = adc_data.adc_i[0]; send_data[2] = adc_data.adc_i[1]; send_data[3] = adc_data.adc_i[2]; send_data[4] = adc_data.adc_i[3]; send_data[5] = adc_data.adc_i[0]+adc_data.adc_i[1]+adc_data.adc_i[2]+adc_data.adc_i[3]; */ send_data[send_data_len-1] = 0x5A; //printf("send state:%d rn",tls_ble_server_demo_api_send_msg(send_data,7)); //printf("send state:%d rn",tls_ble_server_demo_api_send_msg(send_data,3)); printf("send state:%d %f %frn",tls_ble_server_demo_api_send_notify_msg(send_data,send_data_len),adc_data.adc_f[0],adc_data.adc_f[1]); } } //创建任务 void My_task(void) { if(tls_os_queue_create(&ble_q, 32)!=TLS_OS_SUCCESS) { printf("create queue failn"); 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 三、测试 四、附件 其界面:
上一篇:W800-KIT-蓝牙-温湿度传感器(cht8305c)-RGB灯-demo
下一篇:W801/W800蓝牙收发数据与控制设计(二)-NOTIFY
推荐阅读最新更新时间:2024-11-05 16:21
设计资源 培训 开发板 精华推荐
- AD9522-3/PCBZ,基于 AD9522-3 的评估板,12 LVDS/24 CMOS 输出时钟发生器,集成 2 GHz VCO
- LTC3896EFE 高效率 36 - 72Vin、-48V/2A 反相稳压器的典型应用电路
- 使用具有 PowerPath 和 2A 输入限制的 LTC4162IUFD-LADM 9V 至 35V、2 节电池、3.2A 充电器的典型应用
- L4993DTR低压降稳压器典型应用电路
- AM3G-4812SZ 12V 3 瓦 DC/DC 转换器的典型应用
- Wemos D1 mini 扩展板
- RY-0515D ±15V、33mA输出DC/DC转换器典型应用电路
- 使用 Analog Devices 的 LT1108CS8 的参考设计
- 具有短路保护功能的 NCV78M15BDTG 15V 电流提升的典型应用
- ADR3425 2.5V 输出微功率、高精度电压基准的典型应用
- ELEXCON 2022 深圳国际电子展11月6日(新档期)开幕,速领门票!更有N重好礼等你拿!
- ublox无线开发板EVK-NINA-B400免费申请
- Littelfuse第2期 | 符合AEC-Q200 车规的保险丝/熔断器
- 全民行动,大家一起上干货!发表,推荐干货就有礼~
- 基于USB PD受电协议芯片CH224 DIY创意秀
- 全新吉时利4200A SCS参数分析仪震撼上市,邀您参与翻盖有礼!
- 有奖直播: 解读安森美半导体电源解决方案 ,聚焦服务器电源、光伏逆变器
- 泰克任意波形发生器,跨越成本极限,克服挑战
- 6小时狂欢,谁是2016年TI杯全国大学生物联网设计竞赛最高人气王,你说了算!
- 【已结束】 电感应用知识分享|MPS 有奖直播