0

珍惜你的时间。

我正在尝试将从 Arduino IDE 的 serialEvent() 中的串行端口读取的“字符串”转换为具有精确表示的整数值。

例如,如果 String myString = 200 那么 int myInt 应该是 200。

我已经取得了一定的成功,但无法将 String 转换为超过 255 的精确 int 表示。

我尝试过的解决方案:

1) 在 Arduino 中使用 .toInt() 函数。

2)使用“atoi”和“atol”功能。

3) 循环() 中的 Serial.parseInt()。

所有这些方法在每 255 个值之后从 0 开始重新计数。

我不能使用 parseInt,因为它只能在 loop() 中工作。我的应用程序需要永久存储变量值,直到通过端口给出另一个值。为此,使用了 Arduino Due 的闪存。

内存存储代码似乎只在 serialEvent() 中工作。

代码片段如下:

#include <stdlib.h>
#include <DueFlashStorage.h>
DueFlashStorage memory;

String x = " ";
int x_size;
int threshold;

void setup(){
  Serial.begin(115200);
}

void loop{
  Serial.println(memory.read(0));
}

void serialEvent(){

  while(Serial.available()){

    x = Serial.readStringUntil('\n');

    x_size = x.length();
    char a[x_size+1];

    x.toCharArray(a, x_size+1);

    threshold = atoi(a);

    memory.write(0, threshold);
  }
}
4

4 回答 4

0

1)函数.toInt()返回LONG并且你想要INT(我不知道为什么老实说,但它在文档中)......你需要像这样投射它(在Arduino ATMEGA上试过并且它有效):

#include <stdlib.h>

String x = "1000";
int x_ = 0;

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

}

void loop() {
  x_ = (int) x.toInt();

  Serial.println(x_);
  delay(1000);
}

2)我不是专业人士......但是serilEvent()确实是一种旧的做事方式,不建议使用它。您可以在 loop() 函数中“手动”执行此操作。

于 2019-03-30T15:17:31.443 回答
0

您一次只转换 1 个字符,这就是限制为 255 的原因。如果您不做任何其他事情,您可以留在 serial.read-loop 中,直到读取所有字符。例如:

void loop() {
  if(Serial.available()) {
    byte count = 0;
    char number[10]; // determine max size of array
    bool wait = true;
    while(wait) { // stay in this loop until newline is read
      if(Serial.available()) {
        number[count] = Serial.read();
        if (number[count] == '\n') {
          wait = false; // exit while loop
        }
        count++;
      }
    }  
    int threshold = atoi(number);
    memory.write(0, threshold);
  }
}
于 2019-03-31T10:36:02.067 回答
0

由于 Arduino IDE 中缺少用于 char/String 类型到 int 类型转换的良好功能(限制为 255),我编写了自己的转换代码,似乎可以完美运行。

int finalcount=0;


void setup(){

Serial.begin(115200);
}



void loop(){
   if(Serial.available()) {
    int count = 0;   
    char number[5];         // determine max size of array as 5

    bool wait = true;
    while(wait) {                // stay in this loop until newline is read
      if(Serial.available()) {
        number[count] = Serial.read();

        if (number[count] == '\n') {
          finalcount = count;         //max array size for integer; could be less than 5
          wait = false; // exit while loop
        }


        count++;
      }
    }  

    int val[finalcount];   //array size determined for integer
    int placeValue;         
    int finalval[finalcount];  
    int temp=0;
    int threshold;

    for(int i = 0; i<finalcount; i++){

        val[i] = (int)number[i]-48;        //convert each char to integer separately
        placeValue = pow(10,(finalcount-1)-i);  //calculate place value with a base of 10

        finalval[i] = val[i]*placeValue;      //update integers with their place value

        temp += finalval[i] ;            //add all integers 
        threshold = temp;              //resulting number stored as threshold             
    }

        Serial.println(threshold);     //prints beyond 255 successfully !


  }
}
于 2019-04-05T07:32:12.423 回答
0

我使用 Arduino 的 highByte 和 lowByte 函数解决了这个问题。完美运行。

#include <DueFlashStorage.h>
DueFlashStorage m;
byte a1,a2;
int val;

void setup() {
   
 Serial.begin(115200);           //start the serial communication
}

void loop()
{
 
 if (Serial.available()>0)
    {  

     val = Serial.parseInt();     //read the integer value from series

    if(val>0){
     a1 = highByte(val);          //get the higher order or leftmost byte
     a2 = lowByte(val);           //get the lower order or rightmost byte
    
     m.write(0,a1);              //save in arduino due flash memory address 0
     m.write(1,a2);              //save in arduino due flash memory address 1

    }
  
  int myInteger;

   myInteger = (m.read(0)*256)+m.read(1);     //convert into the true integer value
                                
   Serial.println(myInteger); 
      
 } 
于 2020-07-14T13:28:58.673 回答