SX1278 library for Arduino: https://github.com/wirelessopensource/lora_shield_arduino/tree/master/libraries/SX1278

receiveAll() timeout can be modified by changing this value in sx1278.h file.
const uint16_t MAX_TIMEOUT = 10000;        //10000 msec = 10.0 sec

REG_FEI_MSB and REG_FEI_LSB are defined twice in sx1278.h (FSK, LORA). Warnings in sketch compile can be removed by commenting these lines.
#define        REG_FEI_MSB                 0x1D
#define        REG_FEI_LSB                  0x1E

sx1278.cpp

In function uint8_t SX1278::receive() modify line:
// Setting Testmode
writeRegister(0x31,0x43); => writeRegister(0x31,0x3);
[ RegDetectOptimize (0x31)
bits 7-3 Reserved r 0xC0 Reserved
bits 2-0 DetectionOptimize rw 0x03
LoRa Detection Optimize
0x03 -> SF7 to SF12
0x05 -> SF6 ]

Add functions:

void SX1278::setFreq(float f)
{
#if (SX1278_debug_mode > 1)
  Serial.println();
  Serial.println(F("setFreq"));
  Serial.println(bfreq);
#endif

#if (SX1278_debug_mode > 1)
  Serial.println(c);
  Serial.println(f, DEC);
#endif

  byte st0 = readRegister(REG_OP_MODE);    // Save the previous status
  if( _modem == LORA )
  {
      // LoRa Stdby mode in order to write in registers
      writeRegister(REG_OP_MODE, LORA_STANDBY_MODE);
  }
  else
  {
      // FSK Stdby mode in order to write in registers
      writeRegister(REG_OP_MODE, FSK_STANDBY_MODE);
  }

  union freq
  {
    unsigned long lfreq;
    unsigned char cfreq[4];
  } uf;

  uf.lfreq = (f * 1000000) / 61.035;
  writeRegister(REG_FRF_MSB, uf.cfreq[2]);
  writeRegister(REG_FRF_MID, uf.cfreq[1]);
  writeRegister(REG_FRF_LSB, uf.cfreq[0]);
 
  writeRegister(REG_OP_MODE, st0);    // Getting back to previous state
}

float SX1278::getFreq()
{
#if (SX1278_debug_mode > 1)
  Serial.println();
  Serial.println(F("getFreq"));
#endif

  byte fLsb = readRegister(REG_FRF_LSB);
  byte fMid = readRegister(REG_FRF_MID);
  byte fMsb = readRegister(REG_FRF_MSB);
  unsigned long l = fMsb;
  l = (l << 8) + fMid;
  l = (l << 8) + fLsb;
  float f = (l * 61.035) / 1000000;
  return f;
}

sx1278.h add lines:

void setFreq(float f);
float getFreq();

Usage:
f<cr> Set module off
oHC<cr> Set module on. H= '1' header on else header off.  C='1' crc on else crc off

/*
 * https://github.com/wirelessopensource/lora_shield_arduino/tree/master/libraries/SX1278
 *
 * bw = bandwidth, cr = coding rate, sf = spreading factor
 * mode bw  cr  sf  sensitivity (dB)
 * 1    125 4/5 12  -134                max range, slow data rate
 * 2    250 4/5 12  -131
 * 3    125 4/5 10  -129
 * 4    500 4/5 12  -128
 * 5    250 4/5 10  -126
 * 6    500 4/5 11  -125.5
 * 7    250 4/5 9   -123
 * 8    500 4/5 9   -120
 * 9    500 4/5 8   -117
 * 10   500 4/5 7   -114                mim range, fast data rate
 */
#include <SX1278.h>

#define rxPacketLen   255
#define serialEndChar 13
#define serialDataLen 6
#define serialSpeed   38400
#define debug_mode    0

float f868[8] = {868.1, 868.3, 868.5, 867.1, 867.5, 867.7, 867.9     // BW 125 kHz
,867.300};                                                           // BW 250 kHz

