使用esp8266以AP模式作为TCP服务端接收简单json数据并解析硬件连接STM32的UART串口连接到ESP8266的TX/RX。确保ESP8266和STM32共地GND。为ESP8266提供3.3V电源。以下是使用STM32单片机通过HAL库与ESP8266通信接收并解析JSON数据的示例代码。#includemain.h#includestring.h#includestdio.h#includestdlib.h#includecJSON.h// 使用cJSON库解析JSONUART_HandleTypeDef huart2;// 假设使用USART2与ESP8266通信uint8_t rx_buffer[256]; // 接收缓冲区uint8_t rx_data; // 单字节接收数据uint16_t rx_index 0; // 缓冲区索引uint8_t json_received 0; // JSON数据接收标志voidSystemClock_Config(void);staticvoidMX_GPIO_Init(void);staticvoidMX_USART2_UART_Init(void);intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();// 初始化ESP8266ESP8266_Init();// 启用UART接收中断HAL_UART_Receive_IT(huart2,rx_data,1);while(1){if(json_received){json_received0;// 清除标志ProcessJSON((char*)rx_buffer);// 处理JSON数据rx_index0;// 重置缓冲区索引memset(rx_buffer,0,sizeof(rx_buffer));// 清空缓冲区}}}// UART接收中断回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart-InstanceUSART2){if(rx_data\n){// 检测到换行符表示JSON数据接收完成rx_buffer[rx_index]\0;// 添加字符串结束符json_received1;// 设置标志}else{rx_buffer[rx_index]rx_data;// 存储数据}HAL_UART_Receive_IT(huart2,rx_data,1);// 重新启用中断}}// 处理JSON数据void ProcessJSON(char* json_str) {cJSON*rootcJSON_Parse(json_str);// 解析JSON字符串if(rootNULL){printf(JSON解析失败: %s\n,cJSON_GetErrorPtr());return;}// 提取JSON字段cJSON*sensorcJSON_GetObjectItem(root,sensor);cJSON*valuecJSON_GetObjectItem(root,value);if(sensorvalue){printf(传感器类型: %s, 数值: %d\n,sensor-valuestring,value-valueint);}else{printf(JSON字段缺失\n);}cJSON_Delete(root);// 释放JSON对象}// 初始化ESP8266void ESP8266_Init(void) {constchar*init_commands[]{ATRST\r\n,// 重启ESP8266ATCWMODE2\r\n,// 设置为AP模式ATCWSAP\ESP8266_AP\,\12345678\,1,4\r\n,// 配置AP名称和密码ATCIPMUX1\r\n,// 启用多连接ATCIPSERVER1,8080\r\n,// 启动TCP服务器端口8080};for(inti0;isizeof(init_commands)/sizeof(init_commands[0]);i){HAL_UART_Transmit(huart2,(uint8_t*)init_commands[i],strlen(init_commands[i]),HAL_MAX_DELAY);HAL_Delay(1000);// 等待ESP8266响应}}// USART2初始化函数static void MX_USART2_UART_Init(void) {huart2.InstanceUSART2;huart2.Init.BaudRate115200;huart2.Init.WordLengthUART_WORDLENGTH_8B;huart2.Init.StopBitsUART_STOPBITS_1;huart2.Init.ParityUART_PARITY_NONE;huart2.Init.ModeUART_MODE_TX_RX;huart2.Init.HwFlowCtlUART_HWCONTROL_NONE;huart2.Init.OverSamplingUART_OVERSAMPLING_16;if(HAL_UART_Init(huart2)!HAL_OK){Error_Handler();}}// GPIO初始化函数static void MX_GPIO_Init(void) {__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct{0};GPIO_InitStruct.PinGPIO_PIN_2|GPIO_PIN_3;// USART2 TX/RXGPIO_InitStruct.ModeGPIO_MODE_AF_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.AlternateGPIO_AF7_USART2;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);}// 错误处理函数void Error_Handler(void) {while(1);}代码说明UART通信使用STM32的USART2与ESP8266通信。通过中断接收数据检测到换行符\n时表示JSON数据接收完成。JSON解析使用cJSON库解析JSON数据。提取sensor和value字段并打印。ESP8266初始化发送AT指令配置ESP8266为AP模式并启动TCP服务器。数据处理接收到的JSON数据存储在rx_buffer中解析后提取字段并处理。依赖库cJSON库下载地址cJSON GitHub https://github.com/DaveGamble/cJSON将cJSON.h和cJSON.c添加到项目中。测试流程将代码烧录到STM32。使用手机/电脑连接ESP8266的APSSID: ESP8266_AP密码: 12345678。使用TCP客户端如网络调试助手连接到ESP8266的IP通常为192.168.4.1:8080。发送JSON数据例如{“sensor”:“temperature”, “value”:25}\nSTM32会解析数据并打印到串口。注意事项确保ESP8266的波特率与STM32一致代码中为115200。如果JSON数据较大需调整rx_buffer的大小。如果ESP8266初始化失败检查AT指令和硬件连接。//proteus单片机-usbwifi模块AP服务端-无线网卡-网络调试助手客户端#includemain.h#includeusart.h#includegpio.h/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */#includestring.h#includecJSON.h#includestdio.h#includestdlib.h#ifdef__GNUC__#definePUTCHAR_PROTOTYPEint__io_putchar(intch)#else#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)#endifPUTCHAR_PROTOTYPE{HAL_UART_Transmit(huart1,(uint8_t*)ch,1,0xFFFF);returnch;}intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,0xffff);returnch;}intfgetc(FILE*f){uint8_tch0;HAL_UART_Receive(huart1,ch,1,0xffff);returnch;}uint8_trx_buffer[256];// 接收缓冲区uint8_trx_data;// 单字节接收数据uint16_trx_index0;// 缓冲区索引uint8_tjson_received0;// JSON数据接收标志/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/voidSystemClock_Config(void);/* USER CODE BEGIN PFP */// 读取字符串中两个字符之间的字符串并包含这两个字符voidextractStringBetweenChars(constchar*input,charstartChar,charendChar,char*output){constchar*startstrchr(input,startChar);if(startNULL){output[0]\0;return;}constchar*endstrchr(start1,endChar);if(endNULL){output[0]\0;return;}intlengthend-start1;strncpy(output,start,length);output[length]\0;//末尾添加\0}// 处理JSON数据voidProcessJSON(char*json_str){cJSON*rootcJSON_Parse(json_str);// 解析JSON字符串outputif(rootNULL){printf(JSONPARSEFAIL: %s\n,cJSON_GetErrorPtr());return;}// 提取JSON字段cJSON*sensorcJSON_GetObjectItem(root,sensor);cJSON*valuecJSON_GetObjectItem(root,value);cJSON*kkcJSON_GetObjectItem(root,kk);if(sensorvalue){printf(sensortype:%s,value:%d,kk:%d\n,sensor-valuestring,value-valueint,kk-valueint);}else{printf(JSONFIELDNULL\n);}cJSON_Delete(root);// 释放JSON对象}// 初始化ESP8266voidESP8266_Init(void){constchar*init_commands[]{ATRST\r\n,// 重启ESP8266ATCWMODE2\r\n,// 设置为AP模式ATCWSAP\MCU\,\\,3,0\r\n,// 配置AP名称和密码ATCIPMUX1\r\n,// 启用多连接ATCIPSERVER1,8899\r\n,// 启动TCP服务器端口8080};for(inti0;isizeof(init_commands)/sizeof(init_commands[0]);i){HAL_UART_Transmit(huart2,(uint8_t*)init_commands[i],strlen(init_commands[i]),HAL_MAX_DELAY);HAL_Delay(1000);// 等待ESP8266响应}}/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 *//* USER CODE END 0 *//** * brief The application entry point. * retval int */intmain(void){/* USER CODE BEGIN 1 */charoutput[50];/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */ESP8266_Init();// 启用UART接收中断HAL_UART_Receive_IT(huart2,rx_data,1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){if(json_received){json_received0;// 清除标志extractStringBetweenChars((char*)rx_buffer,{,},output);printf(\r\nss:%s%d\r\n,output,strlen(output));ProcessJSON((char*)output);// 处理JSON数据rx_index0;// 重置缓冲区索引memset(rx_buffer,0,sizeof(rx_buffer));// 清空缓冲区}//wifiSend(MCUserver\r\n);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}// UART接收中断回调函数voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(huart-InstanceUSART2){if(rx_data\n){// 检测到换行符表示JSON数据接收完成rx_buffer[rx_index]\0;// 添加字符串结束符json_received1;// 设置标志}else{rx_buffer[rx_index]rx_data;// 存储数据}HAL_UART_Receive_IT(huart2,rx_data,1);// 重新启用中断}}对上个程序的发送完善了一下代码稍大需对STM32CUBEIDE配置优化