yklstudent-1794 发表于 2019-3-24 22:24:12

wdshuang09 发表于 2019-3-24 21:18
工程文件已上传,请帮忙看一下

感觉可能还是你的my_malloc和my_free部分有问题,替换回原来的malloc和free后就没有问题,你在线调试找找啥问题吧,看那步出了问题

wdshuang09 发表于 2019-3-25 11:58:45

yklstudent-1794 发表于 2019-3-24 22:24
感觉可能还是你的my_malloc和my_free部分有问题,替换回原来的malloc和free后就没有问题,你在线调试找找 ...

函数已换成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;

yklstudent-1794 发表于 2019-3-25 13:13:12

wdshuang09 发表于 2019-3-25 11:58
函数已换成malloc和free的,发送都正常,解析第一次串口收到的数据正常,当串口再接收到一个数据,进行解 ...

给你一个我写的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;
}
你自己参考下

wdshuang09 发表于 2019-3-28 08:54:54

yklstudent-1794 发表于 2019-3-25 13:13
给你一个我写的demo:
// 解析JSON升级版本与url地址
static bool json_parser_object_update(char *str, ...

现在已经调通了,有没有遇到这个问题,100ms连续的发数据就会出错,会出现root==NULL,这个问题是怎么造成的?

yklstudent-1794 发表于 2019-3-28 09:42:32

wdshuang09 发表于 2019-3-28 08:54
现在已经调通了,有没有遇到这个问题,100ms连续的发数据就会出错,会出现root==NULL,这个问题是怎么造成 ...

const char *err_ptr = cJSON_GetErrorPtr();
看看返回什么错误

wdshuang09 发表于 2019-3-28 14:02:40

本帖最后由 wdshuang09 于 2019-3-28 16:29 编辑

yklstudent-1794 发表于 2019-3-28 09:42
const char *err_ptr = cJSON_GetErrorPtr();
看看返回什么错误
      root = cJSON_Parse((const char*)uart1Buf.Tx_Buffer);//解析串口JSON数据包
      if(root == NULL)
      {
                printf("cJSON_GetErrorPtr: [%s]\n", cJSON_GetErrorPtr());
                Beep_sound(1);
                goto end;
      }
返回的数据看不懂,错误类型为发送JSON数据包中的一部分,

yklstudent-1794 发表于 2019-3-28 17:10:15

wdshuang09 发表于 2019-3-28 14:02
root = cJSON_Parse((const char*)uart1Buf.Tx_Buffer);//解析串口JSON数据包
      if(root == ...

你发送的数据是什么?
你确认接收的数据是否跟发送的数据一致

wdshuang09 发表于 2019-3-28 20:49:38

yklstudent-1794 发表于 2019-3-28 17:10
你发送的数据是什么?
你确认接收的数据是否跟发送的数据一致

见图片最底下那一行,间隔300ms,没有问题,只要间隔很快100ms以内就会出错。

yklstudent-1794 发表于 2019-3-29 08:16:19

JSON解析也耗时间,来不及处理吧
你最好把出错时的接收数据打印出来看看是否正常
页: 1 [2]
查看完整版本: STM32F103 cJson 嵌套解析,求指导