完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我发现进入深度睡眠通常无法传输发送的最后一个 UDP 数据包。我现在将睡眠延迟 30 毫秒,这是一个黑客。
我宁愿有一种方法来检查是否可以休眠,或者以其他方式能够注册指示数据包已发送的回调(无线电发送缓冲区为空)。 说清楚:我需要知道是 ESP 发送了它,而不是像 UDP 那样是目的地收到了它。 |
|
相关推荐
1个回答
|
|
要检查ESP8266或ESP32模块是否已发送UDP数据包,您可以使用以下方法:
1. **检查发送缓冲区**:您可以检查ESP模块的发送缓冲区,以查看数据包是否已发送。如果缓冲区为空,则表示数据包已发送。 ESP8266示例: ```c if (client.sendBuffer(0)) { Serial.println("数据包已发送"); } ``` ESP32示例: ```c if (udp.sendPacket(buffer, length)) { Serial.println("数据包已发送"); } ``` 2. **使用回调函数**:您可以使用回调函数在数据包发送时接收通知。在ESP8266上,您可以使用`sendCallback()`函数设置回调。在ESP32上,您可以使用`onDataSent()`函数设置回调。 ESP8266示例: ```c client.sendCallback([]() { Serial.println("数据包已发送"); }); ``` ESP32示例: ```c udp.onDataSent([]() { Serial.println("数据包已发送"); }); ``` 3. **使用软件(SW)监视狗**:您可以使用软件监视狗确保数据包已发送。在将ESP模块置于深度睡眠之前,设置监视狗定时器,如果数据包未在指定时间内发送,则重置模块。 ESP8266示例: ```c ESP.wdtDisable(); delay(1000); // 等待数据包发送 if (!isPacketSent()) { ESP.restart(); } ``` ESP32示例: ```c esp_task_wdt_reset(); delay(1000); // 等待数据包发送 if (!isPacketSent()) { esp_restart(); } ``` 请注意,这些方法不能保证数据包已成功传递到目的地,但它们可以提供数据包是否已从ESP模块发送的指示。 关于您提到的延迟问题,最好使用回调函数或软件监视狗来确保数据包已发送,然后再将ESP模块置于深度睡眠。这将有助于避免丢失最后一个数据包的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
407浏览 6评论
339浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
321浏览 5评论
322浏览 4评论
310浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 15:09 , Processed in 1.339899 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号