Using Serial and software Serial read at a same instant!?

Hello,
I am using atMega 328 for one of my project which has RF and Nextion display.
Both of them works on Serial.
Currently I am using Hardware serial for RF and software serial for Nextion.
But still few time I am observing loosing data on hardware Serial as I can see data received on RF but MCU haven't cached it.
As I know that we cant use two software serial read at a same time, I doubt is it because the hardware Serial also doesn't work on simultaneously with software Serial

Please guide me on the same.

Regards

Start by posting your sketch

#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <SendOnlySoftwareSerial.h>

SendOnlySoftwareSerial mySerial(3); // RX, TX
SoftwareSerial HMISerial(4, 5); // RX, TX

bool U_R[8][4], U_Mode[8], Slave_Change_Flag[8], Slave_Comm_Status[8];
int Slave_Att_Cnt[8];
long Slave_Att_Timer[8], Start_Time[8];

byte RxBuff[50];
byte pageNo = 1;
bool EndData, StartData, changeVar;
int bufferPtr;
byte RxBuffer[50] = "";
int NameEdit;
int UnitNo=1;
char Unit_S[8][10];
long blinkTime ;

void setup() 
{
  Serial.begin(9600);
  mySerial.begin(9600);  // used for RF communication but only used tx of mySerial and used RX of hardware Serial
  HMISerial.begin(9600);
  FirstTimeCheck(); //check whether system is first time started to fill EEPROM with default
  EEPROM_Read();    // Load name for EEPROM

  Serial.println(F("Starting Master_1105"));
  HMISerial.print("page logo");
  HMISerial.write(0xFF);
  HMISerial.write(0xFF);
  HMISerial.write(0xFF);

  delay(2000);

  long startTime = millis();

  for (int i = 0; i < 8; i++) {
    SlaveCheck(i);
    startTime = millis();
    while (millis() - startTime <= 500)
    {
      checkSlaveResp();
    }

  }
  for (int i = 0; i < 8; i++) {
    Start_Time[i] = millis();
  }
}
void FirstTimeCheck(void) 
{
  if (EEPROM.read(7) != 7) {    // eeprom default status
    for (int j = 0; j < 8; j++) {
      sprintf(Unit_S[j], "Unit-%d", (j + 1));
      for (int i = 0; i < 10; i++) {
        EEPROM.update(100 + i + (j * 10), Unit_S[j][i]);
      }
    }
    EEPROM.update(7, 7);
  }
}
void EEPROM_Read(void) 
{
  for (int j = 0; j < 8; j++)
  {
    for (int i = 0; i < 10; i++) {
      Unit_S[j][i] = EEPROM.read(100 + i + (j * 10));
    }
  }
}
void SlaveCheck (byte ADDR)
{
  Serial.println("Checking Slave");
  byte buff[4];
  buff[0] = 2;
  buff[1] = ADDR + 48;
  buff[2] = 0X00;
  buff[3] = 3;
  //Serial.println(F("Checking Slave"));
  mySerial.write(buff[0]);
  mySerial.write(buff[1]);
  mySerial.write(buff[2]);
  mySerial.write(buff[3]);
  Serial.println("Sending");
  Serial.println(buff[0], BIN);
  Serial.println(buff[1], BIN);
  Serial.println(buff[2], BIN);
  Serial.println(buff[3], BIN);
  Slave_Comm_Status[ADDR] = 0;
  delay(100);
}

void checkSlaveResp (void)
{
  if (Serial.available() > 0)
  {
    readSerial();
  }
}

