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

[复制链接]
 楼主| 穿西装的强子 发表于 2025-6-21 23:32 | 显示全部楼层 |阅读模式
在单片机使用json要么自己组帧处理,要不然就用现成的库cjson的开源库https://github.com/DaveGamble/cJSON
使用cjson.c和cjson.h文件,添加到工程内。
205686856ce5342e36.png
cjson对堆栈大小有要求,正常的堆栈大小不满足使用,因此需要改.s文件内的堆栈大小。
这里将stack_size和heap_size都放大了一倍。
548466856ce8a5ba5c.png
创建cjson接收处理的指针内容
  1. cJSON* cjson_test = NULL;
  2.     cJSON* cjson_name = NULL;
  3.     cJSON* cjson_mcu = NULL;
  4.     cJSON* cjson_sysclk = NULL;
  5.     cJSON* cjson_pclk1 = NULL;
  6.     cJSON* cjson_pclk2 = NULL;
这里将格式处理成mcu的板子数据
内容格式如下
  1. {"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内容,获取不同内容的数据即可
就算数据有缺失都是可以解析出来。
  1. if( USART_RxStruct.CompleteFlag == 1)
  2.                 {
  3.                         USART_RxStruct.CompleteFlag = 0;
  4.                         if( USART_RxStruct.Length > 0) {
  5.                                 cjson_test = cJSON_Parse((const char *)USART_RxStruct.Buffer);
  6.                                 if(cjson_test == NULL)
  7.                                 {
  8.                                         printf("parse fail.\n");
  9.                                 } els {
  10.                                   /* 依次根据名称提取JSON数据(键值对) */
  11.                                 cjson_name = cJSON_GetObjectItem(cjson_test, "board");
  12.                                 cjson_mcu = cJSON_GetObjectItem(cjson_test, "mcu");
  13.                                 cjson_sysclk = cJSON_GetObjectItem(cjson_test, "sysclk");
  14.                                 cjson_pclk1 = cJSON_GetObjectItem(cjson_test, "PCLK1");
  15.                                 cjson_pclk2 = cJSON_GetObjectItem(cjson_test, "PCLK2");

  16.                                 printf("board: %s\r\n", cjson_name->valuestring);
  17.                                 printf("mcu: %s\r\n", cjson_mcu->valuestring);
  18.                                 printf("SYSCLK: %s\r\n", cjson_sysclk->valuestring);
  19.                                 printf("PCLK1: %s\r\n", cjson_pclk1->valuestring);
  20.                                 printf("PCLK2: %s\r\n", cjson_pclk2->valuestring);
以下是测试结果
1.全部读取
89986856d05b55cc0.png
2.未发送mcu内容时,mcu内容读取异常,其它读取成功
171916856d076dacdd.png


535736856d0a0af09b.png
AdaMaYun 发表于 2025-7-31 17:51 | 显示全部楼层
串口接收json文件并解析很不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

259

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部