0

我正在尝试将两个不同的十进制值串行发送到 Arduino。发送到 Arduino 的值用逗号 (,) 分隔:

例如 1.23,4.56

我的问题是,当 Arduino 微控制器接收到值时,代码似乎没有输出所需的结果。

下面代码中的 Serial.println 命令都为变量 value_1 和 value_2 输出以下内容:

1.20

0.00

4.50

0.00

所以我不明白为什么两个变量中都有一个额外的“0.00”值。

提前致谢。

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;
}
}
}

以下是@mactro 和@aksonlyaks 建议的代码的最新编辑版本,我仍然无法获得所需的输出;因此我愿意接受更多建议。

截至目前,我收到的针对以下变量的特定输入 1.23、4.56 的输出是:

字符串值[0]:

1.2

字符串值[1]:

1.2

4.5

值_1:

1.20

0.00

价值_2:

1.20

4.50

提前致谢。

这是代码的最新版本:

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;
}
}
}
4

2 回答 2

0

你永远不会添加任何东西strValue_2,因为

if(index_2 <  MaxChars && ch >= '.' && ch <= '9')
{
  strValue_2[index_2++] = ch; // add the ASCII character to the array;
}

仅在 时执行ch==','。当您收到逗号时,您应该设置一个标志,该标志将发出一个代码来写入更多字符strValue_2而不是strValue_1. 或者你可以有一个字符串数组,比如char strValues[2][MaxChars+1]你写入的元素的变化和索引strValues[stringNumber][index++]

于 2016-10-19T10:49:50.053 回答
0

我对您的代码进行了一些修改,现在它正在打印您想要的内容。修改后的代码如下:

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;
         }
    }
}

另外,我为您的代码做了适当的缩进。

让我知道这是否有帮助。

问候

于 2016-10-25T11:06:31.127 回答