void readSerial (void)
{
  Serial.println(F("getting Data"));
  for (int i = 0; i < 50; i++)
  {
    RxBuff[i] = 0;
  }
  while (Serial.available() > 0)
  {
    Serial.println(F("checking Data"));
    byte dataByte = Serial.read();
    Serial.println(dataByte, BIN);
    if (dataByte == 2) {
      Serial.println(F("In # loop"));
      bufferPtr = 0;
      for (int i = 0; i < 50; i++)
      {
        RxBuffer[i] = 0;
      }
      EndData = 0;
      StartData = 1;
    }
    else if (dataByte == 3 && StartData == 1) {
      Serial.println(F("In * loop"));
      EndData = 1;
      StartData = 0;
      RxBuffer[bufferPtr] = '\0';
      Serial.print("Byte1=");
      Serial.println(RxBuffer[0], BIN);
      Serial.print("Byte2=");
      Serial.println(RxBuffer[1], BIN);
      Serial.print("Byte3=");
      Serial.println((RxBuffer[2]), BIN);
      Serial.println(RxBuffer[3]);
      break;
    }
    else if (StartData == 1) {
      Serial.print("dataByte=");
      Serial.println(dataByte, HEX);
      RxBuffer[bufferPtr] = dataByte;
      bufferPtr++;
    }

  }

  if (EndData == 1)
  {
    EndData = 0;
    Serial.print("ReceivedData=");
    Serial.println(RxBuffer[0],BIN);
    Serial.println(RxBuffer[1],BIN);
    Serial.println(RxBuffer[2],BIN);
    Serial.println(RxBuffer[3],BIN);
    Serial.println(RxBuffer[4],BIN);
    decodeBuffer();
   
    bufferPtr = 0;
  }
  else
  {
    Serial.println(F("Intrupted"));
  }
}

void decodeBuffer() {
  char buff[10];
  int SlaveAddr = RxBuffer[0] - 48;
  bool SlaveMode = RxBuffer[1] >> 7 & 1;
  bool Rel4_St = RxBuffer[1] >> 6 & 1;
  bool Rel3_St = RxBuffer[1] >> 5 & 1;
  bool Rel2_St = RxBuffer[1] >> 4 & 1;
  bool Rel1_St = RxBuffer[1] >> 3 & 1;
  

  U_Mode[SlaveAddr] = SlaveMode;
  U_R[SlaveAddr][0] = Rel1_St;
  U_R[SlaveAddr][1] = Rel2_St;
  U_R[SlaveAddr][2] = Rel3_St;
  U_R[SlaveAddr][3] = Rel4_St;

        Serial.print("SlaveAddr=");
  Serial.print(SlaveAddr);
  Serial.print("\tSlaveMode=");
  Serial.print(U_Mode[SlaveAddr]);
    Serial.print("\tRel4_St=");
  Serial.print(U_R[SlaveAddr][3]);
  Serial.print("\tRel3_St=");
  Serial.print(U_R[SlaveAddr][2]);
  Serial.print("\tRel2_St=");
  Serial.print(U_R[SlaveAddr][1]);
  Serial.print("\tRel1_St=");
  Serial.println(U_R[SlaveAddr][0]);
  
  Start_Time[SlaveAddr] = millis();
  Slave_Comm_Status[SlaveAddr] = 1;
  Slave_Att_Cnt[SlaveAddr] = 0;
  Serial.print(F("\tSlave communicated ="));
  Serial.print(SlaveAddr);
  changeVar = 1;
}
void NameUpdate()
{
  char txt[25];
  for (int j = 0; j < 8; j++) {
    sprintf(txt, "t%d.txt=\"%s\"", j, Unit_S[j]);
    //Serial.print(F("txt="));
    Serial.println(txt);
    HMISerial.print(txt);
    HMISerial.write(0xFF);
    HMISerial.write(0xFF);
    HMISerial.write(0xFF);
    delay(10);

  }

}
void Name1Update()
{
  char txt[25];

  //for (int j = 0; j < 4; j++) {
    sprintf(txt, "t%d.txt=\"%s\"", (pageNo-2), Unit_S[pageNo-2]);
    Serial.print(F("txt="));
    Serial.println(txt);
    HMISerial.print(txt);
    HMISerial.write(0xFF);
    HMISerial.write(0xFF);
    HMISerial.write(0xFF);
    delay(10);
  //}
}
void Name2Update()
{
  char txt[25];

  for (int j = 4; j < 8; j++) {
    sprintf(txt, "t%d.txt=\"%s\"", (j - 4), Unit_S[j]);
    Serial.print(F("txt="));
    Serial.println(txt);
    HMISerial.print(txt);
    HMISerial.write(0xFF);
    HMISerial.write(0xFF);
    HMISerial.write(0xFF);
    delay(10);
  }
}

