Преобразуйте «String» выше 255 для точного типа «Integer» или «Long» в Arduino IDE - PullRequest
0 голосов
/ 30 марта 2019

Цените ваше время.

Я пытаюсь преобразовать чтение "String" из последовательного порта в serialEvent () Arduino IDE в целочисленные значения с точным представлением.

Например, если String myString = 200, тогда int myInt должен быть 200.

Я был несколько успешным, но не смог преобразовать String в точное представление int после 255.

Решения, которые я пробовал:

1) использовала функцию .toInt () в Arduino.

2) используются функции "atoi" и "atol".

3) Serial.parseInt () в цикле ().

Все эти методы начинают пересчет с 0 после каждых 255 значений.

Я не могу использовать 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);
  }
}

Ответы [ 3 ]

0 голосов
/ 31 марта 2019

Вы конвертируете только 1 символ за раз, поэтому ограничение составляет 255. Если вы больше ничего не делаете, вы можете оставаться в цикле serial.read, пока все символы не будут прочитаны. Например:

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);
  }
}
0 голосов
/ 05 апреля 2019

В связи с отсутствием хорошей функции в 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 !


  }
}
0 голосов
/ 30 марта 2019

1) Функция .toInt () возвращает LONG, и вы хотите INT (я не знаю почему, если честно, но это в документации ) ... вам нужно привести его так (пробовал на ArduinoATMEGA и это сработало):

#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 ().

...