splitting ASCII string to variables

  char arr[30];
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    char arr[30] ={ Serial1.read()};

This little snippet of code declares TWO arrays of the same name. Really NOT what you want to do.

Tell me, is it that hard to understand that Serial1.read() returns ONE character?

    strcpy(str, arr);

Why? There is no reason to copy the array anywhere. Which arr are you copying, anyway?

    char *chpt = strtok(str, ":");
    if (chpt == NULL) {
        Serial.println("First strok returns NULL");

Would be a good idea if the message printed matched the function call. There is no call to strok.

The str functions, like strcpy(), strtok(), etc. expect strings as arguments. What you are providing are not strings.

A string is a NULL terminated array of chars. What you have is an array of chars that is not NULL terminated. Therefore, it is NOT a string. Therefore, you can not pass it to strcpy() or strtok().

If you have any control over the sender, make it shape up and sent properly delimited data. "!ANG:1.01,0.09,34.84" should be "<!ANG:1.01,0.09,34.84>". Then you can use code like this:

#define SOP '<'
#define EOP '>'

bool started = false;
bool ended = false;

char inData[80];
byte index;

void setup()
{
   Serial.begin(57600);
   // Other stuff...
}

void loop()
{
  // Read all serial data available, as fast as possible
  while(Serial.available() > 0)
  {
    char inChar = Serial.read();
    if(inChar == SOP)
    {
       index = 0;
       inData[index] = '\0';
       started = true;
       ended = false;
    }
    else if(inChar == EOP)
    {
       ended = true;
       break;
    }
    else
    {
      if(index < 79)
      {
        inData[index] = inChar;
        index++;
        inData[index] = '\0';
      }
    }
  }

  // We are here either because all pending serial
  // data has been read OR because an end of
  // packet marker arrived. Which is it?
  if(started && ended)
  {
    // The end of packet marker arrived. Process the packet

    // Reset for the next packet
    started = false;
    ended = false;
    index = 0;
    inData[index] = '\0';
  }
}

To receive the serial data. Where it says "Process the packet" is where you put the code to call strtok() for the NULL terminated string, inData.