Фильтровать данные из Serial

Allkonafft
Offline
Зарегистрирован: 17.06.2016

Всем привет! Прошу о помощи. Например в Serial пришло сообщение t = 30 C и градусы меняются со временем. Может ли кто нибудь подсказать, как мне записывать в переменную не всю строку, а только цифры (ну например здесь 30 в примере), которые будут менятся с изменением температуры. Спасибо!

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
String.toInt()

 

Allkonafft
Offline
Зарегистрирован: 17.06.2016
String val = "";
int ch = 0;
String val_1 = "";
int ch_1 = 0;
String val_2 = "";
int ch_2 = 0;

void setup() 
{
  Serial.begin(9600);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  /*pinMode(3, INPUT);
  digitalWrite(3, HIGH);*/
}

void loop() 
{

if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
}

if (val.indexOf ("temp") > -1) {
  Serial.println(val);
  val = "";
  val_1 = "";
  val_2 = "";
  while(1){
    if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val_1
      ch_1 = Serial.read();
      val_1 += char(ch_1);
      delay(10);
    }
}
Serial.println(val_1);
delay(500);
if (val_1.indexOf("") > -1){
   while(1){
    if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val_2
      ch_2 = Serial.read();
      val_2 += char(ch_2);
      delay(10);
    }
}
Serial.println(val_2);
delay(500);
if (val_2.indexOf("") > -1){
  break;
}
}
break;
  }
}
}

val_1.toInt();
val_2.toInt();

  Serial.println(val);
  Serial.println(val_1);
  Serial.println(val_2);
  delay(1000);
  val = "";
}

Привет! Спасибо за ответ, но если пишу в Serial t = 30 C что-то нолики только записываются в переменную, если одни цифры ввожу, то цифры записываются.

okta
Offline
Зарегистрирован: 10.01.2015

Со строки 30 все можно удалять, ибо зачем там бесконечные циклы и поиск пустой строки я даже спрашивать не хочу.

В простейшем случае можно сделать так:

val="";
if (Serial.available()) {//если в мониторе порта ввели что-то 
  while (Serial.available()) {//сохраняем строку в переменную val 
    ch = Serial.read(); 
    if(isDigit(ch)) val += (char)ch; 
    delay(10);
  } 
}
if(val.length()>0) ch=val.toInt();

 

Allkonafft
Offline
Зарегистрирован: 17.06.2016

Привет! Спасибо за ответ все получилось. Это кусок примера программы, просто сначало приходит одна команда чтобы цикл While включился, потом сразу вторая и третья, затем выходим из цикла, и поиска пустых строк там не будет.

okta
Offline
Зарегистрирован: 10.01.2015

Allkonafft пишет:

Это кусок примера программы, просто сначало приходит одна команда чтобы цикл While включился, потом сразу вторая и третья

А если будет 100500 команд приходить, вы последовательно 100500 циклов  их чтения напишете?

Allkonafft пишет:

затем выходим из цикла

из этого?

while(1){

 

Allkonafft
Offline
Зарегистрирован: 17.06.2016

Ну чтож придется написать...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

okta пишет:

я даже спрашивать не хочу.

Вы мудрый человек! И не надо - мозг целее будет :)