jgromes / RadioLib

Universal wireless communication library for embedded devices
https://jgromes.github.io/RadioLib/
MIT License
1.54k stars 384 forks source link

Not receiving if SF changed at runtime #242

Closed HamzaHajeir closed 3 years ago

HamzaHajeir commented 3 years ago

Describe the bug Hi

I'm facing an issue of receiving messages when I change SF to the target SF I expect to receive messages by.

The change is using radio.setSpreadingFactor();

To Reproduce

Sender code (Always send messaged in SF 7):

// include the library
#include <RadioLib.h>
#define D1  5
#define D0 16
#define D2 4

const int csPin = D0;    // LoRa radio chip select
const int resetPin = D2; // LoRa radio reset
const int irqPin = D1;   // change for your board; must be a hardware interrupt pin
const int DIO1 = 10;     // change for your board; must be a hardware interrupt pin
const int DIO0 = irqPin; // change for your board; must be a hardware interrupt pin

// SX1278 has the following connections:
// NSS pin:   5 D1
// DIO0 pin:  16 D0
// RESET pin: 4 :D2
// DIO1 pin:  10 SD3
SX1278 radio = new Module(csPin, DIO0, resetPin, DIO1);

// or using RadioShield
// https://github.com/jgromes/RadioShield
//SX1278 radio = RadioShield.ModuleA;

// save transmission state between loops
int transmissionState = ERR_NONE;

void setup() {
  Serial.begin(115200);

  // initialize SX1278 with default settings
  Serial.print(F("[SX1278] Initializing ... "));
  int state = radio.begin(434.0, 125.0, 7);
  if (state == ERR_NONE) {
    Serial.println(F("success!"));
  } else {
    Serial.print(F("failed, code "));
    Serial.println(state);
    while (true);
  }

  // set the function that will be called
  // when packet transmission is finished
  radio.setDio0Action(setFlag);

  // start transmitting the first packet
  Serial.print(F("[SX1278] Sending first packet ... "));

  // you can transmit C-string or Arduino string up to
  // 256 characters long
  transmissionState = radio.startTransmit("Hello World!");

  // you can also transmit byte array up to 256 bytes long
  /*
    byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
                      0x89, 0xAB, 0xCD, 0xEF};
    state = radio.startTransmit(byteArr, 8);
  */
}

// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;

// disable interrupt when it's not needed
volatile bool enableInterrupt = true;

// this function is called when a complete packet
// is transmitted by the module
// IMPORTANT: this function MUST be 'void' type
//            and MUST NOT have any arguments!
ICACHE_RAM_ATTR void setFlag(void) {
  // check if the interrupt is enabled
  if (!enableInterrupt) {
    return;
  }

  // we sent a packet, set the flag
  transmittedFlag = true;
}

void loop() {
  // check if the previous transmission finished
  if (transmittedFlag) {
    // disable the interrupt service routine while
    // processing the data
    enableInterrupt = false;

    // reset flag
    transmittedFlag = false;

    if (transmissionState == ERR_NONE) {
      // packet was successfully sent
      Serial.println(F("transmission finished!"));

      // NOTE: when using interrupt-driven transmit method,
      //       it is not possible to automatically measure
      //       transmission data rate using getDataRate()

    } else {
      Serial.print(F("failed, code "));
      Serial.println(transmissionState);

    }

    // wait a second before transmitting again
    delay(1000);

    // send another one
    Serial.print(F("[SX1278] Sending another packet ... "));

    // you can transmit C-string or Arduino string up to
    // 256 characters long
    static int count = 0;
    String message = "Hello World!" + count;
    count++;

    transmissionState = radio.startTransmit(message);

    // you can also transmit byte array up to 256 bytes long
    /*
      byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
                        0x89, 0xAB, 0xCD, 0xEF};
      int state = radio.startTransmit(byteArr, 8);
    */

    // we're ready to send more packets,
    // enable interrupt service routine
    enableInterrupt = true;
  }
}

Receiver code (Keep Changing between SF7 and SF9):

#include <RadioLib.h>
#define D1  5
#define D0 16
#define D2 4

const int csPin = D0;    // LoRa radio chip select
const int resetPin = D2; // LoRa radio reset
const int irqPin = D1;   // change for your board; must be a hardware interrupt pin
const int DIO1 = 10;     // change for your board; must be a hardware interrupt pin
const int DIO0 = irqPin; // change for your board; must be a hardware interrupt pin

