为什么esp8266接收到的数据接收不完整

问题遇到的现象和发生背景
/接受到broker数据后对数据的处理函数/

void sys_data_recv(void)
{
if (strstr((const char *)usart_recev.buf, MQTT_TOPIC_DEVICE_RECV)){/是否是broker发来的数据/
/获取json字符串/
printf("\r\n recv :%s\r\n", usart_recev.buf);
sscanf((const char *)usart_recev.buf, "+MQTTSUBRECV:0,"Test",%d,%s",
&mqtt_recv.len, mqtt_recv.json);

    printf("\r\n1json :%s\r\n", mqtt_recv.json);

    mqtt_publish(MQTT_TOPIC_DEVICE_RECV, mqtt_recv.json);

if (strstr(mqtt_recv.json, "test")){ 
        sys_get_json("test", &test_status);
        printf("ok\r\n");
    }

}

}

安信可调试助手
recv :+MQTTSUBRECV:0,"Test",91,{"method": "report", "clientToken": "123", "timestamp": 1628646783, "params": {"test": 21}}

1json :{"method":
publish AT+MQTTPUB=0,"Test","{"method":",0,0
end

recv :+MQTTSUBRECV:0,"Test",91,{"method": "report", "clientToken": "123", "timestamp": 1628646783, "params": {"test": 21}}

1json :{"method":
publish AT+MQTTPUB=0,"Test","{"method":",0,0
end

我的解答思路和尝试过的方法
我想请问一下为什么mqtt_recv.json只能储存到{"method":,能不能保存完整字符串

如下代码字符串拼接有问题,
sscanf((const char *)usart_recev.buf, "+MQTTSUBRECV:0,"Test",%d,%s",&mqtt_recv.len, mqtt_recv.json);

有没有可能是串口数据在当前时间点下本来就还没接收完整?建议检查一下。

应该是sscanf()遇到空格结束了,你要提取的这个json数据每个key value之间都有空格,这个数据是你在服务器下发的吗,把空格去掉试试。

数据格式的问题,返回的json不是严格的json,中间有空白字符

单片机连接esp8266_WIFI模块,与手机APP 数据传送,一般初始化 设置好后 wifi模块 不会丢失数据,你可以 通过 电脑 串口连接 模块串口 测试(如果电脑串口接收正常)那么可能单片机 串口接收 程序有问题。

你是接受的时候截断的吗?是发送的时候吧。
看看发送端HttpHeader设置一下传送字符串长度(Content-Length)
Content-Length=json字符串长度。
你在服务器做个日志检查一下,发送和接收的数据长度。

按照目前的情况,硬件连接应该没问题,用调试工具过渡,检查发送和接收数据,对比后再去改程序。主要检查发送接收的数据类型,长度等匹配问题。

之前弄项目玩的时候使用的也是ESP8266,一开始也碰到这个问题,你是不是使用一个处理器接上ESP8266然后将8266发过来的数据上传到串口调试助手,这样的话会有两个问题的,第一是你的接收一个字节的波特率和发送到电脑的波特率如果是一样的话容易导致丢数据,在一个就是处理器端的中断处理程序中不要发送串口数据。
我的做法是降低8266的波特率以及使用一个先进先出缓冲队列。

1.把你收到broker的数据使用hexdump的方式打出来,参考这个:https://recan.blog.csdn.net/article/details/120176216
2.观察数据中是否有 **空格 (0x20)**;
3.JSON中,key:value之间是松散的,里面有空格或TAB是不会影响JSON串的解析的;比如:

img


4.sscanf的用法有误,它是以 空格 分隔的。
以上部分,了解下应该可以解决你的问题了。

有可能是数据格式的问题,硬件连接应该没问题,josn数据格式有空格,可以在服务器下发送测试一下,把空格去掉。

参考这个我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《Arduino esp8266 wifi模块发送http请求》, 一起来围观吧 https://blog.csdn.net/lrh_12580/article/details/52965148?utm_source=app&app_version=5.3.0

https://ask.csdn.net/questions/374568?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1.pc_feed_download_top3ask

可以参考一下这个: