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
相关产品推荐
相关产品推荐

