你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 cJson 嵌套解析,求指导

[复制链接]
wdshuang09 提问时间:2019-3-21 22:06 /
阅读主题, 点击返回1楼
收藏 评论18 发布时间:2019-3-21 22:06
18个回答
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  ;
1.jpg
2.jpg
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,这个问题是怎么造成的?
1.jpg
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数据包中的一部分,

1.jpg
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 收起 理由
STMCU + 2

查看全部评分

12

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版