STM32L0+A7670SA发送JSON至Spring Boot服务器数据混叠问题
问题排查与修复建议
根据你描述的AT指令与JSON数据混叠导致服务器JsonParseException的问题,结合A7670SA模块的AT指令HTTP POST流程,常见问题点及修复方案如下:
1. 透传模式切换时机错误
A7670SA发送HTTP POST时,需先通过AT+QHTTPURL设置目标URL,再用AT+QHTTPPOST触发数据发送模式——此时模块会返回>提示符,必须等待该提示符完全出现后再发送JSON数据。如果在模块未返回>就推送JSON,会导致数据与之前的AT指令残留内容混在一起。
修复代码示例:
// 循环等待模块返回>提示符 while (USART_ReadData(USART2) != '>'); // 发送JSON数据 USART_SendString(USART2, json_data); // 发送数据结束符(ASCII码0x1A,对应Ctrl+Z) USART_SendData(USART2, 0x1A);
2. 串口接收缓冲区未清空
STM32的串口接收缓冲区可能残留之前AT指令的响应内容,若在发送JSON前未清空,这些残留数据会被一并发送至服务器,破坏JSON结构。
修复方案:
在进入数据发送模式前,强制清空串口缓冲区:
void USART_ClearBuffer(USART_TypeDef* USARTx) { while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) != RESET) { USART_ReceiveData(USARTx); } } // 调用时机:发送AT+QHTTPPOST之后,等待>提示符之前 USART_ClearBuffer(USART2);
3. HTTP请求头部未正确设置Content-Length
若未明确指定Content-Length字段,服务器可能无法准确识别JSON数据的起始和结束位置,导致把后续的AT指令残留或模块响应内容当成JSON的一部分。
正确的AT指令流程示例:
// 设置HTTP头部的总长度(需计算头部字符串的实际长度) USART_SendString(USART2, "AT+QHTTPHEADER=38\r\n"); // 等待模块返回OK确认 wait_for_ok(); // 发送具体头部内容 USART_SendString(USART2, "Content-Type: application/json\r\n"); USART_SendString(USART2, "Content-Length: "); USART_SendString(USART2, json_length_str); // json_length_str为JSON字符串的长度数值 USART_SendString(USART2, "\r\n"); // 等待OK确认 wait_for_ok(); // 触发POST数据发送模式,指定JSON长度与超时时间 USART_SendString(USART2, "AT+QHTTPPOST="); USART_SendString(USART2, json_length_str); USART_SendString(USART2, ",10000\r\n"); // 超时时间设为10秒 // 等待>提示符 while (USART_ReadData(USART2) != '>'); // 清空缓冲区 USART_ClearBuffer(USART2); // 发送JSON数据 USART_SendString(USART2, json_data); // 发送结束符 USART_SendData(USART2, 0x1A); // 等待模块返回POST结果 wait_for_ok();
4. 透传模式退出时机错误
发送完JSON结束符后,必须等待模块返回OK或HTTP响应状态码(如+QHTTPPOST: 200),确认POST操作完全完成后,再执行后续AT指令。若提前发送其他指令,会导致响应数据与新指令混叠,甚至服务器端接收到额外的AT指令片段。
5. JSON字符串本身的特殊字符未转义
确保生成的JSON字符串没有包含换行符、AT指令特殊字符(如\r、\n、+等),若存在需做转义处理——比如换行符替换为\\n,双引号内部的双引号转义为\",否则会被模块误解析为AT指令的一部分。
内容的提问来源于stack exchange,提问作者Matheus Markies
相关产品推荐
相关产品推荐

