调用tkl_cpu_allow_sleep()没有马上进入睡眠

Zigbee 子设备开发


Post Reply
hzb
Posts: 41

基于TLSR8258_TuyaOS-3.8.0使用ZTU模组二次开发, 产品是人体传感器(低功耗设备)

模组跟传感器使用串口通讯方式, 当设备请求网关下发的设置参数命令后,先调用tkl_cpu_force_wakeup();强制唤醒, 然后重新初始化串口,再向传感器发送配置数据,配置完成后(配置阶段只用了1-2秒),调用tkl_cpu_allow_sleep();允许睡眠,发现模组并不会马上睡眠,而是延迟大概5秒左右才会睡眠,导致整个唤醒周期变长。

请问调用tkl_cpu_allow_sleep(),模组会立马进入睡眠吗? 如果不是,这段延迟睡眠时间通过哪个参数调节呢?

Attachments
功耗.jpg
User avatar
huanghuan
Posts: 289

Re: 调用tkl_cpu_allow_sleep()没有马上进入睡眠

1.你好,tkl_cpu_allow_sleep()仅是应用允许设备进入低功耗的接口,协议栈在发送数据繁忙状态时不会进入休眠。
2.确认MCU与模块之间的管脚是否有唤醒电平导致无法进入休眠。
3.对照串口通用对接demo进行排查。https://www.tuyaos.com/viewtopic.php?p= ... %A5#p10732
4.使用新版版 3.11.1进行开发

hzb
Posts: 41

Re: 调用tkl_cpu_allow_sleep()没有马上进入睡眠

好的,我申请新版本3.11.1再试下, 另外在请教下,在数据上报时有时候会存在延迟或失败,以下是封装的发送数据函数:

void private_dpid_report(TAL_SEND_QOS_E qos, USHORT_T delay_ms, UINT8_T *data, UINT8_T len)
{
TAL_ZG_SEND_DATA_T send_data;
tal_system_memset(&send_data, 0, sizeof(TAL_ZG_SEND_DATA_T));

Code: Select all

send_data.zcl_id = 1;//++zcl_seq;
send_data.qos = qos;
send_data.frame_type = ZG_ZCL_FRAME_TYPE_SPEC_TO_CLUSTER;
send_data.direction = ZG_ZCL_DATA_SERVER_TO_CLIENT;
send_data.command_id = 0x06; // TY_MODULE_DATA_REPORT

send_data.addr.mode = SEND_MODE_DEV;
send_data.addr.type.dev.dst_addr = TUYA_GATEWAY_ADDRESS;
send_data.addr.type.dev.dst_ep = 0x01;
send_data.addr.type.dev.src_ep = TUYA_PRIMARY_ENDPOINT;
send_data.addr.type.dev.cluster_id = CLUSTER_PRIVATE_TUYA_CLUSTER_ID;

send_data.delay_time = delay_ms;
send_data.random_time = 0;
send_data.data.private.len = len;
tal_system_memcpy((send_data.data.private.data),data,len);

tal_zg_send_data(&send_data, NULL, 1000);

}

调用格式:private_dpid_report(QOS_1, 0, buffer, 7);

请问下以上函数是否正确,为什么会有时候上报延时或失败,另外在同一时间内多次调用tal_zg_send_data函数是否要求

User avatar
huanghuan
Posts: 289

Re: 调用tkl_cpu_allow_sleep()没有马上进入睡眠

1.无线发送存在背噪,无线干扰,调制解调等因素,不可能做到100%发送成功。
2.对于低功耗设备发送来说,数据延时发送依赖poll的间隔配置,相关参数你可以查看https://support.tuya.com/zh/help/_detail/Kdajf848dswec
3.依次调用send 函数会进入发送队列,15个上限,vip队列是8个。如果是同一个dp数据,建议通过clear之前数据来释放老旧队列数据
4.你可以增加send data函数的发送时间,来提高发送的可靠性。tal_zg_send_data(TAL_ZG_SEND_DATA_T *pdata, TAL_SEND_RESULT_CB callback, UINT_T timeout); 中的timeout时间

User avatar
huanghuan
Posts: 289

Re: 调用tkl_cpu_allow_sleep()没有马上进入睡眠

3.11.1 版本串口配置完成后,配置串口参数不需要改变的情况下,唤醒后将不再需要再次配置串口,sdk已经接管了相关串口再次初始化。

Post Reply