stm32f103c8t6使用cjson解析串口数据

本文介绍如何在STM32F103C8T6微控制器上使用CJSON库解析JSON数据。通过串口助手发送JSON数据,实现LED状态控制。文中详细介绍了CJSON库的移植和配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

<think>嗯,用户想了解如何在STM32F103C8T6使用ESP8266模块与云端上位机通信。首先,我得理清整个流程,确保每个步骤都解释清楚,尤其是硬件连接和软件配置部分。 首先,硬件方面,STM32F103C8T6和ESP8266的接线是关键。需要确认两者的电压是否匹配,ESP8266是3.3V的,所以STM32串口也要用3.3V电平。可能用户会遇到电压不匹配导致模块损坏的问题,所以得提醒他们注意这一点。 然后是软件部分,AT指令的使用可能会让新手感到困惑,特别是如何通过串口发送正确的指令。我需要分步骤说明如何初始化ESP8266,包括设置WiFi模式、连接路由器和建立TCP连接。这时候可能会出现AT指令响应超时或者错误的情况,用户需要检查接线和指令格式是否正确。 接下来是STM32的代码编写。用户可能需要配置串口通信,处理AT指令的发送和接收,以及解析服务器的响应。这里要注意缓冲区管理和超时机制,避免程序卡死。另外,JSON数据格式的生成和解析也是重点,需要给出具体的例子,比如使用sprintf构造JSON字符串。 云端部分,用户可能不太清楚如何搭建服务器,这里可以建议使用常见的云平台,比如阿里云、腾讯云,或者简单的TCP测试工具。需要说明服务器IP和端口号的设置,以及数据包的格式。如果用户没有云端经验,可能会在这一步遇到困难,可能需要更详细的指导或推荐具体的教程。 最后,调试和错误处理是实际应用中容易出问题的地方。比如模块无法连接WiFi,可能是密码错误或信号弱;TCP连接失败可能是服务器地址或端口错误。需要列出常见问题及解决方法,帮助用户快速排查。 还要考虑用户的实际应用场景,他们可能是在做物联网项目,比如远程监控或数据采集。因此,数据的安全性和稳定性也很重要,可以提及使用SSL/TLS加密,但ESP8266可能资源有限,需要确认模块是否支持。 总之,整个流程需要分步骤讲解,确保每个环节都清晰,并提供代码示例和调试技巧,帮助用户顺利完成项目。</think>好的,我将分步骤为您讲解STM32F103C8T6通过ESP8266与云端通信的实现方法: $$ 系统架构框图 $$ STM32F103C8T6 -> ESP8266(WiFi) -> 路由器 -> 互联网 -> 云服务器 一、硬件准备 1. 核心器件: - STM32F103C8T6最小系统板(72MHz Cortex-M3) - ESP8266-01模块(支持802.11 b/g/n) 2. 接线配置: $$ \begin{array}{|c|c|} \hline STM32引脚 & ESP8266引脚 \\ \hline 3.3V & VCC \\ GND & GND \\ PA2(TX) & RX \\ PA3(RX) & TX \\ GPIO & EN(使能端) \\ \hline \end{array} $$ 注意:必须使用3.3V电平,建议串接1kΩ电阻 二、软件实现步骤 1. ESP8266固件准备 - 确认固件支持AT指令(建议使用安信可AT固件) - 波特率默认115200(可配置) 2. STM32程序设计 ```c // 伪代码示例 void ESP8266_Init(void) { USART_SendString("AT+RST\r\n"); // 复位模块 Delay_ms(1000); USART_SendString("AT+CWMODE=1\r\n"); // Station模式 USART_SendString("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n"); // 连接WiFi USART_SendString("AT+CIPMUX=0\r\n"); // 单连接模式 } void SendToCloud(void) { char cmd[128]; sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", SERVER_IP, PORT); USART_SendString(cmd); USART_SendString("AT+CIPSEND=32\r\n"); // 发送32字节数据 USART_SendString("{\"temp\":25.6,\"humi\":60}\r\n"); // JSON格式数据 } ``` 三、云端通信协议 1. 常用协议选择: - TCP直连 - HTTP RESTful API - MQTT(推荐物联网使用) 2. 数据包示例(JSON格式): $$ { "deviceID": "STM32_001", "timestamp": 1691145600, "sensors": { "temperature": 27.3, "voltage": 3.65 } } $$ 四、调试要点 1. AT指令调试顺序: ``` AT -> 测试通信 AT+CWMODE=1 -> 设置客户端模式 AT+CWLAP -> 扫描WiFi AT+CWJAP="SSID","password" -> 连接路由器 AT+CIPSTART="TCP","cloudserver.com",8080 -> 建立TCP连接 AT+CIPSEND=长度 -> 发送数据 ``` 2. 常见问题处理: - 模块不响应:检查供电是否稳定(需≥200mA) - WiFi连接失败:确认SSID/密码正确,信号强度≥-70dBm - 数据发送失败:检查服务器端口开放状态,建议先用网络调试工具测试 五、优化建议 1. 增加看门狗(IWDG)防止程序卡死 2. 实现数据重传机制 3. 采用OTA升级方案(需Flash≥128KB) 4. 添加SSL加密(需ESP8266支持TLS) 实际工程中建议使用MQTT协议,推荐使用开源库: - STM32端:Paho MQTT嵌入式版 - 云端:阿里云IoT/AWS IoT/Tencent IoT Hub 开发资源推荐: 1. ESP8266 AT指令手册 2. STM32 USART DMA实现 3. cJSON解析库 4. Wireshark抓包分析工具 是否需要针对某个具体环节(如TCP连接建立过程)展开详细说明?
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值