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