(SOLVED)Can any one help?

//Requests the PID and returns the calculated PID result.
byte get_PID(byte PID, long *result, char *result_str)
{
  byte str_cr[16]; //String for compact response data.
  char str_tx[16]; //String for STN transmit data.
  char str_rx[16]; //String for STN receive data.
  
  sprintf_P(str_tx, PSTR("01%02X\r"), PID);
  STN_Transmit(str_tx);
  if(STN_Read(str_rx) == 0)
  {
    Serial.print(str_rx);
    strcpy_P(result_str, PSTR("rERR"));
    return 0;
  }
  Serial.print(str_rx);
  if(STN_Response_Header_Check(str_tx, str_rx) == 0)
  {
    strcpy_P(result_str, PSTR("hERR"));
    return 0;
  }
  STN_Response_Convert(str_cr, str_rx);
  switch(PID)
  {
    case CEL:
    *result = (str_cr[0] * 100) / 255;
    sprintf_P(result_str, PSTR("%ld %%"), *result);
    break;
    case ECT:
    *result = str_cr[0] - 40;
    break;
    case FP:
    *result = str_cr[0] * 3;
    sprintf_P(result_str, PSTR("%ld kPa"), *result);
    break;
    case ERPM:
    *result = ((str_cr[0] * 256) + str_cr[1]) / 4;
    sprintf_P(result_str, PSTR("%ld RPM"), *result);
    break;
    case VS:
    *result = (str_cr[0] * 10000U) / 16090U;
    sprintf_P(result_str, PSTR("%ld MPH"), *result);
    break;
    case MAF:
    *result = ((str_cr[0] * 256) + str_cr[1]) / 100;
    sprintf_P(result_str, PSTR("%ld g/s"), *result);
    case TP:
    *result = (str_cr[0] * 100) / 255;
    sprintf_P(result_str, PSTR("%ld %%"), *result);
    break;
    case FLI:
    *result = (100 * str_cr[0]) / 255;
    sprintf_P(result_str, PSTR("%ld %%"), *result);
    break;
    case AAT:
    *result = str_cr[0] -40;
    break;
    case EOT:
    *result = str_cr[0] - 40;
    break;
    case EFR:
    *result =((str_cr[0] * 256) + str_cr[1]) * 0.05;
    sprintf_P(result_str, PSTR("%ld L/h"), *result);
    break;
  }
  return 0;
}

boolean Check_Supported_PID(byte PID)
{
  if(PID == 0)
  {
    return true;
  }
  else if(PID >= 0x21 && PID <= 0x20)
  {
    
  }
  else if(PID >= 0x21 &&PID <= 0x40)
  {
    
  }
  else if(PID >= 0x41 && PID <= 0x60)
  {
    
  }
}

//Transmits ASCII encoded HEX data to the ELM IC.
//For example 010C\r.
void STN_Transmit(char *str)
{
  SoftwareSerial.print(str);
}

//Places a command into a string to be transmitted.
byte STN_Command(char *str_cmd, char *cmd)
{ 
  strcpy_P(str_cmd, cmd);
  STN_Transmit(str_cmd);
  
  return STN_Read(str_cmd);
}

//Reads data from the ELM IC.
//For example 41 0C 7B 7B>.
byte STN_Read(char *str)
{
  byte i = 0;
  char temp;
  
  while((temp = Serial.read()) != '>')
  {
    if(temp >= ' ' && temp <= '~')
    {
      str[i++] = temp;
    }
  }
  if(i > 16)
  {
    Serial.println(i);
    Serial.flush();
    return 0;
  }
  else
  {
    str[i] = '\0';
    return 1; //No data to read or buffer full.
  }
}

//Checks the ELM response header against the transmited header.
byte STN_Response_Header_Check(char *str_tx, char *str_rx)
{
  if(str_rx[1] == str_tx[1] && str_rx[3] == str_tx[2] && str_rx[4] == str_tx[3])
  {
    return 1; //Header check is good.
  }
  else
  {
    return 0; //Header check is bad.
  }
}

//Skips the header and converts the received string to HEX.
//For example 7B 7B to 0x7B7B.
void STN_Response_Convert(byte *str_cr, char *str_rx)
{
  byte i = 0;
  
  str_rx += 6;
  while(*str_rx != '\0')
  str_cr[i++] = strtoul(str_rx, &str_rx, 16);
}

int freeRam(void)
{
  extern unsigned int __heap_start;
  extern void *__brkval;

  int free_memory;
  int stack_here;

  if (__brkval == 0)
    free_memory = (int) &stack_here - (int) &__heap_start;
  else
    free_memory = (int) &stack_here - (int) __brkval; 

  return (free_memory);
}