You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32中u8_t转char后cJSON_Parse返回NULL的问题求助

排查cJSON_Parse返回NULL的常见原因及验证步骤

1. 字符串终止符缺失

cJSON要求输入的JSON字符串必须是以'\0'结尾的C风格字符串。如果从u8_t数组转char数组时未手动添加终止符,cJSON会读取内存中的垃圾数据,直接导致解析失败。
修复示例:

// 假设msg_data是u8_t类型消息缓冲区,msg_len为消息实际长度
char json_buf[MSG_MAX_LEN];
memcpy(json_buf, msg_data, msg_len);
json_buf[msg_len] = '\0'; // 必须添加终止符

2. MQTT消息分片未处理

mqtt_incoming_data_cb是分块回调函数,单次回调可能只收到JSON数据的一部分,直接解析不完整的JSON必然返回NULL。
正确处理逻辑:

static char recv_buf[MSG_MAX_LEN];
static uint32_t recv_len = 0;

void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags) {
    if (recv_len + len > MSG_MAX_LEN) {
        // 处理缓冲区溢出,重置接收状态
        recv_len = 0;
        return;
    }
    // 累积分片数据
    memcpy(recv_buf + recv_len, data, len);
    recv_len += len;
    // 收到最后一块数据时再解析
    if (flags & MQTT_DATA_FLAG_LAST) {
        recv_buf[recv_len] = '\0';
        extract_data(recv_buf);
        recv_len = 0; // 重置接收缓冲区
    }
}

3. JSON格式或编码问题

  • 检查测试JSON的语法合法性:复制收到的原始数据(通过串口打印输出),验证是否存在引号不匹配、多余逗号、隐形控制字符等问题。
  • 确保MQTT Explorer发送的JSON是UTF-8编码:cJSON默认仅支持UTF-8,其他编码(如GBK)可能包含非法字符导致解析失败。

4. 堆内存不足

cJSON解析依赖动态内存分配,如果STM32的堆内存配置过小,cJSON_Parse会因分配失败返回NULL。
验证方式:在STM32CubeIDE的链接脚本中增大Heap_Size(例如从默认0x200调整为0x1000)。

5. 缓冲区溢出或截断

确保转换JSON用的char数组长度大于等于MQTT消息的最大长度,避免数据截断导致JSON不完整。

内容的提问来源于stack exchange,提问作者ngrigoriadis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:03:11