stm32 mqtt 发送缓存的大小修改MQTT_OUTPUT_RINGBUF_SIZE

本文讲述了在软件开发中,针对MQTT通信问题,如何将输出缓冲区大小从1024调整为1536,以避免因消息过大导致的连接中断。重点在于理解为何需要2的指数倍数,并揭示了与缓冲索引相关的代码调整细节。

原先定义的大小是1024

/**
 * Output ring-buffer size, must be able to fit largest outgoing publish message topic+payloads
 */
#ifndef MQTT_OUTPUT_RINGBUF_SIZE
#define MQTT_OUTPUT_RINGBUF_SIZE 1024
#endif

修改为

/**
 * Output ring-buffer size, must be able to fit largest outgoing publish message topic+payloads
 */
#ifndef MQTT_OUTPUT_RINGBUF_SIZE
#define MQTT_OUTPUT_RINGBUF_SIZE 1536
#endif

就出现发送900多直接就会和mqtt断开,经过查找原因,发现

#define MQTT_OUTPUT_RINGBUF_SIZE 256*6                            //011000000000

#define MQTT_RINGBUF_IDX_MASK ((MQTT_OUTPUT_RINGBUF_SIZE) - 1)    //010111111111


//导致下面这些& 操作  全部没有按照预想的来  
#define mqtt_ringbuf_put(rb, item) ((rb)->buf)[(rb)->put++ & MQTT_RINGBUF_IDX_MASK] = (item)

#define mqtt_ringbuf_linear_read_length(rb) LWIP_MIN(mqtt_ringbuf_len(rb), (MQTT_OUTPUT_RINGBUF_SIZE - ((rb)->get & MQTT_RINGBUF_IDX_MASK)))

#define mqtt_ringbuf_get_ptr(rb) (&(rb)->buf[(rb)->get & MQTT_RINGBUF_IDX_MASK])

如果想扩大缓存,必须是2的指数倍

比如

/**
 * Output ring-buffer size, must be able to fit largest outgoing publish message topic+payloads  必须是2指数倍
 */
#ifndef MQTT_OUTPUT_RINGBUF_SIZE
#define MQTT_OUTPUT_RINGBUF_SIZE 1024*2
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值