搜索
12
返回列表 发新帖
楼主: wdshuang09

[已解决] STM32F103 cJson 嵌套解析,求指导

[复制链接]

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2019-3-24 22:24:12 | 显示全部楼层
wdshuang09 发表于 2019-3-24 21:18
工程文件已上传,请帮忙看一下

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

使用道具 举报

该用户从未签到

38

主题

580

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-8-23
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 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;
}
你自己参考下
回复 支持 反对

使用道具 举报

该用户从未签到

38

主题

580

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-8-23
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2019-3-28 09:42:32 | 显示全部楼层
wdshuang09 发表于 2019-3-28 08:54
现在已经调通了,有没有遇到这个问题,100ms连续的发数据就会出错,会出现root==NULL,这个问题是怎么造成 ...

const char *err_ptr = cJSON_GetErrorPtr();
看看返回什么错误
回复 支持 反对

使用道具 举报

该用户从未签到

38

主题

580

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-8-23
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2019-3-28 17:10:15 | 显示全部楼层
wdshuang09 发表于 2019-3-28 14:02
root = cJSON_Parse((const char*)uart1Buf.Tx_Buffer);//解析串口JSON数据包
        if(root == ...

你发送的数据是什么?
你确认接收的数据是否跟发送的数据一致
回复 支持 反对

使用道具 举报

该用户从未签到

38

主题

580

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-8-23
 楼主| 发表于 2019-3-28 20:49:38 | 显示全部楼层
yklstudent-1794 发表于 2019-3-28 17:10
你发送的数据是什么?
你确认接收的数据是否跟发送的数据一致

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

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2019-3-29 08:16:19 | 显示全部楼层
JSON解析也耗时间,来不及处理吧
你最好把出错时的接收数据打印出来看看是否正常

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 20:03 , Processed in 0.186060 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表