stm32f103c8t6使用cjson解析串口数据

stm32f103C8T6使用cjson库

本章文章主要是记录一下最近学习的keil解析cjson数据,如有不对的地方请各位前辈指正。
做了一个简单的demo,基本功能是使用串口助手,向stm32f103的串口3发送一个简单的json数据,数据包括两个键值对ed0、led1,当led0键值为1时电路板上面LED灯由熄灭变亮(由灭变亮),led1同理

一、何为json?

JSON是一种基于文本,独立于语言的轻量级数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON的两种表示结构对象、数组。
对象结构:
	以 “{”开始
	以 “}”结束
	中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔
{
    key1:value1,
    key2:value2,
    ...
}
数组结构:
	以”[”开始
	以”]”结束
	中间由0或多个以”,”分隔的值列表组成,
[
    {
        key1:value1,
        key2:value2 
    },
    {
         key3:value3,
         key4:value4   
    }
]

二、使用步骤

1.下载cjson文件

cjson文件下载

2.移植库

1.将cJSON,malloc源文件到工程的根目录下:
在这里插入图片描述

2.将cJSON,malloc文件添加至头文件路径、项目文件内:
在这里插入图片描述
在这里插入图片描述
3.修改cJSON.c
由于这个工程使用正点原子的工程模板,里面定义的有malloc.c、malloc.h,我们需要把cJSON的malloc 和free替换成我们自己的。
在cJSON.c添加头文件:

#include "malloc.h"

将cJSON.c文件46、47行修改为:

static void *(*cJSON_malloc)(size_t sz) = mymalloc;
static void (*cJSON_free)(void *ptr) = myfree;

4.修改malloc.h
在这里插入图片描述

3.cjson解析函数

void parse_led(const char *JSON)
{
	cJSON *json,*led0 , *led1;
	printf("解析前的数据:%s\r\n",JSON);
	json = cJSON_Parse(JSON);//解析串口的JSON数据
	if(json==NULL)
	{
		printf("json语法错误:[%s] \r\n",cJSON_GetErrorPtr());//输出语法错误的位置
	}
	else
	{
		led0 = cJSON_GetObjectItem(json,"led0");
		led1 = cJSON_GetObjectItem(json,"led1");
		printf("led0=%d \r\n",led0->valueint);
		printf("led1=%d \r\n",led1->valueint);
		if(led0->valueint == 1)LED0=~LED0;
		if(led1->valueint == 1)LED1=~LED1;
	}
	cJSON_Delete(json); // 释放内存
}

4.串口中断函数

void USART3_IRQHandler(void)                	//串口1中断服务程序
	{
	u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif
		if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
			Res = USART_ReceiveData(USART3);
			USART_RX_BUF[USART_RX_STA++] = Res;  		 
		}		
	 if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)  //接收中断(接收到的一帧数据)
		{		
			Res =  USART3->SR; //读SR寄存器
			Res =  USART3->DR; //读DR寄存器  先读SR再度DR目的是清除IDLE中断标志。	
			USART_RX_STA=0;	//LED0=!LED0;
			uart3_flag = 1;			
		}
//				parse_led((const char *)USART_RX_BUF);
#if SYSTEM_SUPPORT_OS 	//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntExit();  											 
#endif
} 

5.主函数

int main()
{
    uart3_init(115200);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	delay_init();
	LED_Init();
    while(1)
	{
		if(uart3_flag==1)
		{
			uart3_flag=0;
			delay_ms(10);
			parse_led((const char*)USART_RX_BUF);	
		}
    }
}

三、工程测试

打开串口助手,波特率打到115200发送:

{"led0":1.23,"led1":1}

在这里插入图片描述
打开串口,以文本发送数据后,可以看到led灯变化,串口返回:

解析前的数据:{"led0":1.23,"led1":1}}
led0=1 
led1=1 

四.测试工程下载

stm32_test.zip

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值