void set_Led(void)
{
  if ( changeVar == 1) {
    changeVar = 0;

   /* Serial.print(F("Slave 1 comm status="));
    Serial.print(Slave_Comm_Status[1]);
    Serial.print(F("\t\t Slave_Att_Cnt="));
    Serial.println(Slave_Att_Cnt[1]);

    Serial.print(F("Slave 3 comm status="));
    Serial.print(Slave_Comm_Status[3]);
    Serial.print(F("\t\t Slave3_U_Mode="));
    Serial.println(U_Mode[3]);*/
    if (pageNo == 1) {
      NameUpdate();

      char txt[15] = {""};
      
        for (int j = 0; j < 8; j++) {
          for (int i = 0; i < 4; i++) {
        if (Slave_Comm_Status[j] == 0 && Slave_Att_Cnt[j] >= 3) {
          sprintf(txt, "p%d.pic=24",((j*4)+i+2));
         // txt[1] = i + 48 + 2;
          HMISerial.print(txt);
          //Serial.println(txt);
        }
        else if (U_R[j][i]) {
          sprintf(txt, "p%d.pic=23",((j*4)+i+2));
        //  txt[1] = i + 48 + 2;
          HMISerial.print(txt);
         // Serial.println(txt);

        }
        else {
          sprintf(txt, "p%d.pic=25",((j*4)+i+2));
        //  txt[1] = i + 48 + 2;
          HMISerial.print(txt);
         // Serial.println(txt);

        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }
        }

      for (int i = 0; i < 8; i++) {
        if (U_Mode[i] && Slave_Comm_Status[i]) {
          char txt[15] = {""};
          sprintf(txt, "p%d.pic=8",(i+34));
          HMISerial.print(txt);
       //   Serial.println(txt);
        }
        else if (U_Mode[i] == 0 && Slave_Comm_Status[i]) {
          char txt[15] = {""};
          sprintf(txt, "p%d.pic=9",(i+34));
          HMISerial.print(txt);
        //  Serial.println(txt);
        }
        else if (Slave_Comm_Status[i] == 0 && Slave_Att_Cnt[i] >= 3) {
         // Serial.print(F("Cant receive for "));
        //  Serial.println(i);
          char txt[15] = {""};
          sprintf(txt, "p%d.pic=16",(i+34));
          HMISerial.print(txt);
         // Serial.println(txt);
        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }
      //Serial.println("Modigying");

    }
    else if (pageNo == 2) {
      //Name1Update();
      //Serial.println("Modifying");
      char txt[15] = {""};
        //sprintf(txt, "t0.txt=UNIT-%d",UnitNo);
        
        sprintf(txt, "t0.txt=\"%s\"",Unit_S[UnitNo-1]);
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
       /* if(UnitNo==1){
         sprintf(txt, "t5.txt=\"Master Control\"");
        }
        else
        {
          sprintf(txt, "t5.txt=\"Previous Page\"");
        }*/
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF); 
        if(UnitNo==8){
          sprintf(txt, "p10.pic=26");
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF); 
        }
        else{
           sprintf(txt, "p10.pic=12");
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF); 
        }
        bool Green=1,red=1;
        
     //   Serial.println(txt);
      for (int i = 0; i < 4; i++) {
        if (Slave_Comm_Status[UnitNo-1] == 0 && Slave_Att_Cnt[UnitNo-1] >= 3) {
          sprintf(txt, "p%d.pic=18",i+1);
         // txt[1] = i + 48 + 1;
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF); 
        }
        else if (U_R[UnitNo-1][i]) {
        sprintf(txt, "p%d.pic=4",i+1);
        red=0;
         // txt[1] = i + 48 + 1;
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF); 
       //   Serial.println(txt);
       
        }
        else {
          sprintf(txt, "p%d.pic=3",i+1);
         // txt[1] = i + 48 + 1;
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF); 
        //  Serial.println(txt);
        Green=0;
        }
        
      

   /*   for (int i = 0; i < 4; i++) {

        if (Slave_Comm_Status[i] == 0 && Slave_Att_Cnt[i] >= 3) {
          sprintf(txt, "p1.pic=18");
          txt[1] = i + 48 + 1;
          HMISerial.print(txt);
        }
        else if (U_R[i]) {
          sprintf(txt, "p1.pic=4");
          txt[1] = i + 48 + 1;
          HMISerial.print(txt);
        //  Serial.println(txt);
        }
        else {
          sprintf(txt, "p1.pic=3");
          txt[1] = i + 48 + 1;
          HMISerial.print(txt);
         // Serial.println(txt);
        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
*/
Serial.print("UnitNo");
Serial.println(UnitNo);
Serial.print("U_Mode[UnitNo-1]");
Serial.println(U_Mode[UnitNo-1]);
Serial.print("Slave_Comm_Status[UnitNo-1]");
Serial.println(Slave_Comm_Status[UnitNo-1]);
      }
        if (U_Mode[UnitNo-1] && Slave_Comm_Status[UnitNo-1]) {
          sprintf(txt, "p5.pic=1");
         // txt[1] = i + 48 + 5;
          HMISerial.print(txt);
          // HMISerial.print("p5.pic=1");
        }
        else if (U_Mode[UnitNo-1] == 0 && Slave_Comm_Status[UnitNo-1]) {
          sprintf(txt, "p5.pic=2");
         // txt[1] = i + 48 + 5;
          HMISerial.print(txt);
          //HMISerial.print("p5.pic=2");
        }
        else if (Slave_Comm_Status[UnitNo-1] == 0 && Slave_Att_Cnt[UnitNo-1] >= 3) {
          sprintf(txt, "p5.pic=17");
         // txt[1] = i + 48 + 5;
          HMISerial.print(txt);
          // HMISerial.print("p5.pic=17");

        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      
      if(Green==1)
      {
        sprintf(txt, "p11.pic=7");
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }
      else if( red ==1)
      {
        sprintf(txt, "p11.pic=6");
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }
      

    }

    else if (pageNo == 3) 
    {
      Name2Update();
      char txt[15] = {""};
      for (int i = 4; i < 8; i++) 
      {
        if (Slave_Comm_Status[i] == 0 && Slave_Att_Cnt[i] >= 3) {
          sprintf(txt, "p1.pic=18");
          txt[1] = i + 48 - 3;
          HMISerial.print(txt);
        }
        else if (U_R[i]) {
          sprintf(txt, "p1.pic=4");
          txt[1] = i + 48 - 3;
          HMISerial.print(txt);
       //   Serial.println(txt);
        }
        else {
          sprintf(txt, "p1.pic=3");
          txt[1] = i + 48 - 3;
          HMISerial.print(txt);
       //   Serial.println(txt);
        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }
      for (int i = 4; i < 8; i++) {

        if (Slave_Comm_Status[i] == 0 && Slave_Att_Cnt[i] >= 3) {
          sprintf(txt, "p1.pic=18");
          txt[1] = i + 48 - 3;
          HMISerial.print(txt);
        }
        else if (U_R[i]) {
          sprintf(txt, "p1.pic=4");
          txt[1] = i + 48 - 3;
          HMISerial.print(txt);
       //   Serial.println(txt);
        }
        else {
          sprintf(txt, "p1.pic=3");
          txt[1] = i + 48 - 3;
          HMISerial.print(txt);
       //   Serial.println(txt);
        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);

        if (U_Mode[i] && Slave_Comm_Status[i]) {
          sprintf(txt, "p5.pic=1");
          txt[1] = i + 48 + 1;
          HMISerial.print(txt);
          // HMISerial.print("p5.pic=1");
        }
        else if (U_Mode[i] == 0 && Slave_Comm_Status[i]) {
          sprintf(txt, "p5.pic=2");
          txt[1] = i + 48 + 1;
          HMISerial.print(txt);
          //HMISerial.print("p5.pic=2");
        }
        else if (Slave_Comm_Status[i] == 0 && Slave_Att_Cnt[i] >= 3) {
          sprintf(txt, "p5.pic=17");
          txt[1] = i + 48 + 1;
          HMISerial.print(txt);
          // HMISerial.print("p5.pic=17");

        }
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }


    }
    else if (pageNo == 4)
    {
      char txt[25];
      for (int j = 0; j < 8; j++) {
        sprintf(txt, "t%d.txt=\"%s\"", (j + 10), Unit_S[j]);
        Serial.print(F("TXT="));
        Serial.println(txt);
        HMISerial.print(txt);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
        HMISerial.write(0xFF);
      }
    }
    else if (pageNo == 5)
    {
      Serial.println(F("Page No =5"));
    }
  }

}
void scanSwitch(void)
{
  //HMISerial.listen();
  if (HMISerial.available())
  {
    int ptr = 0, RxData = 0;
    char ac;
    char t;
    // Serial.println(F("HMI data="));
    while (HMISerial.available())
    {
      t = HMISerial.read();
      Serial.print("HMI data=");
      Serial.println(t, BIN);
      if (t == '*' || t == '^') {
        ac = t;
        break;
      }
      RxData *= 10;
      RxData += t - 48;
      delay(2);
      changeVar = 1;
    }
    Serial.println(RxData);
    // HMISerial.listen();
    if (RxData > 9 && RxData < 90) {
      Serial.print("Sw Loop=");
      Serial.println(RxData);
      int SwNo = (RxData / 10) - 1;
      int relStat = RxData % 10;
       Serial.print("UnitNo=");
      Serial.println(UnitNo);
      Serial.print("SwNo=");
      Serial.println(SwNo);
      Serial.print("relStat=");
      Serial.println(relStat);
      Slave_Change_Flag[UnitNo-1] = 1;
      U_R[UnitNo-1][SwNo] = relStat;
    }
    else if (RxData > 2000 && RxData < 2009) {
      Serial.println("Name Loop=");
      NameEdit = RxData - 2001;
      HMISerial.print("page Setting");
      HMISerial.write(0xFF);
      HMISerial.write(0xFF);
      HMISerial.write(0xFF);
delay(10);
char txt[25];
       sprintf(txt, "t0.txt=\"%s\"", Unit_S[NameEdit]);
       HMISerial.print(txt);
        HMISerial.write(0xFF);
      HMISerial.write(0xFF);
      HMISerial.write(0xFF);
      
      pageNo = 5;
      changeVar = 1;
    }
    else if(RxData > 1009 && RxData < 1019)
    {
          pageNo = 2;
          UnitNo = RxData-1009;
          changeVar = 1;
          HMISerial.print("page page2");
          Serial.println("Saving and exiting");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
     }
    else if (t == '*') 
    {
      Serial.println("Name Rx=");
      char Name[10] = "";
      int cnt = 0;
      char t;
      while (HMISerial.available())
      {

        t = HMISerial.read();
        if (t == '!') {
          break;
        }
        Name[cnt] = t;
        cnt++;
      }
      Name[cnt] = '\0';
      sprintf(Unit_S[NameEdit], "%s", Name);
      for (int i = 0; i < 10; i++) {
        EEPROM.update(100 + i + (NameEdit * 10) , Unit_S[NameEdit][i]);
      }
    }
    else if(t== '^')
    {
       Serial.println("Closing Name tab");
    }
    else
    {
      Serial.print("Page Loop=");
      Serial.println(RxData);
      switch (RxData) {

        case 1000:
        if(UnitNo==1)
        {
          pageNo = 1;
        }
        else
        {
          pageNo = 2;
          UnitNo--;
        }
          pageNo=1;
          UnitNo=1;
          changeVar = 1;
          if(pageNo==1){
          HMISerial.print("page page1");
          }
         //else{
         //    HMISerial.print("page page2");
         // }
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          break;

        case 1001:
          pageNo = 2;       
          changeVar = 1;
          HMISerial.print("page page2");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          break;

        case 1002:
          pageNo = 2;
          UnitNo++;
          if(UnitNo>8){
            UnitNo=8;
           HMISerial.print("p10.pic=26");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF); 
          }
          else{
          HMISerial.print("p10.pic=12");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF); 
          }
          changeVar = 1;
          /*HMISerial.print("page page2");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);*/
          break;
        case 1003:
          pageNo = 4;
          changeVar = 1;
          HMISerial.print("page Name");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);


HMISerial.print("line 155,2,155,480,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 375,2,375,480,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 585,2,585,480,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,40,585,40,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,90,585,90,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,145,585,145,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,200,585,200,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,255,585,255,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,310,585,310,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,365,585,365,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,420,585,420,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.print("line 155,475,585,475,WHITE");
HMISerial.write(0xFF);
HMISerial.write(0xFF);
HMISerial.write(0xFF);

          
          break;
        case 1004:
          pageNo = 5;
          changeVar = 1;
          HMISerial.print("page Setting");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          break;
          
         case 1007:
         pageNo = 1;
          changeVar = 1;
          HMISerial.print("page page1");
          Serial.println("Saving and exiting");
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
          HMISerial.write(0xFF);
           break;
             
        case 98:
        if(pageNo==1){
        for (int j = 0; j < 8; j++) {
          for (int i = 0; i < 4; i++) {
            Slave_Change_Flag[j] = 1;
            U_R[j][i] = 0;
          }
        }
        }
        else if(pageNo==2)
        {
           for (int i = 0; i < 4; i++) {
            Slave_Change_Flag[UnitNo-1] = 1;
            U_R[UnitNo-1][i] = 0;
          }
        }
          break;

        case 99:
         if(pageNo==1){
         for (int j = 0; j < 8; j++) {
          for (int i = 0; i < 4; i++) {
            Slave_Change_Flag[j] = 1;
            U_R[j][i] = 1;
          }
         }
         }
 else if(pageNo==2)
        {
           for (int i = 0; i < 4; i++) {
            Slave_Change_Flag[UnitNo-1] = 1;
            U_R[UnitNo-1][i] = 1;
          }
        }
          break;
          
                 
      }
    }
    Serial.print("Page No=");
    Serial.println(pageNo);
    //Serial.println(F("Lets try it out");
    //delay(2000);

  }
}
void slaverfUpdate (int i)
{
  byte buff[8];
  buff[0] = 2;
  buff[1] = i + 48;
  buff[2] = 0X0F << 4 | U_R[i][3] | U_R[i][2] << 1| U_R[i][1] << 2| U_R[i][0]<< 3 ;
  buff[3] = 3;
  //buff[4]='\0';

  Serial.println(F("Sending Data1="));
  //Serial.println(buff);
  Serial.print("\t 1=");
  Serial.print(buff[1], BIN);
  Serial.print("\t 2=");
  Serial.println(buff[2], BIN);
  byte test = buff[2];
  Serial.print("Test=");
  Serial.println(test, BIN);

  //for(int i=0;i<3;i++){

  for (int a = 0; a < 4; a++) {
    mySerial.write(buff[a]);
  }
  delay(50);
  //}
  delay(150);
}

