|
再freertos操作系统下,利用CJSON的库函数解析接收的json协议字符串。
#{"DataType":"test","Info":"{\"MIN\":\"0.101\",\"MAX\":\"1.409\"}"}$
折腾了一上午遇到两个l问题:
1.经过大约50多次解析后,函数就不能正常解析,现象是直接显示没有接收到数据。
2.查网上帖子说是因为没有释放内存,但是我加上释放内存后,会出现Error:..\FREERTOS\portable\MemMang\heap_4.c,320
Error:..\FREERTOS\portable\MemMang\heap_4.c,321这两个错误提示
哪位高手用过cjson,请赐教。
下面是代码
bool ParseCmdJson(const char* pCmdJson)
{
cJSON * pRoot = NULL,* pRoot2 = NULL;
cJSON * pJsonNode = NULL;
int len = 0;
bool bRet = false;
printf("\r\n%s \r\n",pCmdJson);
if(strstr(pCmdJson,"#")!=NULL)
pCmdJson=(pCmdJson+1);
pJsonNode=pvPortMalloc(100);
/*Êý¾Ý°üÈ·Èϼì²é£¬*/
pRoot = cJSON_Parse(pCmdJson);
if(NULL == pRoot)
{
printf("cJSON_Parse:NULL\n");
return bRet;
}
/*Ϊ½ÓÊÕÊý¾Ý¿ª±Ù»º´æÇø*/
// memset(pDeviceInfo, 0, sizeof(DeviceInfo));
// ÌáÈ¡type
pJsonNode = cJSON_GetObjectItem(pRoot, "DataType");
if (NULL != pJsonNode)
{
printf("DataType:%s\r\n" ,pJsonNode->valuestring);
}
pJsonNode = cJSON_GetObjectItem(pRoot, "Info");
if (NULL != pJsonNode)
{
// printf("Info:%s\r\n" ,pJsonNode->valuestring);
/*½âÎöµÚ¶þ¼¶*/
/*Êý¾Ý°üÈ·Èϼì²é£¬*/
pRoot2 = cJSON_Parse(pJsonNode->valuestring);
if(NULL == pRoot2)
{
printf("cJSON_Parse_2:NULL\n");
return bRet;
}
pJsonNode = cJSON_GetObjectItem(pRoot2, "ION_MIN");
if (NULL != pJsonNode)
{
printf("ion_min:%5.3f\r\n",atof(cJSON_GetObjectItem(pRoot2, "ION_MIN")->valuestring));
}
pJsonNode = cJSON_GetObjectItem(pRoot2, "ION_MAX");
if (NULL != pJsonNode)
{
printf("ion_max:%5.3f\r\n",atof(cJSON_GetObjectItem(pRoot2, "ION_MAX")->valuestring));
}
}
cJSON_Delete(pRoot);
vPortFree(pRoot);
uart1_clear();
return bRet;
}
|
|