完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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文件 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("解析前的数据:%srn",JSON); json = cJSON_Parse(JSON);//解析串口的JSON数据 if(json==NULL) { printf("json语法错误:[%s] rn",cJSON_GetErrorPtr());//输出语法错误的位置 } else { led0 = cJSON_GetObjectItem(json,"led0"); led1 = cJSON_GetObjectItem(json,"led1"); printf("led0=%d rn",led0->valueint); printf("led1=%d rn",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 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:21 , Processed in 0.678421 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号