void loop()
{
  // put your main code here, to run repeatedly:
  scanSwitch();
  set_Led();
  for (int i = 0; i < 8; i++) {
    if (Slave_Change_Flag[i]) {
      Serial.print("Slave Change Flag=");
       Serial.println(i);
      slaverfUpdate(i);
      Slave_Change_Flag[i] = 0;
      Slave_Comm_Status[i] = 0;
      Slave_Att_Cnt[i] = 0;
      Slave_Att_Timer[i] = millis();
      changeVar = 1;
    }
  }

  checkSlaveResp();
  for (int i = 0; i < 8; i++) {
    if ( Slave_Comm_Status[i] == 0 && Slave_Att_Cnt[i] < 3 && ( (Slave_Att_Timer[i] > millis()) || (millis() - Slave_Att_Timer[i]) > 3000 )) {
      Slave_Att_Timer[i] = millis();
      slaverfUpdate(i);
      Slave_Att_Cnt[i]++;
      if (Slave_Att_Cnt[i] >= 3)
      {
        changeVar = 1;
      }
    }
  }

  for (int i = 0; i < 8; i++) {
    if ((millis() - Start_Time[i]) >= 300000  ||  Start_Time[i] > millis()) {
      SlaveCheck(i);
      Start_Time[i] = millis();
     // Serial.print(F("Checking Slave Status "));
     // Serial.println(i);

    }
  }
}

