Open liaolj opened 4 years ago
能确定具体未接受到数据的原因吗,逻辑分析仪确定串口是否数据过来,中断有没有正常触发,at_client_recv 是否接收到数据,或者能否提供复现方式?
看日志是mqtt的呼吸包 就是2个字节 0x0d 0x0a
一定会复现的
我单步试了一下,有可能是ESP8266本身有问题,我的是V1.7.4的AT固件
收到的命令是 +IPD0,4:
但是串口只能拿出3个字节。
这是正常的,URC返回
[D/AT] recvline: 0000-0020: 53 45 4E 44 20 4F 4B 0D 0A SEND OK..
[D/AT] sendline: 0000-0020: 41 54 2B 43 49 50 53 45 4E 44 3D 30 2C 32 AT+CIPSEND=0,2
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A OK..
[D/AT] recvline: 0000-0020: 3E >
[D/AT] sendline: 0000-0020: C0 00 ..
[D/AT] recvline: 0000-0020: 20 0D 0A ..
[D/AT] recvline: 0000-0020: 52 65 63 76 20 32 20 62 79 74 65 73 0D 0A Recv 2 bytes..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 53 45 4E 44 20 4F 4B 0D 0A SEND OK..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 2B 49 50 44 2C 30 2C 32 3A +IPD,0,2:
[D/AT] urc_recv: 0000-0020: D0 00 ..
[D/AT] sendline: 0000-0020: 41 54 2B 43 49 50 53 45 4E 44 3D 30 2C 31 30 AT+CIPSEND=0,10
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A OK..
从这一刻起不正常
[D/AT] recvline: 0000-0020: 52 65 63 76 20 32 20 62 79 74 65 73 0D 0A Recv 2 bytes..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 53 45 4E 44 20 4F 4B 0D 0A SEND OK..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 2B 49 50 44 2C 30 2C 32 3A +IPD,0,2:
[D/AT] sendline: 0000-0020: 41 54 2B 43 49 50 53 45 4E 44 3D 30 2C 32 AT+CIPSEND=0,2
[D/AT] recvline: 0000-0020: 00 0D 0A ...
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A OK..
[D/AT] recvline: 0000-0020: 3E >
[D/AT] sendline: 0000-0020: C0 00 ..
[D/AT] recvline: 0000-0020: 20 0D 0A ..
[D/AT] recvline: 0000-0020: 52 65 63 76 20 32 20 62 79 74 65 73 0D 0A Recv 2 bytes..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 53 45 4E 44 20 4F 4B 0D 0A SEND OK..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 2B 49 50 44 2C 30 2C 32 3A +IPD,0,2:
[D/AT] sendline: 0000-0020: 41 54 2B 43 49 50 53 45 4E 44 3D 30 2C 32 AT+CIPSEND=0,2
[D/AT] recvline: 0000-0020: 00 0D 0A ...
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A OK..
[D/AT] recvline: 0000-0020: 3E >
可以看出这里ESP一直在发+IDP说有数据,但是一直没提取数据。
我觉得原因可能在收到+IDP后,提取数据时有一个等到信号量的过程。
这个过程里面被这个抢了AT+CIPSEND=0,2
这个是我写的答案, 现在http-ota 使用 eg25 atclient 下载固件, 校验失败。 看来问题的确存在啊。 下载第一包1024个字节的时候,丢了两个。 再查查是咋回事。
总结: EG25,等在中断串口模式下载大数据的时候, 会丢数, 即使将串口缓存开大也会丢。 改成DMA模式就OK了。 另外http_ota 里有一个bug, 已经另外提交了issue。
是的,我感觉有可能是串口忙不过来。跟我之前遇到的情况一模一样,会偶尔丢一个字节。 你试试波特率降低,中断下应该会好转。
01-01 00:00:00 E/at.clnt at_clnt: AT Client receive failed, uart device get data error(-2) 01-01 00:00:00 E/at.skt.sim800 at_clnt: sim0 device receive size(2) data failed. 01-01 00:00:00 E/mqtt mqtt0: [1147090] wait Ping Response res: 0