上位机发送json,{"cmd" : "device_hard","desc" : "dyaw","out":{"desc1":"V1.00","type":"string"}}STM32f1串口接收到数组里,"out":{"desc":"V1.00","type":"string"}不知道怎么解析出来,求指导。 cJSON *root; cJSON *cmd; cJSON *desc; cJSON *output; cJSON *hard; cJSON *taskArry; cJSON *desc1; cJSON *type; cJSON * temp; int i ,icount; root = mymalloc(SRAMIN,sizeof(cJSON)); root = cJSON_Parse((const char*)uart1Buf.Rx_Buffer); cmd= cJSON_GetObjectItem(root,"cmd"); if(desc != NULL) { printf("cmd= %s\r\n",(cmd->valuestring)); } desc= cJSON_GetObjectItem(root,"desc"); if(desc != NULL) { printf("desc= %s\r\n",(desc->valuestring)); } //以下这段解析不对,不知道怎么修改了 temp=cJSON_GetObjectItem(root,"output"); if(temp != NULL) { icount = cJSON_GetArraySize(output); printf( "icount=%d : \n",icount); for(i=0; i < icount; i++) { output=cJSON_GetArrayItem(output, i); if(output != NULL) { desc1 = cJSON_GetObjectItem(output, "desc1"); printf("desc1= %s\r\n",(desc1->valuestring)); type= cJSON_GetObjectItem(output, "type"); printf("type= %s\r\n",(type->valuestring)); } } } cJSON_Delete(root); my_free(root); my_free(cmd); |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
const char * m_json_context =
{
"{\"cmd\" : \"device_hard\",\"desc\" : \"dyaw\",\"out\":[{\"desc1\":\"V1.00\",\"type\":\"string\"}]}"
};
const cJSON *json_body = NULL;
const cJSON *json_list = NULL;
const cJSON *m_id_str = NULL;
const cJSON *m_price_str = NULL;
bool json_parse_info(const char * const context)
{
bool status = false;
cJSON *json_context = cJSON_Parse(context);
if(json_context == NULL)
{
const char *err_ptr = cJSON_GetErrorPtr();
if(err_ptr != NULL)
{
usart_send_data_packet(&usart_drivers[eUSART1], (uint8_t*)err_ptr, strlen(err_ptr));
}
cJSON_Delete(json_context);
return status;
}
// 项目01
json_body = cJSON_GetObjectItemCaseSensitive(json_context, "cmd");
if( !cJSON_IsString(json_body) )
{
cJSON_Delete(json_context);
return status;
}
// 项目02
json_body = cJSON_GetObjectItemCaseSensitive(json_context, "desc");
if( !cJSON_IsString(json_body) )
{
cJSON_Delete(json_context);
return status;
}
// 项目03
json_body = cJSON_GetObjectItemCaseSensitive(json_context, "out");
cJSON_ArrayForEach(json_list, json_body)
{
// xx1
m_id_str = cJSON_GetObjectItemCaseSensitive(json_list, "desc1");
// xx2
m_price_str = cJSON_GetObjectItemCaseSensitive(json_list, "type");
// 判断处理
if( !cJSON_IsString(m_id_str) || !cJSON_IsString(m_price_str) )
{
cJSON_Delete(json_context);
return status;
}
}
cJSON_Delete(json_context);
return status;
}
函数已换成malloc和free的,发送都正常,解析第一次串口收到的数据正常,当串口再接收到一个数据,进行解析就死机了。
进入
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
解析函数
void ProtocolGetOnePacket(void)
{
cJSON * root = NULL;
cJSON *cmd= NULL;
char *string = NULL;
root = malloc(sizeof(cJSON));
cmd = malloc(sizeof(cJSON));
root = cJSON_Parse((const char*)uart1Buf.Tx_Buffer);
__nop();
if(root != NULL)
{
string=cJSON_PrintUnformatted(root);
printf("%s\n\n", string);
cmd= cJSON_GetObjectItem(root,"cmd");
if(cmd != NULL)
{
if (!strncmp(cmd->valuestring, "get_device_hard", strlen("get_device_hard")))
{
printf("cmd= %s\r\n",(cmd->valuestring));
//Parse_Get_Device_Hard();
}
}
}
cJSON_Delete(root);
free(cmd);
free(string);
free(root);
__nop();
//
}
是不是内存溢出了,但是
我的Heap_Size 只能分配到1K,型号STM32F103C8
如果改成如下就编译通不过
Heap_Size EQU 0x00004000 ;
给你一个我写的demo:
// 解析JSON升级版本与url地址
static bool json_parser_object_update(char *str, int len, mico_content_t * const inContext)
{
const cJSON *json_body = NULL;
cJSON *json_context = cJSON_Parse(str);
if(json_context == NULL)
{
const char *err_ptr = cJSON_GetErrorPtr();
if(err_ptr != NULL)
{
Ql_Debug_Trace("%s", err_ptr);
}
cJSON_Delete(json_context);
return FALSE;
}
json_body = cJSON_GetObjectItem(json_context, "firm_ver");
if( !cJSON_IsString(json_body) )
{
cJSON_Delete(json_context);
return FALSE;
}
Ql_sprintf(inContext->update_ver, json_body->valuestring);
Ql_Debug_Trace("firm_ver=%s", inContext->update_ver);
json_body = cJSON_GetObjectItem(json_context, "file_url");
if( !cJSON_IsString(json_body) )
{
cJSON_Delete(json_context);
return FALSE;
}
Ql_sprintf(inContext->update_url, json_body->valuestring);
Ql_Debug_Trace("file_url=%s", inContext->update_url);
json_body = cJSON_GetObjectItem(json_context, "file_md5");
if( !cJSON_IsString(json_body) )
{
cJSON_Delete(json_context);
return FALSE;
}
Ql_sprintf(inContext->update_md5, json_body->valuestring);
Ql_Debug_Trace("file_md5=%s", inContext->update_md5);
cJSON_Delete(json_context);
return TRUE;
}
你自己参考下
这个数据内容有问题,应该为:"out":[{"desc":"V1.00","type":"string"}]
评分
查看全部评分
"out":[{"desc":"V1.00","type":"string"}]如果是这样,应该怎么解析?
cJSON_GetObjectItemCaseSensitive()这个函数在CJson没有找到,后面网上找到了cJSON-master这个里面有这个函数,再弱弱的想请教一下,用cJSON-master的库怎么移植到STM32F103中?我没有移植成功,能否提供一个例子参考一下谢谢!
我的cjson移植是参考http://www.openedv.com/forum.php?mod=viewthread&tid=229818
你用的老版本?
那就用cJSON_GetObjectItem函数好了
cJSON-master已成功移植STM32F1,现在已解析数据出来,但是出了一个新的问题;原本创建的JSON数据包在老版本JSON库是可以正常发出去的图1,但改成cJSON-master的文件就发送不出去见图片2,不知道问题出在哪?
发送JSON数据包函数如下:
cJSON *root = NULL;
char *string = NULL;
root= cJSON_CreateObject();
cJSON_AddItemToObject(root, "cmd", cJSON_CreateString("device_desc"));
cJSON_AddItemToObject(root, "desc", cJSON_CreateString("dzfz")) ;
cJSON_AddItemToObject(root, "id", cJSON_CreateString("dzfzno1"));
cJSON_AddItemToObject(root, "hard", cJSON_CreateString("V1.00"));
cJSON_AddItemToObject(root, "row", cJSON_CreateString("4"));
__nop();
string = cJSON_Print(root);
__nop();
printf("%s\n",string);
if (string == NULL)
{
printf("\nFailed to print root.\n");
}
my_free(string);
cJSON_Delete(root);
my_free(root);
å¾2
å¾1
上工程看看
工程文件已上传,请帮忙看一下
感觉可能还是你的my_malloc和my_free部分有问题,替换回原来的malloc和free后就没有问题,你在线调试找找啥问题吧,看那步出了问题
现在已经调通了,有没有遇到这个问题,100ms连续的发数据就会出错,会出现root==NULL,这个问题是怎么造成的?
const char *err_ptr = cJSON_GetErrorPtr();
看看返回什么错误