Reading multiple cases on Serial
It is looping faster than the serial is delivered, so each time there is a byte delivered, it tests it against 0x30 until nothing is left, and then drops out, leaving nothing .available() for the next if(), so it fails out as well and starts up the loop() again.

I'd read a byte at a time and work with that:

int incomingByte = 0;   // for incoming serial data

void loop(void) {

if(Serial.available())
{
    incomingByte=Serial.read();

    if (incomingByte == 0x30)
    {     
         func1();
    }

    if (incomingBute == 0x31)
    { 
         func2();
    }

}