Чтение строки, разделенной запятыми

У меня есть строка, которая выглядит следующим образом "10.00, 20.00, -50.00", в которой это значения угла, они имеют 2 десятичных знака и могут быть отрицательными. Я хочу разделить их на 3 отдельных float. Вот мой текущий код, в котором я использую sscanf. Все, что я получаю, - это 0,00, и я понятия не имею, почему. Любая помощь действительно ценится.

String recvString = "10.00,20.00,-50.00,";
float r,p,y;

void setup() {
  Serial.begin(9600);
  Serial.println(r);
  int result = sscanf(recvString.c_str(), "%f,%f,%f,", &r, &p ,&y);
  Serial.println(r);
}

void loop() {}

, 👍1

Обсуждение

Это не полный дубликат, но он поможет вам лучше понять проблему и причины: https://stackoverflow.com/questions/27651012/arduino-sprintf-float-not-formatting . Вы можете использовать функцию http://www.cplusplus.com/reference/cstdlib/strtod /`, @Michel Keijzers

запятая - это не пробел ...https://stackoverflow.com/questions/15091284/read-comma-separated-input-with-scanf#15091406, @jsotola


2 ответа


Лучший ответ:

0

Используйте функцию indexOf, чтобы найти индекс, затем используйте подстроку, чтобы получить следующие значения:

String recvString = "10.00,20.00,50.00";
float r, p, y;



void setup() {
  Serial.begin(9600);
  //Serial.println(r);
  //recvString.toCharArray(s, recvString.length() + 1);
  //int result = sscanf(recvString.c_str(), "%f,%f,%f,", &r, &p ,&y);
  int i1 = recvString.indexOf(',');
  int i2 = recvString.indexOf(',', i1+1);
  Serial.println(i1);
  Serial.println(i2);

  String firstValue = recvString.substring(0, i1);
  String secondValue = recvString.substring(i1 + 1, i2);
  String thirdValue = recvString.substring(i2 + 1);

  Serial.println(firstValue);
  Serial.println(secondValue);
  Serial.println(thirdValue);

}

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

}
,

определенно не таким образом, @Juraj

Но это работает, так почему бы и нет?, @DragonflyRobotics

смотрите другой ответ, @Juraj


2

Реализация AVR sscanf() не поддерживает синтаксический анализ чисел с плавающей запятой, поэтому вы получаете из нее только нули. Вы не можете использовать с ним спецификатор %f. Вам нужно самостоятельно преобразовать эти числа с помощью таких функций, как atof() или аналогичных.

Разделение строки на части может быть выполнено многими способами. Вы могли бы использовать sscanf() для разделения строковых частей, а затем использовать что-то вроде atof() для фактического преобразования в float . Или вы используете strtok() для разделения (см. Мой ответ на этот вопрос). Или вы используете один из многих других вариантов, которые вы получаете, когда ищете в Google что-то вроде "Arduino split string" или "Arduino split c string".

Примечание: Использование класса String в Arduino легко для начинающих, но не является хорошей практикой (динамическое распределение, фрагментация кучи). Посмотрите блог Majenkos для получения дополнительной информации об этом. Поскольку вы уже использовали функцию для C-строк, я бы предложил полностью перейти на C-строки (которые в основном представляют собой только массив символов).

,