форматирование символьных строк
- Войдите на сайт для отправки комментариев
Пнд, 12/03/2018 - 03:14
... uint32_t i = 0; double s = 1.2345; char msg[ 40 ]; sprintf( msg, "%d => %8.2f", i, s ); Serial.println( msg ); ...
В итоге получим вывод:
1000 => ?
Т.е. sprintf() функция есть, форматы %d, %s и т.д. - успешно работают. А формат %f/%e - нет. Почему? Хотя в описании форматов для printf() из avr-libc эти форматы (%f/%e) есть. Как можно форматировать строки?
При копировании фрагмента допустил ошибку, должно быть, естественно (для правильного понимания вопроса):
Причём вот так вывод вещественного значения (с приведением к строке, форматированием) нормально проходит:
И результатом будет 1.23 - с заказанным числом знаков после десятичной точки. Т.е. форматировать оно кое-как умеет...
sprintf искаропки не поддерживает форматный вывод с плавающей точкой. Используй dtostrf() или dtostre().
sprintf искаропки не поддерживает форматный вывод с плавающей точкой. Используй dtostrf() или dtostre().
Спасибо ... только пока не совсем понятен прототип (формат) их вызова.
sprintf искаропки не поддерживает форматный вывод с плавающей точкой.
Зато очень удобно для форматирования всех других типов. Чтобы не плодить последовательность N+1 вызовов Serial.print(). Как-то так:
И в итоге:
dtostrf() или dtostre().
не совсем понятен прототип (формат) их вызова.
Документация по AvrLibC на сайте производителя контроллеров AVR. RTFM.
Зато очень удобно ... Как-то так:
Если printf Вам нужен только для вывода в поток (как в Вашем примере), то ещё удобнее делать это (выводить в поток) сразу, без запроса буфера. Например,
В принципе, можно там же (вместо NULL в строке 4) и scanf назначить. Можете попробовать, отлично работает.
Документация по AvrLibC на сайте производителя контроллеров AVR. RTFM.
Это именно я и смотрел ... но там много и не совсем понятно с параметрами... да и с возвращаемым значением.
Разобрался:
В итоге:
Если printf Вам нужен только для вывода в поток (как в Вашем примере), то ещё удобнее делать это (выводить в поток) сразу, без запроса буфера. Например,
Любопытно.
Спасибо.
Кстати, это приём (назначение потока) будет работать с любым потоком - например, SoftSerial и большинство библиотек для LCD и OLED (Adafruit очень любит свои библиотеки для экранов от Stream наследовать).