找回密码
 立即注册

微信扫码登录

查看: 172|回复: 4

[BLE Mesh] tc_ble_mesh SDK,打开 MD_SENSOR_EN 后,提示发送缓冲区溢出,如何处理。

[复制链接]

4

主题

3

回帖

40

积分

英勇黄铜

积分
40
发表于 2025-9-25 09:50:49 | 显示全部楼层 |阅读模式 来自 广东深圳
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: TLSR8258
SDK及版本: tc_ble_mesh V4.1.0.1_Patch_0002
打开 MD_SENSOR_EN 后,模型发布参数时提示:[ERR]:tx upper layer failed: 6(see tx_errno_e)。表示发送缓冲区溢出,如何处理。



enum tx_errno_e{
        TX_ERRNO_SUCCESS                                        = 0,
        TX_ERRNO_DEV_OR_APP_KEY_NOT_FOUND        = 1,/* device key or app key not found */
        TX_ERRNO_GET_UT_TX_BUF_FAIL                        = 2,/* get the upper layer tx buffer fail */
        TX_ERRNO_ADDRESS_INVALID                        = 3,/* source address or destination address invalid */
        TX_ERRNO_PAR_LEN_OVER_FLOW                        = 4,/* parameters length > 378 */
        TX_ERRNO_TX_BUSY                                        = 5,/* segment busy, reliable busy,... */
        TX_ERRNO_TX_FIFO_FULL                                = 6,/* tx fifo full: mesh_adv_cmd_fifo_(normal message) or mesh_adv_fifo_fn2lpn_(message from friend to LPN)*/
        TX_ERRNO_PAR_LEN_LPN_CTL                        = 7,/* All transport control messages originated by a Low Power node shall be sent as Unsegmented */
        TX_ERRNO_IV_INVALID                                 = 8,/* have not get iv index after import JSON */
        TX_ERRNO_ALL_OTHER_ERR                                 = -1,/* default error */
};


执行到下述代码的 model_pub_check_set 函数时出现:

u32 sensor_measure_proc()
{
        //foreach(i, SENSOR_NUMS){ // TODO
                sensor_cadence_t *p_cadence = &model_sig_sensor.sensor_states[0].cadence;
                sensor_data_t * p_sensor_data = &sensor_data[0];

                u32 sample_interval = 1 << sensor_descrip[0].measure_period;
                if(clock_time_exceed_ms(sensor_measure_ms, sample_interval)){//
                        sensor_measure_ms = clock_time_ms();
                        u8 pub_flag = 0;
                        //update sensor_measure_quantity here
                #if !WIN32
                        #if SENSOR_LIGHTING_CTRL_USER_MODE_EN        // for sensor server to send sensor status.
                gpio_set_input_en(SENSOR_GPIO_PIN, 1);
                gpio_set_output_en(SENSOR_GPIO_PIN, 0);
                sleep_us(100);
                sensor_measure_quantity = gpio_read(SENSOR_GPIO_PIN) ? 0 : 1;
                        #elif (((NLC_SENSOR_TYPE_SEL == NLCP_TYPE_OCS)|| (NLC_SENSOR_TYPE_SEL == NLCP_TYPE_ALS)) && (NLC_SENSOR_SEL != SENSOR_NONE))
                        sensor_measure_quantity = nlc_sensor_get();
                        #endif
                #endif
                        u32 measure_val = 0;
                        memcpy(&measure_val, p_sensor_data->p_raw, min2(sizeof(measure_val), p_sensor_data->len_raw));
                       
                        if(sensor_measure_quantity < measure_val){
                                if((measure_val - sensor_measure_quantity) > p_cadence->cadence_unit.delta_down){
                                        pub_flag = 1;
                                }
                        }
                        else{
                                if((sensor_measure_quantity - measure_val) > p_cadence->cadence_unit.delta_up){
                                        pub_flag = 1;
                                }
                        }

                        if(pub_flag){
                                LOG_USER_MSG_INFO(0, 0, "sensor_measure_quantity:%d", sensor_measure_quantity);
                                memcpy(p_sensor_data->p_raw, &sensor_measure_quantity, min2(sizeof(measure_val), p_sensor_data->len_raw));               
                                model_pub_check_set(ST_G_LEVEL_SET_PUB_NOW, (u8 *)&model_sig_sensor.sensor_srv[0].com, 0);
                        }
                }
        //}

        return 1;
}

0

主题

1

回帖

28

积分

英勇黄铜

积分
28
发表于 2025-9-25 10:40:15 | 显示全部楼层 来自 广东深圳
是直接修改了MD_SENSOR_EN 为1后出现的问题吗?在handbook中第29章节有介绍 如何打开sensor 功能,可以参考下修改方式

4

主题

3

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 2025-9-30 14:51:35 | 显示全部楼层 来自 广东深圳
wx_9375447787 发表于 2025-9-25 10:40
是直接修改了MD_SENSOR_EN 为1后出现的问题吗?在handbook中第29章节有介绍 如何打开sensor 功能,可以参考 ...

打开MD_SENSOR_EN 为1后,给变量sensor_measure_quantity赋值为ADC采样电压值,就出现了。
问题原因已经找到了,TRIGGER_DELTA_DOWN_DEFAULT 和 TRIGGER_DELTA_UP_DEFAULT 宏定义默认为0,导致 p_cadence->cadence_unit.delta_down 为0,每次采样都会触发 pub_flag = 1,导致消息发布太快了。修改上述两个宏定义,限制一下发布速度就可以了。

4

主题

3

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 2025-9-30 14:55:56 | 显示全部楼层 来自 广东深圳
官方代码 sensor_measure_quantity 的值只会是0或1,所以用官方示例没有问题。而我是想用来发布 ADC 采样电压,那就不一样了。

5

主题

302

回帖

1021

积分

版主

积分
1021
发表于 前天 19:30 | 显示全部楼层 来自 广东深圳
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2025-10-12 20:53 , Processed in 0.096456 second(s), 21 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表