How to use serialEvent ?

String sBuffer = "";
  sBuffer.reserve(256);

If you know how big the array is that the String function should wrap, why do you need a String object? Storing data in a char array directly would be faster.

  while (Serial.available())
  {
    char ch = (char)Serial.read();
    sBuffer += ch;  // add it to the buffer
    if (ch == CRC_EOP) EOP_SEEN = true;
  }

If you see a CRC_EOP, set a flag and keep reading. Is that right? Wouldn't you want to break out of the loop and send the data to wherever avrisp() sends it?

What does avrisp() do? Perhaps the issue is that it is blocking for so long that data gets lost before avrisp() returns, and you get back to reading serial data.

You might try modifying the HardwareSerial class to increase the buffer size, to see if that makes any difference.