在单片机使用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内容读取异常,其它读取成功
|