Skip to content
ESP32s.com
0$0.00

ESP-NOW Not Receiving Data? Check Channels, MAC Addresses and Payloads

If an ESP-NOW sender runs but the receiver prints nothing, simplify the link before changing antennas or replacing boards. Use two powered boards, a short counter payload and serial output on both ends. Remove displays, cloud uploads and sensor drivers until basic reception works.

Start by separating three failures

  • Initialization fails: inspect Wi-Fi setup and each API return value.
  • Send is attempted but no receive callback runs: inspect channel, destination and receiver configuration.
  • The callback runs but values are wrong: inspect payload length, encoding and application logic.

1. Confirm the radio channel on both devices

Both sides need a compatible channel configuration. Connecting a board to an access point may change its channel, making a previously working standalone example stop receiving. Print the actual channel after connection and compare it at both ends. First test without a router; then reintroduce the access-point connection and account for its channel.

2. Verify the destination MAC and interface

Print the MAC address used by the receiving interface and compare every byte with the sender's peer configuration. Station and access-point interfaces can have different addresses. Do not copy a Bluetooth address or rely on a saved address from another board. Check the peer-add result and confirm the configured interface matches the active Wi-Fi mode.

3. Use examples for the installed framework

Callback signatures and wrappers can differ across Arduino-ESP32 or ESP-IDF releases. Begin with an example bundled with your installed release. Combining an old callback from one tutorial with a newer library may produce compile errors or incorrect assumptions. Record the framework version alongside both sketches so the pair remains reproducible.

4. Reduce the payload to a counter

Send a sequence number and a fixed, short message first. On receipt, print the byte count before decoding. If you later send a structure, verify that both programs agree on field widths and layout; a structure containing pointers or dynamic strings is not a portable wire format. For mixed implementations, define a byte-level message format instead of assuming identical compiler padding.

5. Keep callbacks short

Copy the received data into a bounded buffer or queue, then process it from the application task. Avoid doing slow display refreshes, file writes or network transactions directly in a receive callback. Check lengths before copying and track dropped messages so a busy receiver does not silently lose data.

6. Distinguish delivery status from application success

A send callback is not proof that the remote application parsed, stored or acted on a reading. Add an application acknowledgement containing the sequence number when that distinction matters. Bound retries, set a timeout and reject duplicate sequence numbers where repeated actions would be undesirable.

7. Add features back one at a time

Once the counter works, add the sensor, then the display, then any router connection. Check supply stability if failures start during radio activity or display updates. Test at a short separation before evaluating range. Keep a log of sent, received, acknowledged and timed-out packets rather than judging reliability from a few visible updates.

For a display receiver, continue with the CYD multi-sensor receiver guide. For the broader setup, see the existing ESP-NOW networking tutorial.

References and next steps

Official Arduino-ESP32 ESP-NOW API and examples

These are design and troubleshooting guides, not reports of bench-tested builds. Check the documentation for your exact board and installed software release.

Rates by ExchangeRate-API