arduinoserial-portprecisionatofmultiple-variable-return

How to send multiple different floating point or decimal values serially to Arduino?


I am trying to send two different decimal values serially to the Arduino. The values which are sent to the Arduino are separated by a comma(,):

For e.g. 1.23,4.56

My problem is that when the values are received by the Arduino micro-controller, the code doesn't seem to output the desired result.

Both the Serial.println command seen in the code below outputs the following for the variables value_1 and value_2:

1.20

0.00

4.50

0.00

So what I don't understand is why is there an additional '0.00' value in both variables.

Thanks in advance.

const int MaxChars = 3; // an int string contains up to 3 digits (3 s.f.) and
                        // is terminated by a 0 to indicate end of string
char strValue_1[MaxChars+1]; // must be big enough for digits and terminating null
char strValue_2[MaxChars+1]; // must be big enough for digits and terminating null
 int index_1 = 0;         // the index into the array storing the received digits
 int index_2 = 0;         // the index into the array storing the received digits
 double value_1;
 double value_2;

 void setup()
 { 
   Serial.begin(9600); // Initialize serial port to send and receive at 9600 baud
 }

 void loop()
{
 if(Serial.available())
 {
char ch = Serial.read();
if(index_1 <  MaxChars && ch >= '.' && ch <= '9')
{
  strValue_1[index_1++] = ch; // add the ASCII character to the array;

}
else if (ch == ',')
{ 
    if(index_2 <  MaxChars && ch >= '.' && ch <= '9')
    {
      strValue_2[index_2++] = ch; // add the ASCII character to the array;
    }
}
else
{
  // here when buffer full or on the first non digit
  strValue_1[index_1] = 0;        // terminate the string with a 0
  strValue_2[index_2] = 0;        // terminate the string with a 0
  value_1 = atof(strValue_1);     // use atof to convert the string to an float
  value_2 = atof(strValue_2);     // use atof to convert the string to an float
  Serial.println(value_1);  
  Serial.println(value_2);  
  index_1 = 0;
  index_2 = 0;
}
}
}

Below is the most recent edited version of the code as suggested by @mactro and @aksonlyaks, I'm still unable to obtain the desired outputs;hence I'm open to more suggestions.

As of current the output I receive for the specific input of 1.23,4.56 for the following variables are:

strValue[0]:

1.2

strValue[1]:

1.2

4.5

value_1:

1.20

0.00

value_2:

1.20

4.50

Thanks in Advance.

Here is the Most Recent Version of the Code:

const int MaxChars = 4; // an int string contains up to 3 digits (3 s.f.) including the '\0' and
                    // is terminated by a 0 to indicate end of string

const int numberOfFields = 2;  //Amount of Data to be stored
char strValue[numberOfFields][MaxChars+1]; // must be big enough for digits and terminating null

int index_1 = 0;         // the index into the array storing the received digits

double value_1;
double value_2;

int arrayVal = 0;

void setup()
{ 
  Serial.begin(9600); // Initialize serial port to send and receive at 9600 baud
}

void loop()
{

 if(Serial.available())
{
    char ch = Serial.read();

if (ch == ',')
{ 
    arrayVal = 1;

    if(index_1 <  MaxChars-1 && ch >= '.' && ch <= '9')
    {
      strValue[arrayVal][index_1++] = ch; // add the ASCII character to the array;
    }
    if(index_1 == MaxChars - 1)
    {
      strValue[arrayVal][index_1++] = '\0';
    }

 }
 else if(index_1 <  MaxChars-1 && ch >= '.' && ch <= '9')
 {
   strValue[arrayVal][index_1++] = ch; // add the ASCII character to the array;

 if(index_1 == MaxChars - 1)
 {
    strValue[arrayVal][index_1++] = '\0';
 }

 }

 else
 {

  value_1 = atof(strValue[0]);     // use atof to convert the string to an float
  value_2 = atof(strValue[1]);     // use atof to convert the string to an float
  Serial.println(value_1);  
  Serial.println(value_2);  
  index_1 = 0;
  arrayVal = 0;
}
}
}

Solution

  • I did some modification to your code and now it's printing what you desire. The modified code is as follows:

    const int MaxChars = 4; // an int string contains up to 3 digits (3 s.f.) including the '\0' and
                        // is terminated by a 0 to indicate end of string
    
    const int numberOfFields = 2;  //Amount of Data to be stored
    char strValue[numberOfFields][MaxChars+1]; // must be big enough for digits and terminating null
    
    int index_1 = 0;         // the index into the array storing the received digits
    
    double value_1;
    double value_2;
    
    int arrayVal = 0;
    
    void setup()
    { 
      Serial.begin(9600); // Initialize serial port to send and receive at 9600 baud
    }
    
    void loop()
    {
    
        if(Serial.available())
        {
            char ch = Serial.read();
    
            if (ch == ',')
            { 
                arrayVal = 1;
                index_1 = 0;    // Initialise this to zero for the float value received after ','
    /*
                if(index_1 <  MaxChars-1 && ch >= '.' && ch <= '9')
                {
                  strValue[arrayVal][index_1++] = ch; // add the ASCII character to the array;
                }
                if(index_1 == MaxChars - 1)
                {
                  strValue[arrayVal][index_1++] = '\0';
                }
    */
             }
             else if( (index_1 <  MaxChars + 1) && (ch >= '.' && ch <= '9'))  // one float value size including null character is 5 (1.23 size 4)
             {
                strValue[arrayVal][index_1++] = ch; // add the ASCII character to the array;
                if(index_1 == MaxChars)             // When we have recevied the 4 character of float value add NULL character
                {
                    strValue[arrayVal][index_1++] = '\0';
                }
             }else
             {
                value_1 = atof(strValue[0]);     // use atof to convert the string to an float
                value_2 = atof(strValue[1]);     // use atof to convert the string to an float
                Serial.println(value_1);  
                Serial.println(value_2);  
                index_1 = 0;
                arrayVal = 0;
             }
        }
    }
    

    Also, I did proper indentation for your code.

    Let me know if this helps.

    Regards