Arduino MEGA noisy serial streams

Hello All,
I am trying to use an Arduino Mega to read the serial data from two devices and forward them on to a computer for further processing. (A GPS and 10DOF will also be attached at some point but this post is from trying to get the serial feeds working. The devices are not mine, they are from a seperate company, here is the summary given to me:

The PCM transmits a status packet every ~12 seconds in SLEEP, and ~5 seconds when ON.   This is sent over a 433MHz link.  
The Serial Output is this digital stream as demodulated in the receiver after a filtering stage, comparator stage, and op amp buffer.  
The 433MHz link when not active is very noisy, which is most of the time.  To minimize false positive receptions, 
the syntax uses a high degree of redundant formatting and frame bits as well as sends the same packet three times.   
The software in the receiver also looks for this same data twice before accepting it, (two out of the three times it is sent), 
this is recommended in your software.

The data is started UART generated, with high start and stop bits, 1 low start bit, 8 data bits, and no parity.  
Bytes are many bits apart, so a lengthy stop period is used.  The data rate is a non-standard 2857.143bps.  
With a ~2.5% error tolerated, a rate of 2786bps – 2929bps should work.  The bytes per packet and bit designations are listed below.

The bytes should be 0x59 0x63 0xc9 0xV 0xT, where V can be anywhere from 0-63 and T can be anywhere from 0-127.

The code I am using is this:

const int NUM_FIELDS = 5;  // How many fields AFTER reading
                           // the proper address
byte RFvalues1[NUM_FIELDS];  // array holding values for the fields
byte RFvalues2[NUM_FIELDS];

void setup() {
  // initialize both serial ports:
  Serial.begin(38400);
  Serial2.begin(2860);
  Serial3.begin(2860);
  
  
 
}

void loop() 
{

if(Serial2.available()>0)
{
  byte in2byte = Serial2.read();
  
  if(in2byte == 0x59)
  {
  Serial.println("Getting new data!");
  
  for(int i = 0; i < NUM_FIELDS; i++)
       {
        RFvalues1[i] = Serial2.read(); // Get readings 
        RFvalues2[i] = Serial3.read();
        }
  }
}
       
   Serial.println("Start New Field");
   for (int i = 0; i < NUM_FIELDS; i++)
   {
     Serial.print(RFvalues1[i]);
     Serial.print("     ");
     Serial.println(RFvalues2[i]);
   }

I have also attached pictures of the Logic Analyzer, I hope they come through. I know this would be rejected by the criteria for a good data packet but it is what I have to work with at the moment.

Any help would be appreciated.

   RFvalues1[i] = Serial2.read(); // Get readings 
        RFvalues2[i] = Serial3.read();

You are reading 5 values from each of Serial2 and Serial3 without making any attempt to check whether there are 5 bytes available on each of them.

If this was my project I would set up two separate functions - one for each input - using (probably) the second example in serial input basics - or (if appropriate) a variation that is designed to read 5 bytes. If there is an end-marker (such as line-feed) that would be more reliable.

If you can be sure that there are always a fixed number of bytes you could simply use
if (Serial2.available >= N) { - but I would still have a separate small function for each stream - a cut down version of what is in serial input basics.

...R