(1)espconn_sent 怎么样连续发送?
我们可以看到在数据手册上有一段话,是说需要在一包数据发送成功,进入espconn_sent_callback后,在调用espconn_send发送下一包数据。所以说,不能连续的执行
…
espconn_sent(xxxx);
espconn_sent(xxxx);
…
这是不可以的!如果我们打印espconn_sent的返回讯息会看到值是“-7”,
错误码:
• ESPCONN_ARG:未找到参数 espconn 对应的⽹络传输 -12 /* Illegal argument. /
• ESPCONN_MEM:空间不⾜ -1 / Out of memory error. /
• ESPCONN_MAXNUM:底层发包缓存已满,发包失败 -7 / Total number exceeds the set maximum*/
• ESPCONN_IF:UDP 发包失败 -14 /* UDP send error */
那么有什么办法可以发送多条呢?(这是在官方论坛上看到的)
答:可以调用 espconn_regist_write_finish,增加发包缓存,这样能最多缓存 8 包(或者 2920 bytes)数据,一旦缓存满了,仍然会报 -7 错误,也就是达到发包缓存上限。
(2)espconn_sent 发送失败是为什么?
我在验证连续发送问题的时候偶然发现espconn_sent发送始终没有输出,于是仔细的寻找bug终于被我找到了问题所在。
在验证程序中我先加了一个1s的定时器,让他一秒执行一次回调函数
问题就出在这个注册函数中的NULL,如果是NULL,回调函数中的参数pespconn就没有链接到之前代码中的espconn结构体中,自然就会输出pespconn = NULL。
所以在定义定时器的时候就应该绑定对应的参数。
我们看一下输出的log:
[13:40:25.081]收←◆ip:192.168.1.160,mask:255.255.254.0,gw:192.168.0.1
[13:40:25.158]收←◆ESP8266_IP = 192.168.1.160
[13:40:31.330]收←◆
ESP8266_TCP_Break
[13:40:34.041]收←◆pm open,type:2 0
[13:40:37.604]收←◆
ESP8266_TCP_Break
[13:40:41.626]收←◆
--------------- ESP8266_TCP_Connect_OK ---------------
[13:40:41.683]收←◆
ESP8266_WIFI_Send_OK
send_active =1
[13:40:43.683]收←
--------------- ESPCONN_CONNECT ---------------
--------------- send_active = 1 ---------------
--------------- yuanyin = 0 ---------------
--------------- yuanyin2 = -7 ---------------
3ffe86a5 already freed
ESP8266_WIFI_Send_OK
send_active =1
[13:40:45.754]收←◆
--------------- ESPCONN_CONNECT ---------------
--------------- send_active = 1 ---------------
--------------- yuanyin = 0 ---------------
-------------- yuanyin2 = -7 ---------------
3ffe86a5 already freed
以下的测试代码如果您需要可以下载:
https://download.csdn.net/download/mhj258258/11728049