乐鑫技术交流
直播中

ytrwv

8年用户 917经验值
擅长:EMC/EMI设计
私信 关注
[问答]

为什么使用esp-now可以收到相邻信道的包?

使用esp32-s3
版本idfv5.1.2
- 比如一个设备在 2 信道广播另一个设备在 1 3 信道也可以收到该包,并且包来源为信道 2
- esp now 我看文档里面说是有丢包的可能,所以需要在应用层确保可靠吗?那 send_cb 返回的状态是不能确保对方收到数据吗?

回帖(2)

李峰

2024-6-6 09:38:52
1. 这是由信道特性决定的,相邻信道的数据是有可能被读取到的。如果在程序中配置了辅助信道,比如相邻的信道被用作发送和接收时,分别配置了 WIFI_SECOND_CHAN_ABOVE 和 WIFI_SECOND_CHAN_BELOW,因为信道交叠更会出现所提到的情况。

2. ESP-NOW 没有自动重传。

3. 有关 send_cb:
调用 :cpp:func:`esp_now_send()` 发送 ESP-NOW 数据,调用  :cpp:func:`esp_now_register_send_cb` 注册发送回调函数。如果 MAC 层成功接收到数据,则该函数将返回 `ESP_NOW_SEND_SUCCESS` 事件。否则,它将返回 `ESP_NOW_SEND_FAIL`。ESP-NOW 数据发送失败可能有几种原因,比如目标设备不存在、设备的信道不相同、动作帧在传输过程中丢失等。应用层并不一定可以总能接收到数据。如果需要,应用层可在接收 ESP-NOW 数据时发回一个应答 (ACK) 数据。如果接收 ACK 数据超时,则将重新传输 ESP-NOW 数据。可以为 ESP-NOW 数据设置序列号,从而删除重复的数据。

如果有大量 ESP-NOW 数据要发送,调用 ``esp_now_send()`` 时需注意单次发送的数据不能超过 250 字节。请注意,两个 ESP-NOW 数据包的发送间隔太短可能导致回调函数返回混乱。因此,建议在等到上一次回调函数返回 ACK 后再发送下一个 ESP-NOW 数据。发送回调函数从高优先级的 Wi-Fi 任务中运行。因此,不要在回调函数中执行冗长的操作。相反,将必要的数据发布到队列,并交给优先级较低的任务处理。
举报

卢表镜

2024-6-6 18:13:48
ESP-NOW 是一种基于 Wi-Fi 的点对点通信协议,它允许设备之间直接发送数据包,而不需要通过接入点。在使用 ESP-NOW 时,设备可以选择在不同的信道上发送和接收数据。然而,由于无线信号的传播特性和信道之间的干扰,有时设备可能会收到相邻信道的数据包。

关于您提到的问题,以下是一些可能的原因和解决方案:

1. 信道干扰:由于无线信号的传播特性,信道之间的干扰可能导致设备接收到相邻信道的数据包。为了减少这种情况,您可以尝试在设备之间选择更远离的信道,或者使用信道扫描功能来找到最佳的信道。

2. 丢包问题:ESP-NOW 确实存在丢包的可能性,这可能是由于信号干扰、设备之间的距离过远或其他原因导致的。为了确保数据传输的可靠性,您可以在应用层实现一些机制,例如重传、确认和超时等。

3. send_cb 返回状态:send_cb 回调函数返回的状态表示数据包是否成功发送,但并不能确保对方已经收到数据。为了确保数据的可靠传输,您需要在应用层实现一些确认和重传机制。

总之,在使用 ESP-NOW 时,您需要注意信道选择、丢包问题以及应用层的可靠性机制。通过这些措施,您可以提高数据传输的可靠性和性能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分