sscanf не работает float

Blok
Offline
Зарегистрирован: 06.05.2018

Вот уже целый день бьюсь с функцией sscanf пытаясь прочитать значение с плав.точкой.

В результате выполнения приаттаченого кода в терминале получаю 0.00, 

Что я делаю не так?

char buf[]="gprmc,5.25";
float x;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
  while (!Serial) {}

}

void loop() {
  // put your main code here, to run repeatedly:
sscanf(buf,"gprmc,%f",&x);
Serial.println(x);
while(1);
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

А каким спецификаторам формата соответствует строка gprmc?

5N62V
Offline
Зарегистрирован: 25.02.2016

На ардуино форматированный вывод float не работает. Логично предположить, что и ввод тоже не работает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

5N62V пишет:

На ардуино форматированный вывод float не работает. Логично предположить, что и ввод тоже не работает.

Ну зачем же так категорично?

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  float f = sqrt(2.0);
  Serial.print("float: ");
  Serial.println(f);
  double d = sqrt(2.0);
  Serial.print("double: ");
  Serial.println(d);
  char buf[32];
  sprintf(buf, "float: %f", f); 
  Serial.println(buf);
  sprintf(buf, "double: %f", d); 
  Serial.println(buf);
  
}

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

}

Вывод:

float: 1.41
double: 1.41
float: 1.414214
double: 1.414214

 

sva_khv
Offline
Зарегистрирован: 19.12.2016

andriano пишет:

Ну зачем же так категорично?

:-)

не работает в функции sprintf.

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

andriano, это нечестно :(

sadman41
Offline
Зарегистрирован: 19.10.2016

На IDE 1.8.5:

float: 1.41
double: 1.41
float: ?
double: ?

 

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

nik182 пишет:

А каким спецификаторам формата соответствует строка gprmc?

Она соответствует сама себе - она есть в формате.

nik182
Offline
Зарегистрирован: 04.05.2015

Я не оченьхорошо знаком с sscanf. Подскажите как это работает? Нужно вводить именно эти символы? %[gprmc,] - может быть надо как то так? И вопрос к ТС - что возвращает sscanf? В спецификации написано, что 0 это индикация ошибки преобразования. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Давайте начнем издалека.

Во-первых, Arduino != AVR.

Значит, раз на одних контроллерах Ардуино работает, а на других - нет, надо искать, в чем различие.

А различие в том, что на AVR используется нестандартный 4-байтовый double. А по стандарту С/С++ все промежуточные вычисления производятся именно в double. Поэтому стандартные функции С/С++, которые хотят видеть стандартный double, а вместо этого получают float, офигевают от такой наглости и отказываются работать.

Таким образом, высказывание 5N62V необходимо откорректировать:

На AVR форматированный вывод float не работает. 

Как заставить работать - вопрос отдельный, но главное - понимать причину того, что происходит.

Blok
Offline
Зарегистрирован: 06.05.2018

Спасибо за разяснение, я знал что double с подвыподвертом на arduino, но не подумал что изза этого так косячит стандартная сишная функция.
Интересно как можно заставить ее работать правильно?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вводить число как строку, а потом использовать strtod()