diff --git a/src/transport/LoRaInterface.cpp b/src/transport/LoRaInterface.cpp index 59e4913..c96b13d 100644 --- a/src/transport/LoRaInterface.cpp +++ b/src/transport/LoRaInterface.cpp @@ -139,8 +139,13 @@ void LoRaInterface::loop() { memcpy(buf.writable(payloadSize), raw + RNODE_HEADER_L, payloadSize); InterfaceImpl::handle_incoming(buf); - // Re-enter RX - _radio->receive(); + // Re-enter RX — but only if handle_incoming didn't trigger a TX. + // handle_incoming() can synchronously call send_outgoing() (for link + // proofs, path responses), which starts an async TX via endPacket(true). + // Calling receive() here would abort that TX (clears IRQ flags + enters RX). + if (!_txPending) { + _radio->receive(); + } } else if (packetSize > 0) { // Packet too small (only header, no payload) — discard Serial.printf("[LORA_IF] RX runt packet (%d bytes), discarding\n", packetSize);