// SX1278 has the following connections:
// NSS pin:   5 D1
// DIO0 pin:  16 D0
// RESET pin: 4 :D2
// DIO1 pin:  10 SD3
SX1278 radio = new Module(csPin, DIO0, resetPin, DIO1);

void setup() {
  Serial.begin(115200);

  // initialize SX1278 with default settings
  Serial.print(F("[SX1278] Initializing ... "));
//  radio.setCRC(true);
  int state = radio.begin(434.0, 125.0,7);
  if (state == ERR_NONE) {
    Serial.println(F("success!"));
  } else {
    Serial.print(F("failed, code "));
    Serial.println(state);
    while (true);
  }

  // set the function that will be called
  // when new packet is received
  radio.setDio0Action(setFlag);

  // start listening for LoRa packets
  Serial.print(F("[SX1278] Starting to listen ... "));
  state = radio.startReceive();
  if (state == ERR_NONE) {
    Serial.println(F("success!"));
  } else {
    Serial.print(F("failed, code "));
    Serial.println(state);
    while (true);
  }
  pinMode(LED_BUILTIN,OUTPUT);

  // if needed, 'listen' mode can be disabled by calling
  // any of the following methods:
  //
  // radio.standby()
  // radio.sleep()
  // radio.transmit();
  // radio.receive();
  // radio.readData();
  // radio.scanChannel();
}

// flag to indicate that a packet was received
volatile bool receivedFlag = false;

// disable interrupt when it's not needed
volatile bool enableInterrupt = true;

// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
//            and MUST NOT have any arguments!
ICACHE_RAM_ATTR void setFlag(void) {
  // check if the interrupt is enabled
  if (!enableInterrupt) {
    return;
  }

  // we got a packet, set the flag
  receivedFlag = true;
}

void loop() {
  // check if the flag is set
  static uint32_t prevmillis;
  if(millis()- prevmillis > 10000)
  {
    static int prevSF = 7;
    int newSF;
    if(prevSF == 7)
    {
        newSF = 9;
    }
    else
    {
        newSF = 7;
    }
    prevSF = newSF;
    Serial.printf("Changing SF to %d\n",newSF);
    radio.setSpreadingFactor(newSF);
    prevmillis=millis();
  }
  if (receivedFlag) {
    // disable the interrupt service routine while
    // processing the data
    enableInterrupt = false;

    // reset flag
    receivedFlag = false;
    Serial.println(F("ReceivedFlag, Reading"));
    // you can read received data as an Arduino String
    String str;
    int state = radio.readData(str);

    // you can also read received data as byte array
    /*
      byte byteArr[8];
      int state = radio.readData(byteArr, 8);
    */

    if (state == ERR_NONE) {
      // packet was successfully received
      Serial.println(F("[SX1278] Received packet!"));

      // print data of the packet
      Serial.print(F("[SX1278] Data:\t\t"));
      Serial.println(str);

      // print RSSI (Received Signal Strength Indicator)
      Serial.print(F("[SX1278] RSSI:\t\t"));
      Serial.print(radio.getRSSI());
      Serial.println(F(" dBm"));

      // print SNR (Signal-to-Noise Ratio)
      Serial.print(F("[SX1278] SNR:\t\t"));
      Serial.print(radio.getSNR());
      Serial.println(F(" dB"));

      // print frequency error
      Serial.print(F("[SX1278] Frequency error:\t"));
      Serial.print(radio.getFrequencyError());
      Serial.println(F(" Hz"));

    } else if (state == ERR_CRC_MISMATCH) {
      // packet was received, but is malformed
      Serial.println(F("[SX1278] CRC error!"));

    } else {
      // some other error occurred
      Serial.print(F("[SX1278] Failed, code "));
      Serial.println(state);

    }

    // put module back to listen mode
    radio.startReceive();

    // we're ready to receive more packets,
    // enable interrupt service routine
    enableInterrupt = true;
  }
//  static uint32_t prevmillis = 0;
//  if (millis() - prevmillis > 1000)
//  {
//    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
//    Serial.printf("T=%u\tPING\n", millis());
//    prevmillis = millis();
//  }

}

**OUTPUT*** Sender :

