converting serial.read to double

Hello,

I have written a program in Visual Basic that sends float (double) Numbers to the Arduino using the serial interface.

Is there a easy to do solution to convert the received data into double numbers, which I may save in global variables to do calculations with them later on?

The string which my visual basic application sends is formated that way:
d{0,0125}s{45,56987}r{1015,45}...

BR,

Andreas

Arduino doesn't have true double, double is an alias for float.

Store the data in an array of chars and use atof() to convert it to a float.

Just out of interest, does atof cope with commas as decimal points?

AWOL:
Just out of interest, does atof cope with commas as decimal points?

Nope. They'll have to send it using decimals instead, replace the commas with decimals as they come in, or edit the atof() source.

Hello,

if I use the following code to convert a string to double it works:

double test = 0;
test = atof("3,1456");
Serial.print(test * 2);

This is the function, which shall do the conversion:

// Seriellen Input in Double umwandeln
double MyConvertSerialInputIntoDouble(char tempEndCharacter) {

// Variable beinhaltet das über die serielle Schnittstelle empfangene Zeichen.
char tempReceivedCharacter = '#';

// Der String welcher die Empfangenen Zeichen beinhaltet.
String tempCharacterString = "";

// Die ermittelte Gleitkommazahl.
double tempDoubleNumber = 0;

// Die Schleife erst Verlassen, wenn das End-Zeichen empfangen wurde.
while(true) {

// Wenn ein neues Zeichen empfangen wurde.
if (Serial.available() > 0) {

// Zeichen auf der seriellen Schnitstelle empfangen.
tempReceivedCharacter = Serial.read();

// Schleife beenden, wenn das Zeichen zum Beenden empfangen wurde.
if (tempReceivedCharacter == tempEndCharacter) {

// Schleife beenden.
break;
}

// Das Coma zu einem Punkt umwandeln.
if (tempReceivedCharacter == ',') {

// Umwandlung.
tempReceivedCharacter = '.';
}

// Den empfangenen String mit den schon bestehenden Zeichen verbinden.
tempCharacterString.concat(tempReceivedCharacter);
}

delay(1);
}

double test = 0;
test = atof(tempCharacterString);
Serial.print(test);
}

But I get this error message:

PLASMA_CUTTER_RECEIVING_DATA.ino: In function 'double MyConvertSerialInputIntoDouble(char)':
PLASMA_CUTTER_RECEIVING_DATA:90: error: cannot convert 'String' to 'const char*' for argument '1' to 'double atof(const char*)'

Andreas1984:
PLASMA_CUTTER_RECEIVING_DATA.ino: In function 'double MyConvertSerialInputIntoDouble(char)':
PLASMA_CUTTER_RECEIVING_DATA:90: error: cannot convert 'String' to 'const char*' for argument '1' to 'double atof(const char*)'

That seems pretty straight forward to me. atof() expects a const char* argument, and you're trying to send it a String object. Choose String objects or c-style strings, and stick with it. More information on the differences:

Finally I got it working:

here is the solution...

// Seriellen Input in Double umwandeln
double MyConvertSerialInputIntoDouble(char tempEndCharacter) {

// Variable beinhaltet das über die serielle Schnittstelle empfangene Zeichen.
char tempReceivedCharacter = '#';

// Variable zur Umwandlung des Strings in char.
char tempCharArray[10] = "";

// Der String welcher die Empfangenen Zeichen beinhaltet.
String tempCharacterString = "";

// Die ermittelte Gleitkommazahl.
double tempDoubleNumber = 0;

// Die Schleife erst Verlassen, wenn das End-Zeichen empfangen wurde.
while(true) {

// Wenn ein neues Zeichen empfangen wurde.
if (Serial.available() > 0) {

// Zeichen auf der seriellen Schnitstelle empfangen.
tempReceivedCharacter = Serial.read();

// Schleife beenden, wenn das Zeichen zum Beenden empfangen wurde.
if (tempReceivedCharacter == tempEndCharacter) {

// Schleife beenden.
break;
}

// Das Coma zu einem Punkt umwandeln.
if (tempReceivedCharacter == ',') {

// Umwandlung.
tempReceivedCharacter = '.';
}

// Den empfangenen String mit den schon bestehenden Zeichen verbinden.
tempCharacterString.concat(tempReceivedCharacter);
}

// Verzögerung einbauen.
delay(1);
}

// Umwandlung des Strings in ein char Array.
tempCharacterString.toCharArray(tempCharArray, 10);

// Umwandlung des char Arrays in eine double Zahl.
tempDoubleNumber = atof(tempCharArray);

// Die Zahl double Zahl zurückgeben.
return tempDoubleNumber;
}

Why use a String and a string?
Just build a string, and forget you ever heard about the String class.