2021-12-2 10:05:18
/*处理网络数据的时候往往需要用到JSON数据格式,单片机如果不用cJSON库,处理起来会非常吃力
以下程序与注释讲解了cJSON在STM32F103C8T6上移植并使用案例
使用cJSON只需要在工程里添加cJSON.c与cJSON.h文件即可,方便快捷
*/
//cJSON使用的结构体
typedef struct cJSON //cJSON结构体
{
struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
//四个常用的函数
/*
*描述:将一个JSON数据包,按照cJSON结构体整理成数据包,并在开辟一块内存存储cJSON机构提
*参数:JSON格式数据包
*
*返回:成功返回一个指向内存块种的cJSON的指针,失败返回NULL
*/
cJSON *cJSON_Parse(const char *value);
/*
*描述:获取JSON字符串段值
*参数:
*
*返回:成功返回一个指向内存块种的cJSON的指针,失败返回NULL
*/
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
/*
*描述:将cJSON数据解析成JSON字符串,并在堆中开辟一块char*的内存空间存储JSON字符串
*参数:
*
*返回:成功返回一个char*指针该指针指向位于堆中JSON字符串,失败返回NULL
*/
char *cJSON_Print(cJSON *item);
/*
*描述:释放位于堆中cJSON结构体内存
*参数:结构体
*
*返回:成功返回一个char*指针该指针指向位于堆中JSON字符串,失败返回NULL
*/
void cJSON_Delete(cJSON *c);
/*
*描述:判断字符串是否可以按照cJSON格式解析
*参数:无
*
*返回:无
*/
void Get_cJSON_Data(void)
{
//定义一个JSON格式字符串 ""是转义的意思
char * str = "{"M":"say","ID":"U10751",
"NAME":"\u672a\u96e8\u7ef8\u7f2a(web)",
"C":"up","T":"1590990563"}";
//定义三个字符串变量用于存储cJSON读取的数据
char *string1;
char *string2;
char *string3;
cJSON *cjson; //定义cJSON结构体
cjson = cJSON_Parse(str); //将需要解析的字符串导入到cJSON结构体中,并判断是否可以解析
if(cjson == NULL)
{
printf("json pack into cjson error"); //cJSON数据格式错误
}
else
{
string1 = cJSON_GetObjectItem(cjson,"ID")->valuestring; //获取ID
string2 = cJSON_GetObjectItem(cjson,"C")->valuestring; //获取命令
string3 = cJSON_GetObjectItem(cjson,"T")->valuestring; //获取时间
//打印出数据
printf("ID = %s,C = %s,T = %srn",string1,string2.string3);
}
cJSON_Delete(cjson); //一定记得释放内存。
}
/*
*描述:STM32单片机串口接收中断接收字符串,判断以rn结束
*参数:无
*
*返回:无
*/
void USART1_IRQHandler(void)
{
u8 res;//定义串口接收的中间变量
static u8 index = 0;//定义串口接收数据数量
if(UART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
{
res = USART_ReceiveData(USART1); //串口1接收一字节数据
USART_RX_BUF[index] = res;//将数据存放到数组中
if(USART_RX_BUF[index] == 'n') //如果最后一个字符是n
{
USART_RX_BUF[index] = '