13:52:10.596 -> [SX1278] Sending another packet ... transmission finished! 13:52:11.657 -> [SX1278] Sending another packet ... transmission finished! 13:52:12.655 -> [SX1278] Sending another packet ... transmission finished! 13:52:13.684 -> [SX1278] Sending another packet ... transmission finished! 13:52:14.734 -> [SX1278] Sending another packet ... transmission finished! 13:52:15.763 -> [SX1278] Sending another packet ... transmission finished! 13:52:16.761 -> [SX1278] Sending another packet ... transmission finished! 13:52:17.794 -> [SX1278] Sending another packet ... transmission finished! 13:52:18.856 -> [SX1278] Sending another packet ... transmission finished! 13:52:19.858 -> [SX1278] Sending another packet ... transmission finished! 13:52:20.923 -> [SX1278] Sending another packet ... transmission finished! 13:52:21.913 -> [SX1278] Sending another packet ... transmission finished! 13:52:22.980 -> [SX1278] Sending another packet ... transmission finished! 13:52:23.999 -> [SX1278] Sending another packet ... transmission finished! 13:52:25.018 -> [SX1278] Sending another packet ... transmission finished! 13:52:26.022 -> [SX1278] Sending another packet ... transmission finished! 13:52:27.088 -> [SX1278] Sending another packet ... transmission finished! 13:52:28.092 -> [SX1278] Sending another packet ... transmission finished! 13:52:29.138 -> [SX1278] Sending another packet ... transmission finished! 13:52:30.155 -> [SX1278] Sending another packet ... transmission finished! 13:52:31.197 -> [SX1278] Sending another packet ... transmission finished! 13:52:32.219 -> [SX1278] Sending another packet ... transmission finished! 13:52:33.224 -> [SX1278] Sending another packet ... transmission finished! 13:52:34.279 -> [SX1278] Sending another packet ... transmission finished! 13:52:35.280 -> [SX1278] Sending another packet ... transmission finished! 13:52:36.330 -> [SX1278] Sending another packet ... transmission finished! 13:52:37.347 -> [SX1278] Sending another packet ... transmission finished! 13:52:38.411 -> [SX1278] Sending another packet ... transmission finished! 13:52:39.421 -> [SX1278] Sending another packet ... transmission finished! 13:52:40.436 -> [SX1278] Sending another packet ... transmission finished! 13:52:41.464 -> [SX1278] Sending another packet ... transmission finished! 13:52:42.516 -> [SX1278] Sending another packet ... transmission finished! 13:52:43.518 -> [SX1278] Sending another packet ... transmission finished! 13:52:44.561 -> [SX1278] Sending another packet ... transmission finished! 13:52:45.591 -> [SX1278] Sending another packet ... transmission finished! 13:52:46.620 -> [SX1278] Sending another packet ... transmission finished! 13:52:47.624 -> [SX1278] Sending another packet ... transmission finished! 13:52:48.683 -> [SX1278] Sending another packet ... transmission finished! 13:52:49.700 -> [SX1278] Sending another packet ... transmission finished! 13:52:50.704 -> [SX1278] Sending another packet ... transmission finished! 13:52:51.754 -> [SX1278] Sending another packet ... transmission finished! 13:52:52.773 -> [SX1278] Sending another packet ... transmission finished! 13:52:53.823 -> [SX1278] Sending another packet ... transmission finished! 13:52:54.811 -> [SX1278] Sending another packet ... transmission finished! 13:52:55.870 -> [SX1278] Sending another packet ... transmission finished! 13:52:56.864 -> [SX1278] Sending another packet ... transmission finished! 13:52:57.884 -> [SX1278] Sending another packet ... transmission finished! 13:52:58.919 -> [SX1278] Sending another packet ... transmission finished! 13:52:59.938 -> [SX1278] Sending another packet ... transmission finished! 13:53:01.005 -> [SX1278] Sending another packet ... transmission finished! 13:53:01.994 -> [SX1278] Sending another packet ... transmission finished! 13:53:03.028 -> [SX1278] Sending another packet ... transmission finished! 13:53:04.048 -> [SX1278] Sending another packet ... transmission finished! 13:53:05.067 -> [SX1278] Sending another packet ... transmission finished! 13:53:06.118 -> [SX1278] Sending another packet ... transmission finished! 13:53:07.137 -> [SX1278] Sending another packet ... transmission finished! 13:53:08.154 -> [SX1278] Sending another packet ... transmission finished! 13:53:09.189 -> [SX1278] Sending another packet ... transmission finished! 13:53:10.200 -> [SX1278] Sending another packet ... transmission finished! 13:53:11.239 -> [SX1278] Sending another packet ... transmission finished! 13:53:12.297 -> [SX1278] Sending another packet ... transmission finished! 13:53:13.339 -> [SX1278] Sending another packet ... transmission finished! 13:53:14.386 -> [SX1278] Sending another packet ... transmission finished! 13:53:15.432 -> [SX1278] Sending another packet ... transmission finished! 13:53:16.502 -> [SX1278] Sending another packet ... transmission finished! 13:53:17.535 -> [SX1278] Sending another packet ... transmission finished! 13:53:18.589 -> [SX1278] Sending another packet ... transmission finished! 13:53:19.619 -> [SX1278] Sending another packet ... transmission finished! 13:53:20.650 -> [SX1278] Sending another packet ... transmission finished! 13:53:21.697 -> [SX1278] Sending another packet ... transmission finished! 13:53:22.739 -> [SX1278] Sending another packet ... transmission finished! 13:53:23.784 -> [SX1278] Sending another packet ... transmission finished! 13:53:24.786 -> [SX1278] Sending another packet ... transmission finished! 13:53:25.807 -> [SX1278] Sending another packet ... transmission finished! 13:53:26.844 -> [SX1278] Sending another packet ... transmission finished! 13:53:27.878 -> [SX1278] Sending another packet ... transmission finished! 13:53:28.933 -> [SX1278] Sending another packet ... transmission finished! 13:53:30.014 -> [SX1278] Sending another packet ... transmission finished! 13:53:31.033 -> [SX1278] Sending another packet ... transmission finished! 13:53:32.095 -> [SX1278] Sending another packet ... transmission finished! 13:53:33.139 -> [SX1278] Sending another packet ... transmission finished! 13:53:34.179 -> [SX1278] Sending another packet ... transmission finished! 13:53:35.249 -> [SX1278] Sending another packet ... transmission finished! 13:53:36.260 -> [SX1278] Sending another packet ... transmission finished! 13:53:37.328 -> [SX1278] Sending another packet ... transmission finished! 13:53:38.354 -> [SX1278] Sending another packet ... transmission finished! 13:53:39.377 -> [SX1278] Sending another packet ... transmission finished! 13:53:40.436 -> [SX1278] Sending another packet ... transmission finished! 13:53:41.485 -> [SX1278] Sending another packet ... transmission finished! 13:53:42.491 -> [SX1278] Sending another packet ... transmission finished! 13:53:43.507 -> [SX1278] Sending another packet ... transmission finished! 13:53:44.557 -> [SX1278] Sending another packet ... transmission finished! 13:53:45.566 -> [SX1278] Sending another packet ... transmission finished! 13:53:46.640 -> [SX1278] Sending another packet ... transmission finished! 13:53:47.712 -> [SX1278] Sending another packet ... transmission finished! 13:53:48.787 -> [SX1278] Sending another packet ... transmission finished! 13:53:49.829 -> [SX1278] Sending another packet ... transmission finished! 13:53:50.897 -> [SX1278] Sending another packet ... transmission finished! 13:53:51.963 -> [SX1278] Sending another packet ... transmission finished! 13:53:53.007 -> [SX1278] Sending another packet ... transmission finished! 13:53:54.078 -> [SX1278] Sending another packet ... transmission finished! 13:53:55.109 -> [SX1278] Sending another packet ... transmission finished! 13:53:56.172 -> [SX1278] Sending another packet ... transmission finished! 13:53:57.235 -> [SX1278] Sending another packet ... transmission finished! 13:53:58.274 -> [SX1278] Sending another packet ... transmission finished! 13:53:59.323 -> [SX1278] Sending another packet ... transmission finished! 13:54:00.363 -> [SX1278] Sending another packet ... transmission finished! 13:54:01.399 -> [SX1278] Sending another packet ... transmission finished! 13:54:02.435 -> [SX1278] Sending another packet ... transmission finished! 13:54:03.464 -> [SX1278] Sending another packet ... transmission finished! 13:54:04.502 -> [SX1278] Sending another packet ... transmission finished! 13:54:05.544 -> [SX1278] Sending another packet ... transmission finished! 13:54:06.574 -> [SX1278] Sending another packet ... transmission finished! 13:54:07.610 -> [SX1278] Sending another packet ... transmission finished! 13:54:08.645 -> [SX1278] Sending another packet ... transmission finished! 13:54:09.637 -> [SX1278] Sending another packet ... transmission finished! 13:54:10.713 -> [SX1278] Sending another packet ... transmission finished! 13:54:11.758 -> [SX1278] Sending another packet ... transmission finished! 13:54:12.830 -> [SX1278] Sending another packet ... transmission finished! 13:54:13.859 -> [SX1278] Sending another packet ... transmission finished! 13:54:14.939 -> [SX1278] Sending another packet ... transmission finished! 13:54:15.986 -> [SX1278] Sending another packet ... transmission finished! 13:54:17.008 -> [SX1278] Sending another packet ... transmission finished! 13:54:18.081 -> [SX1278] Sending another packet ... transmission finished! 13:54:19.113 -> [SX1278] Sending another packet ... transmission finished! 13:54:20.141 -> [SX1278] Sending another packet ... transmission finished! 13:54:21.195 -> [SX1278] Sending another packet ... transmission finished! 13:54:22.190 -> [SX1278] Sending another packet ... transmission finished!

