как с помощью класса String разбить строку на 3 строки

Aleksan007
Offline
Зарегистрирован: 10.05.2013

Всем привет!

Допустим имеется строка: "115 200 120"
как ее разбить на 
a=115
b=200
c=120

можно конечно с помощью СабСтринг, вот так:

a=строка.substring(0,3);
b=строка.substring(3,7);
c=строка.substring(7,11);

но если у нас будет другая строка: 10 0 125, то получится херня...
 

Snubist
Offline
Зарегистрирован: 18.02.2013

преобразуй в char[] и разбей

Snubist
Offline
Зарегистрирован: 18.02.2013

#include <string.h>

String Str="10 0 125";
char buffer[11];
int s1, s2, s3;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly: 
  Str.toCharArray(buffer,11);
  s1=atoi(strtok(buffer," "));
  s2=atoi(strtok(NULL," "));
  s3=atoi(strtok(NULL," "));
  Serial.println(s1);
  Serial.println(s2);
  Serial.println(s3);
  delay(5000);
}

 

Navatar
Offline
Зарегистрирован: 23.11.2017

Хороший способ. У меня между значениями много пробелов и поэтому выводит только первое значение, остальные не выводит. Не подскажете как можно решить проблему?

Я задал вопрос тут, можете ответить и получить бал )

https://ru.stackoverflow.com/questions/770348/arduino-%D0%B8%D0%B7%D0%B2...

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Если именно стринг то можно так
trim
IndexOf
remove

И далее в цикле пока есть что парсить.

Logik
Offline
Зарегистрирован: 05.08.2014

А если без херни лоховской то

 

  byte i=0;
  byte j=0;
  for(;buffer[i];)
  {
   if(buffer[i]==' ')
   {
    if(i>j)
    {
      buffer[i]=0;
      Serial.println(buffer+j);
      buffer[i]=' ';
    }
    j=i+1;
   }
   i++;
  }
  Serial.println(buffer+j);

Разбивает по пробелам хоть сто штук, одним проходом без копирования и буферирования. Если надо числа - вместо вывода в сириал надо  atoi как выше было писано

Navatar
Offline
Зарегистрирован: 23.11.2017

У меня не получается разобрать строку, remove удаляю пробелы, а данные только заносятся в s1

void loop() {


void loop() {
  // put your main code here, to run repeatedly:

  while (Serial1.available()) {
    delay(3);  //delay to allow buffer to fill
    if (Serial1.available() > 0) {
      c = Serial1.read();  //gets one byte from serial buffer
      readString += c; //makes the string readString
    }
  }


          readString.getBytes(buffer, 100);
          s1 = atoi(strtok(buffer, " "));
          s2 = atoi(strtok(NULL, " "));
          s3 = atoi(strtok(NULL, " "));
          Serial.print(s1);
          Serial.print(" ");
          Serial.print(s2);
          Serial.print(" ");
          Serial.print(s3);
          Serial.println();

readString = "";

}
 
мне нужно переводить в int, т.к нужно передать данные на 3 servo. Не хватает опыта, 3-й день не могу решить проблему.
Navatar
Offline
Зарегистрирован: 23.11.2017

Проблему решил с помощью remove(). Мне нужно было первое и третье показание оси "x" и "z", ось "y" не настраивал.

char c;
String x, y, z;
String readString;
String readString2;
String readString3;

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

void loop() {
    while (Serial1.available()) {
        delay(3);  //delay to allow buffer to fill
        if (Serial1.available() > 0) {
            c = Serial1.read();  //gets one byte from serial buffer
            readString += c; //makes the string readString
            readString2 += c; //makes the string readString
            readString3 += c; //makes the string readString
        }
    }

    Serial.println(readString);

    readString.remove(3);
    x = readString;
    Serial.print("x= ");
    Serial.println(x);

     /* readString2.remove(0,7);
      y = readString2;
      Serial.print("y= ");
      Serial.println(y);*/

    readString3.remove(0,13);
    z = readString3;
    Serial.print("z= ");
    Serial.println(z);

    delay(400);
    readString = "";
    readString2 = "";
    readString3 = "";
}