If your software Serial turns off interrupts then most communication hardware may fail to work.

1 Like

Is there any way to handle both the serials as in both of them occurrence is undefined.

Are you really? the code says otherwise

SendOnlySoftwareSerial mySerial(3); // RX, TX
...
  mySerial.begin(9600);  // used for RF communication but only used tx of mySerial and used RX of hardware Serial

Seems Serial is just used for debug statements (and uploading the code)

to add to what @DrDiettrich said

the SendOnlySoftwareSerial is just the code of SoftwareSerial without the receiving part (thus not creating the issue with the pin change interrupts) but both will suspend interrupts when they send a byte out - and at 9600 bauds, that can be a long time

so if you do a lot of writes on both ports, you'll end up crippling the hardware serial reception too and might miss data

if you have a need for 3 UARTs, I'd suggest to use a MEGA (or MEGA mini if board size matters)

1 Like

I have following configuration

Hardware Serial - TX - Serial monitor
Hardware Serial - RX - RF Receiver

Software Serial1 TX- RF transmitter
Software Serial2 TX and RX -HMI.

So is choosing baud rate of 115200 at RF will help?

No my hardware is frozen couldn't change it

you would minimise the time during which interrupts are off but it's not rock solid.

Do you really need the Serial monitor for debug?

No its not that necessary as my code is now frozen mostly.
But its always good to have that's why I kept

