打印
[MM32硬件]

【灵动微电子MM32F0121测评】8、串口接收json文件并解析

[复制链接]
966|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在单片机使用json要么自己组帧处理,要不然就用现成的库cjson的开源库https://github.com/DaveGamble/cJSON
使用cjson.c和cjson.h文件,添加到工程内。

cjson对堆栈大小有要求,正常的堆栈大小不满足使用,因此需要改.s文件内的堆栈大小。
这里将stack_size和heap_size都放大了一倍。

创建cjson接收处理的指针内容
cJSON* cjson_test = NULL;
    cJSON* cjson_name = NULL;
    cJSON* cjson_mcu = NULL;
    cJSON* cjson_sysclk = NULL;
    cJSON* cjson_pclk1 = NULL;
    cJSON* cjson_pclk2 = NULL;
这里将格式处理成mcu的板子数据
内容格式如下
{"board":"Mini-F0121-OB","mcu":"MM32F0121C6P","sysclk":"144.000 MHz","pclk1":"72.000 MHz","pclk2":"72.000 MHz"}
开始使用串口数据
按【灵动微电子MM32F0121测评】6、手搓modbus协议从机(一) - 灵动MM32 MCU官方技术支持论坛
这个文档有关于如何做串口接收不定长数据的方式,可以参考上述链接进行处理即可
串口数据接收上述cjson格式进行json的判定和数据的读取
先判定串口数据是否接收完成
再判定数据长度是否大于0,防止出现接收到空数据但是有idle信号过来
使用cJSON_Parse解析串口数据,返回到cjson_test 的json指针内
判定cjson_test 数据是有数据,非null则开始读数据
NULL的情况一般是解析异常(数据格式不对),堆栈空间申请不到地址等问题
然后根据自己设定的json内容,获取不同内容的数据即可
就算数据有缺失都是可以解析出来。
if( USART_RxStruct.CompleteFlag == 1)
                {
                        USART_RxStruct.CompleteFlag = 0;
                        if( USART_RxStruct.Length > 0) {
                                cjson_test = cJSON_Parse((const char *)USART_RxStruct.Buffer);
                                if(cjson_test == NULL)
                                {
                                        printf("parse fail.\n");
                                } els {
                                  /* 依次根据名称提取JSON数据(键值对) */
                                cjson_name = cJSON_GetObjectItem(cjson_test, "board");
                                cjson_mcu = cJSON_GetObjectItem(cjson_test, "mcu");
                                cjson_sysclk = cJSON_GetObjectItem(cjson_test, "sysclk");
                                cjson_pclk1 = cJSON_GetObjectItem(cjson_test, "PCLK1");
                                cjson_pclk2 = cJSON_GetObjectItem(cjson_test, "PCLK2");

                                printf("board: %s\r\n", cjson_name->valuestring);
                                printf("mcu: %s\r\n", cjson_mcu->valuestring);
                                printf("SYSCLK: %s\r\n", cjson_sysclk->valuestring);
                                printf("PCLK1: %s\r\n", cjson_pclk1->valuestring);
                                printf("PCLK2: %s\r\n", cjson_pclk2->valuestring);
以下是测试结果
1.全部读取

2.未发送mcu内容时,mcu内容读取异常,其它读取成功



535736856d0a0af09b.png (38.06 KB )

535736856d0a0af09b.png

使用特权

评论回复
沙发
AdaMaYun| | 2025-7-31 17:51 | 只看该作者
串口接收json文件并解析很不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

256

帖子

3

粉丝