Arduino 1.0 new Serial commands

Your program works (by fluke) at a high baud rate (e.g. 115200), but not at a low baud rate. The reason for this is that the findUtil() function reads and discards any communication that is not in the right format (e.g. !...~). At a high baud rate, the buffer can fill up before the findutil has time to process it, meaning that it finds the start character and the terminal character successfully.

At a low baud rate, however, it gets called before the buffer has enough information in, e.g. !xx, and because it does not comply to the format, this gets discarded. Then the rest of the string comes in as xx~, and once again, it does not comply, and gets discarded, so you have lost your entire packet.

The fix is simple. In addition to MarkT's fix, your while loop should also check the length of the available buffer, and it should contain enough characters to hold your whole packet.
I also suggest prefixing some of the information before printing it. Having a bunch of numbers and not knowing which print statement wrote it, is difficult to debug.
So the code should be something like this:

while(Serial.available() >= 6)
{
  Serial.print(F("raw: "));
  Serial.println(Serial.available());
  boolean ready = Serial.findUntil("!","~");
  if(ready)
  {
    Serial.print(F("processed: "));
    Serial.println(Serial.available());
    if (Serial.available() >= 4)
    {
       ... 
    }
  }
}