diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp
index 31baba13..3295a5cc 100644
--- a/src/modules/SX127x/SX127x.cpp
+++ b/src/modules/SX127x/SX127x.cpp
@@ -496,17 +496,20 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
 
 int16_t SX127x::readData(uint8_t* data, size_t len) {
   int16_t modem = getActiveModem();
-  size_t length = len;
 
   // put module to standby
   standby();
 
-  if(modem == RADIOLIB_SX127X_LORA) {
-    // len set to maximum indicates unknown packet length, read the number of actually received bytes
-    if(len == RADIOLIB_SX127X_MAX_PACKET_LENGTH) {
-      length = getPacketLength();
-    }
+  // get packet length
+  size_t length = getPacketLength();
+  size_t dumpLen = 0;
+  if((len != 0) && (len < length)) {
+    // user requested less data than we got, only return what was requested
+    dumpLen = length - len;
+    length = len;
+  }
 
+  if(modem == RADIOLIB_SX127X_LORA) {
     // check packet header integrity
     if(_crcEnabled && (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_CHANNEL, 6, 6)) == 0) {
       // CRC is disabled according to packet header and enabled according to user
@@ -523,9 +526,6 @@ int16_t SX127x::readData(uint8_t* data, size_t len) {
     }
 
   } else if(modem == RADIOLIB_SX127X_FSK_OOK) {
-    // read packet length (always required in FSK)
-    length = getPacketLength();
-
     // check address filtering
     uint8_t filter = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 2, 1);
     if((filter == RADIOLIB_SX127X_ADDRESS_FILTERING_NODE) || (filter == RADIOLIB_SX127X_ADDRESS_FILTERING_NODE_BROADCAST)) {
@@ -536,10 +536,9 @@ int16_t SX127x::readData(uint8_t* data, size_t len) {
   // read packet data
   _mod->SPIreadRegisterBurst(RADIOLIB_SX127X_REG_FIFO, length, data);
 
-  // dump bytes that weren't requested
-  size_t packetLength = getPacketLength();
-  if(packetLength > length) {
-    clearFIFO(packetLength - length);
+  // dump the bytes that weren't requested
+  if(dumpLen != 0) {
+    clearFIFO(dumpLen);
   }
 
   // clear internal flag so getPacketLength can return the new packet length
diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h
index e37c498d..b61ca3b6 100644
--- a/src/modules/SX127x/SX127x.h
+++ b/src/modules/SX127x/SX127x.h
@@ -730,7 +730,8 @@ class SX127x: public PhysicalLayer {
 
       \param data Pointer to array to save the received binary data.
 
-      \param len Number of bytes that will be received. Must be known in advance for binary transmissions.
+      \param len Number of bytes that will be read. When set to 0, the packet length will be retreived automatically.
+      When more bytes than received are requested, only the number of bytes requested will be returned.
 
       \returns \ref status_codes
     */