I understand. This seems to indicate that you made technical decisions without looking at the the full requirements / assessing if the 328p was "good enough"

not always...

I understand that it's convenient but you are missing out on a hardware hardwired capability for one of your Tx "just in case"...

In my opinion given it's critical for your code to not miss any data, I would use the hardware capability for the mission critical job and find other ways to report status (blink a led, ...)

1 Like

As @J-M-L said, it seems that a poor decision was made too early. :frowning_face:

Lesson to learn: If the system requires n serial links, pick a chip that has at least that many UARTs!

I have not looked at the entire code closely, but I do notice that the readSerial() function is sending a large amount of text to Serial for each character that is read from Serial. This could easily fill the transmit buffer, and allow the receive buffer to overflow while waiting for characters to be sent.

1 Like

Right, print/println are blocking methods. Thanks for pointing out :slight_smile:

Bad test program causing the problem?

I couldn't get it,
Can you explain it in detail.

print by default does not block, it copies in an outgoing circular buffer (64 bytes deep) the bytes that will be sent out and returns. But if the outgoing buffer is full, then print() waits until there is enough room to add all the message in this buffer and then your print() call is blocking the main code.

So if you print lots of stuff, other bad things can happen in the code, like you won't go back to the top of the loop to check the reception of other messages and the incoming buffer can fill up too (it can hold only 64 bytes)

1 Like

If the output buffer is full, every output statement (print, write...) does not return until the text could be put into the output buffer. During that time the characters arriving at any serial input can fill up the input buffer, by interrupt. As the main code hangs in the output function the input buffer can overflow and further characters will be lost.

Ok so, Now I commented all Serial.print/println functions to avoid blocking of main loop.
Need to test several times whether this resolved the issue or not

Will increasing a buffer size could help in resolving issue?

that depends!

Buffers help when the "peak" rate is too high, but the average is OK.

If your average Tx rate is too high, then no amount of buffering will help - the buffer will fill & overflow eventually.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.