Receiver :

13:53:12.325 > ReceivedFlag, Reading 13:53:12.378 > [SX1278] Received packet! 13:53:12.378 > [SX1278] Data: �������������� 13:53:12.378 > [SX1278] RSSI: -62.00 dBm 13:53:12.378 > [SX1278] SNR: 9.00 dB 13:53:12.378 > [SX1278] Frequency error: -1149.24 Hz 13:53:13.375 > ReceivedFlag, Reading 13:53:13.378 > [SX1278] Received packet! 13:53:13.383 > [SX1278] Data: ������������� 13:53:13.383 > [SX1278] RSSI: -63.00 dBm 13:53:13.385 > [SX1278] SNR: 9.50 dB 13:53:13.387 > [SX1278] Frequency error: -1166.02 Hz 13:53:14.426 > ReceivedFlag, Reading 13:53:14.428 > [SX1278] Received packet! 13:53:14.433 > [SX1278] Data: ������������ 13:53:14.433 > [SX1278] RSSI: -63.00 dBm 13:53:14.437 > [SX1278] SNR: 9.25 dB 13:53:14.438 > [SX1278] Frequency error: -1166.02 Hz 13:53:15.476 > ReceivedFlag, Reading 13:53:15.478 > [SX1278] Received packet! 13:53:15.481 > [SX1278] Data: ����������� 13:53:15.483 > [SX1278] RSSI: -63.00 dBm 13:53:15.486 > [SX1278] SNR: 9.25 dB 13:53:15.488 > [SX1278] Frequency error: -1166.02 Hz 13:53:16.519 > ReceivedFlag, Reading 13:53:16.526 > [SX1278] Received packet! 13:53:16.526 > [SX1278] Data: ���������� 13:53:16.526 > [SX1278] RSSI: -63.00 dBm 13:53:16.529 > [SX1278] SNR: 9.50 dB 13:53:16.531 > [SX1278] Frequency error: -1166.02 Hz 13:53:17.402 > Changing SF to 9 13:53:27.406 > Changing SF to 7 13:53:37.407 > Changing SF to 9 13:53:47.408 > Changing SF to 7 13:53:57.409 > Changing SF to 9 13:54:07.411 > Changing SF to 7 13:54:17.412 > Changing SF to 9 13:54:27.413 > Changing SF to 7 13:54:37.414 > Changing SF to 9 13:54:47.415 > Changing SF to 7 13:54:57.417 > Changing SF to 9 13:55:07.418 > Changing SF to 7

With Debug and Verbose activated : https://pastebin.com/UsaXczMv

Additional info (please complete):

jgromes commented 3 years ago

When you change modem configuration (such as spreading factor), the module is put into standby to not mess up any on-going transmission or reception. That will also stop the receive mode, so call startReceive() again after you change the spreading factor.

HamzaHajeir commented 3 years ago

When you change modem configuration (such as spreading factor), the module is put into standby to not mess up any on-going transmission or reception. That will also stop the receive mode, so call startReceive() again after you change the spreading factor.

Hi

Thank you for the quick response, I've missed this point. I'll retest asap and inform with results.

Thanks

jgromes commented 3 years ago

Closed due to inactivity, feel free to reopen later.

HamzaHajeir commented 3 years ago

Forgot to feedback. It works properly.