Ultrasonic anemometer reading

D' - 'A' + 10 = 14)

sp. "13"

sp. "13"

It's early...

Haha, Ok. I'll try it that way.

Thanks

This worked fine! Now I'll try to shorten my XOR function and then I will post the results. Thanks for all the advice! After this I can move on with the next program to use everything I got right now.

At first I wanna thank you guys for all your help! I really learned a lot.

Here is my total program just if someone would like to know all the answers.
(Don't mind the commentary, I needed to do it that much)

Program for simulating the string the anemometer sends:

void setup()
{
Serial.begin(9600);
Serial2.begin(9600);
}

void loop()
{
  char anemometerString[] = "$IIMWV,225.0,R,000.0,N,A*38";
  Serial.println(anemometerString);
  Serial2.write (anemometerString);
  delay(500);
}

Decoding and displaying the retrieved signal:

/****************************************************************************
* Decoding the Anemometer string sent by the CV7-V sensor from LCJ capteurs *
* This string will look like '$IIMWV,225.0,R,000.0,N,A*38' for example      *
****************************************************************************/

//Include a library to use some extra functions
#include <string.h>

// Reading String
char InputChar = 0;
char AnemometerString[50];
int index = 0;

//Dividing String
char Delimiters[] = "$,*";
char *StringPart1;
char *StringPart2;
char *StringPart3;
char *StringPart4;
char *StringPart5;
char *StringPart6;
char *StringPart7;

//Checksum
char ChecksumCalc = 0;
int CharVal1 = 0;
int CharVal2 = 0;
int Checksum = 0;
char AnemometerString2[27];
int index2 = 0;

//Processing String Parts
float WindAngle = 0;
float WindSpeed = 0;
char *RelativeReference = "R";
char *True = "T";
char *Knots = "N";
char *KMH = "K";
char *MPH = "M";
char *Available = "A";
char *Alarm = "V";

// Setup the connection speed and show the monitor the Arduino is on   
void setup()
{
Serial2.begin(9600);
Serial.begin(9600);
Serial.println("Power on");
}

// Start the whole program
void loop()
{
  /*********************************************************
  * If the serial input reads something                    *
  * Write it to a char and make a string from these chars  *
  * Null terminate every char and finally the whole string *
  *********************************************************/
  
  if (Serial2.available() > 0)  
  {
    InputChar = Serial2.read();
    AnemometerString[index] = InputChar;
    index++;
    AnemometerString[index] = '\0'; 
     
    if ( InputChar == '\n')
      AnemometerString[index] = '\0';
      	

   /***********************************************************
   * If the string reached 27 chars, this is the whole string *
   * Print out this string and copy it into an other string   *
   * The second will be used for comparing later on           *
   ***********************************************************/
   
    if (index == 27)
    { 
      strcpy(AnemometerString2, AnemometerString);
      
      Serial.print("The whole string: \t");
      Serial.print(AnemometerString);
      Serial.println("\n");
    
      // Devide the string in 7 different parts
      StringPart1 = strtok(AnemometerString, Delimiters);
      StringPart2 = strtok(NULL, Delimiters);
      StringPart3 = strtok(NULL, Delimiters);
      StringPart4 = strtok(NULL, Delimiters);
      StringPart5 = strtok(NULL, Delimiters);
      StringPart6 = strtok(NULL, Delimiters);
      StringPart7 = strtok(NULL, Delimiters);
      
      
      /****************************************************
      * The last two numbers of the string are a checksum *
      * This checksum needs to be in HEX                  *
      * Convert it to an equal int value                  *
      ****************************************************/
      
       if ((StringPart7[0] >= '0') && (StringPart7[0] <= '9'))
         CharVal1 = StringPart7[0] - '0';
    
       else if ((StringPart7[0] >= 'A') && (StringPart7[0] <= 'F'))
         CharVal1 = StringPart7[0] - 'A' + 10;
         
  
       if ((StringPart7[1] >= '0') && (StringPart7[1] <= '9'))
         CharVal2 = StringPart7[1] - '0';
    
       else if ((StringPart7[1] >= 'A') && (StringPart7[1] <= 'F'))
         CharVal2 = StringPart7[1] - 'A' + 10;
         
         Checksum = CharVal1*16 + CharVal2;
         
         
       /*********************************************************************************
       * Make the check sum by adding every character of the string between '

and '*' *
      * evey time the ChecksumCalc needs to be set on 0 again before we calculate it  *
      *********/
      ChecksumCalc = 0;
     
      for (index2 = 1; index2 <=23 ; index2++)
        ChecksumCalc = ChecksumCalc ^ AnemometerString2[index2];
     
      Serial.println(StringPart1);
     
     
      /

      * If the calculated checksum is equal to the checksum in the string    *
      * And if the first part of the string is the code for anemometer sensor *
      * Everything can be written to the monitor                              *
      ***********/
     
      if (ChecksumCalc == Checksum)
      {
        if (strcmp (StringPart1, "IIMWV") == 0)
        {
          Serial.print("The start sentence is: \t");
          Serial.println(StringPart1);
         
          // Make floats from the chars that presents numbers
          WindAngle = atof(StringPart2);
          WindSpeed = atof(StringPart4);
         
         
          /

          * Print the value of the Windangle                      *
          * Say wheter it is the true value or the Relative value *
          /
         
          if (strcmp(StringPart3, RelativeReference) == 0)
          {
            Serial.print("The windangle is: \t");
            Serial.print(WindAngle);
            Serial.println(" Relative");
          }
         
          else if (strcmp(StringPart3, True) == 0)
          {
            Serial.print("The windangle is: \t");
            Serial.print(WindAngle);
            Serial.println(" true");
          }
          else
          Serial.println("Wrong windangle signal");
         
         
          /

          * Print the value of the Windspeed                      *
          * Say wheter it is in Knots, Km/h or mph                *
          /
         
          if (strcmp(StringPart5, Knots) == 0)
          {
            Serial.print("The windspeed is: \t");
            Serial.print(WindSpeed);
            Serial.println(" knots");
          }
          else if (strcmp(StringPart5, KMH) == 0)
          {
            Serial.print("The windspeed is: \t");
            Serial.print(WindSpeed);
            Serial.println(" km/h");
          }
          else if (strcmp(StringPart5, MPH) == 0)
          {
            Serial.print("The windspeed is: \t");
            Serial.print(WindSpeed);
            Serial.println(" mph");
          }
          else
          Serial.println("Wrong windspeed signal");
         
         
          /

          * Say wheter the signal is available or if there is an alarm *
          *************************************************************/
         
          if (strcmp(StringPart6, Available) == 0)
          {
            Serial.print("Total string: \t\t");
            Serial.println("Available");
          }
          else if (strcmp(StringPart6, Alarm) == 0)
          {
            Serial.print("The total string: \t\t");
            Serial.println("Alarm!");
          }
          else
          Serial.println("Wrong status!");
         
          //Print out the checksum to compare it by eye
          Serial.print("The checksum is: \t");
          Serial.print(StringPart7);
          Serial.println(" HEX");       
          Serial.println("\n");
        }// End of if function for anemometer detection
       
        // If the anemometerdevice isn't detected, print it out
        else
        Serial.println("Error, wrong input device \n");
      }// End of if function where checksum needs to be right
     
      // Put the index of you anemometer string back to 0
      index = 0;
    }// End of if function where the string needs to be 27 chars long
  }// End of if function where serial input needs to be available
}// End of void loop

    AnemometerString[index] = '\0'; 
     
    if ( InputChar == '\n')
      AnemometerString[index] = '\0';

And, if it isn't? What is in AnemoterString[index] then?

    if (index == 27)
    { 
      strcpy(AnemometerString2, AnemometerString);

Suppose a byte got lost/corrupted? Expecting a specific number of values is not a good idea.

          WindAngle = atof(StringPart2);
          WindSpeed = atof(StringPart4);

It would be a good idea to make sure that StringPart2 and StringPart4 were valid pointers, first. Ditto for all the other pointers that you assume are valid.

It will not have to be forgotten that the sonic anemometer CV7 functions at a speed transmission of 4800bds.