Reading a packet of data in one call

Uh, okay... not quite sure what your vision is here. I need to process all incoming packets at once, for timing reasons...

You changed code in your first post. Please don't do that again. Post the code again, if needed.

  int dataLength = Serial.available();
  char buffer[dataLength];
  while(dataLength>0)
  {
    Serial.readBytes(buffer,Serial.available());

Where in this while loop do you change the value in dataLength? If there is any serial data, you've just entered an endless loop.

Suppose that dataLength is 0. How big an array did you create?

Suppose that an interrupt occurs between the first call to Serial.available(), which say returned 3 and the second call which would now return 4. The amount of data that you just told Serial.readBytes() to read will now not fit in the array.

This dynamically sized array really is not a good idea. Look at the data that you will be sending this function. What is the longest string that you will be sending? Just make the array that size.

It looks to me like your C# application should really be sending an end-of-record marker, and you should be reading serial data until that end of record marker arrives. Only when it does should you use the data that you have received.