byte m868[2] = {1, 3};

char rxPacket[rxPacketLen];

int bytesRead;
char serialData[serialDataLen];
bool bON;
bool bScan;
int modeL = 0;
int modeH = 1;
int fL = 0;
int fH = 7;
int fIndex;
int mIndex;

void setup() {
  Serial.begin(serialSpeed);
  bON = false;
  bScan = false;
}

void loop() {
  if (Serial.available() > 0) {
    bytesRead = Serial.readBytesUntil(serialEndChar, serialData, serialDataLen - 1);
    if (bytesRead > 0) {
      serialData[bytesRead] = 0;
      loraSetup();
      memset(serialData, 0, sizeof(serialData));
    }
  }
  if (bScan == true) {
    scan();
  }
}

void scan() {
  int r;
  if (fIndex > fH) {
    fIndex = fL;
    if (mIndex == modeH) {
      mIndex = modeL;
    }
    else {
      mIndex += 1;
    }
    chgMode();
    delay(10);
  }

  sx1278.setFreq(f868[fIndex]);

#if (debug_mode > 0)
  Serial.println(F("sx1278.setFreq: "));
  Serial.print(f868[fIndex], DEC);
  Serial.println();
#endif

  delay(10);
  rx();
  fIndex += 1;
}

void chgMode() {
  int r = sx1278.setMode(m868[mIndex]);

#if (debug_mode > 0)
  Serial.println(F("sx1278.setMode: "));
  Serial.print(r, DEC);
  Serial.print("\t");
  Serial.print(m868[mIndex], DEC);
  Serial.println();
#endif
}

// receiveAll returns 1 if no packets received within timeout. receive() returns "NOT 'RxDone' flag" when
// timeout and no data received
void rx() {
  int r = sx1278.receiveAll();

#if (debug_mode > 0)
  Serial.print(F("receiveAll: "));
  Serial.println(r, DEC);
#endif
    
  if (r == 0) {
    for (r = 0; r < sx1278.packet_received.length; r++) {
      rxPacket[r] = (char) sx1278.packet_received.data[r];
      if (r == rxPacketLen - 1) {
        break;
      }
    }
    Serial.println(f868[fIndex], DEC);
    Serial.print("\t");
    Serial.print(m868[mIndex], DEC);
    Serial.println(F("Msg: "));
    Serial.print(rxPacket);
    Serial.println();
    memset(rxPacket, 0, sizeof(rxPacket));
  }
}

void loraSetup() {
  bScan = false;
  int r;
  if (serialData[0] == 'f') {
    setOFF();
    return;
  }

  if (serialData[0] == 'o') {
      if (bON == true) {
        setOFF();
        delay(100);
      }
      r = sx1278.ON();
      bON = true;

      Serial.println(F("sx1278.ON: "));
      Serial.print(r, DEC);
      Serial.println();

      delay(100);
      if (strlen(serialData) == 3) {
        if (serialData[1] == '1') {
          r = sx1278.setHeaderON();
          Serial.println(F("sx1278.setHeaderON: "));
        }
        else {
          r = sx1278.setHeaderOFF();
          Serial.println(F("sx1278.setHeaderOFF: "));
        }
        Serial.print(r, DEC);
        Serial.println();

        if (serialData[2] == '1') {
          r = sx1278.setCRC_ON();
          Serial.println(F("sx1278.setCRC_ON: "));
        }
        else {
          r = sx1278.setCRC_OFF();
          Serial.println(F("sx1278.setCRC_OFF: "));  
        }
        Serial.print(r, DEC);
        Serial.println();
        
        fIndex = fL;
        mIndex = modeL;
        chgMode();
        bScan = true;
      }
  }
}

void setOFF() {
  sx1278.OFF();
  bON = false;
  Serial.println(F("sx1278.OFF"));
  Serial.println();
}