Cannot obtain reading from meter (Modbus)
You need to stop thinking quite so linearly. You are working with asynchronous systems, so your code has to be asynchronous too.

Something more like this:

#include &lt;SoftwareSerial.h&gt;

#define SerialControl 7

#define RS485Tx HIGH
#define RS485Rx LOW


SoftwareSerial RS485Serial(11, 12);

byte SendKWh[] = { 0x01, 0x03, 0x40, 0x34, 0x00, 0x02, 0x90, 0x05 };

// 0x01: Meter Address, 0x03: Read Function Code, 0x40: Register Address Variable (Start address high bit)
// 0x34: Register Address Variable (Start address low bit)
// 0x00: Register Quantity (High Bit), 0x02: Register Quantity (Low Bit)
// 0x90: CRC check code (CRC code Low bit)
// 0x05: CRC check code (CRC code High bit)

uint8_t window[8]; // Initialising window of 8 bytes

void dumpWin() {
  for (int i = 0; i &lt; 8; i++) {
    Serial.print(window[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}

void ReadRx() {
  if(RS485Serial.available()) {
    uint8_t b = RS485Serial.read();
    dumpWin();
    // Slide the contents of the array down
    for (uint8_t i = 0; i &lt; 7; i++) {
      window[i] = window[i+1];
    }

    window[7] = b; // Next frame inserted at the top of previous  

    if ((window[0] == 0x01) &amp;&amp; (window[1] == 0x03) &amp;&amp;
        (window[2] == 0x40) &amp;&amp; (window[3] == 0x34)) {
          // Doing something with window[4] and window[5] here
    }
  }
}



void setup() {
  Serial.begin(115200);
  pinMode(SerialControl, OUTPUT);
  digitalWrite(SerialControl, RS485Rx);
  RS485Serial.begin(9600); 

}

void loop() {
  static uint32_t ts = millis();

  if (millis() - ts &gt;= 2000) {
      ts = millis();
      digitalWrite(SerialControl, RS485Tx);
      RS485Serial.write(SendKWh, sizeof(SendKWh));
      RS485Serial.flush();
      digitalWrite(SerialControl, RS485Rx);
      RS485Serial.listen();
  }

  ReadRx();
}


Notice how I use millis() to send the command every 2 seconds asynchronously (i.e., without delay()). The RS485 is kept in READ mode except for the brief moment while you send. Also note the use of flush()  to wait until the last symbol has been transmitted by the UART (software in this case) interface. It's important, otherwise you may cut off the transmission part way through (I don't think it's such a problem with SoftwareSerial, but with a hardware UART missing it out would be fatal).

The reading just reads one character and returns to the loop. Each iteration through the loop will (if a character is available) read just one character. Only when all 8 have been received and the contents of the window match up can you process anything (which you would put in place of the comment).

This method also leaves you free to implement other things in loop(), as long as they don't use delay() as well.