[Решено] Словебер и поплавок Sprintf: не работает

luca_stm32
Чт, 07 декабря 2017 г., 8:23 вечера
Привет всем.
Я пытаюсь сделать Sprintf работать в Словере с поплавком.
Я написал следующий эскиз, чтобы проверить его: #include "Arduino.h" void setup() { Serial.begin(115200); delay(5000); } void loop() { static float temp = 10000; uint8_t i; char buffer[100]; for (i=1;i<13;i++) { Serial.print("Before "); Serial.println(i); //sprintf (buffer,"Value = %f",temp); ftoa(temp, buffer); Serial.print("After "); temp=temp/3; Serial.println(buffer); } while(1); }

Рик Кимбалл
Чт, 07 декабря 2017 г., 21:39
что такое FTOA? Это не стандартное. Где ты это взял?

Почему бы не использовать функции преобразования строки: #include "Arduino.h" void setup() { Serial.begin(115200); delay(5000); } void loop() { static float temp = 10000; uint8_t i; String buffer; for (i=1;i<13;i++) { Serial.print("Before "); Serial.println(i); buffer = temp; // convert a float using the String's conversion routines Serial.print("After "); temp=temp/3; Serial.println(buffer); } while(1); }

Rogerclark
Чт, 07 декабря 2017 г., 21:49
Я думал, что были общие проблемы с Float to Cstring и т. Д., Потому что только часть полного Printf / Sprintf Lib реализована, иначе она слишком велика, чтобы соответствовать большинству маленьких MCU

Или, может быть, я думаю о проблемах, которые у меня были в AVR

Рик Кимбалл
Чт, 07 декабря 2017 г., 22:05
Ты прав, Роджер. Я посмотрел на преобразование струны, но я не смотрел на функцию dtoStrf (), которую она вызывает, что в очередь вызовов Sprintf... Извините, NM

Также это не CString, это на самом деле строка .. который является специфическим классом Arduino. В версиях AVR у них есть свой собственный код преобразования плавания, который не использует Sprintf .. он использует функцию в AVR Libc

http: // www.атмель.com/webdoc/avrlibcrefe ... 71d42.HTML

... который в конечном итоге называет:
https: // github.com/vancgroup-mirrors/a ... DTOA_PRF.в

Rogerclark
Чт, 07 декабря 2017 г., 23:41
Обычно я в конечном итоге печатаю фиксированные точные плавания, используя функцию E.глин. Возьмите целочисленную деталь, а затем затем плавуческую часть и умножьте часть поплавки на 10 на количество требуемых цифр и т. Д

Это, вероятно, быстрее для процессора, чем вызов Sprintf и т. Д. Если вы просто хотите распечатать поплавок с фиксированной точностью.

victor_pv
Чт, 07 декабря 2017 г., 23:56
Не уверен, чего вы пытаетесь достичь в конце, так как пример кода выглядит как пример чего -то не так с FTOA, а не Sprintf, но вот мои 2 цента:
1. Если вы хотите распечатать поплавок, просто используйте класс печати, он включает в себя функцию для печати поплавок: Serial.print(float, num_digits));

Пито
Пт, 08 декабря 2017 г. 12:06
Прекрасно работает под ядром Слоэбера и Роджера (Bluepill): Before 1 After Value = 10000.000000 Before 2 After Value = 3333.333252 Before 3 After Value = 1111.111084 Before 4 After Value = 370.370361 Before 5 After Value = 123.456787 Before 6 After Value = 41.152264 Before 7 After Value = 13.717422 Before 8 After Value = 4.572474 Before 9 After Value = 1.524158 Before 10 After Value = 0.508053 Before 11 After Value = 0.169351 Before 12 After Value = 0.056450

luca_stm32
Пт 08 декабря 2017 г. 6:37 утра
Код, который я протестировал, без FTOA. FTOA была функцией, которую я реализовал, чтобы попытаться заставить эскиз работать.
Код, который я использую, это то, что провел PITO, но в моем случае он не работает.

Я использую Rogers Core (Bluepill).
Если я использую Arduino IDE, Skecth работает правильно, Но при Slakeber это не работает.

@victor_pv:
2) Вы правы: статическое объявление не требуется.
3) Я немного растерялся. Как я уже говорил, код, который я использую, именно то, что проверил PITO.
4) Я обнаружил реализацию Sprintf Light, но эта реализация не поддерживает Float.

@Pito: Вы добавили несколько личных директив в Словере, которые не поставляются со стандартным распространением? Например, я заметил, что у вас есть модифицированная платформа.TXT, чтобы сделать новый () функциональный работа ViewTopic.PHP?F = 41&t = 2434&начало = 80

Лука

Пито
Пт, 08 декабря 2017 г. 8:28 утра
@Pito: Вы добавили несколько личных директив в Словере, которые не поставляются со стандартным распространением? name=STM32 Boards (STM32duino.com) version=0.1.2 compiler.warning_flags=-w -DDEBUG_LEVEL=DEBUG_NONE compiler.warning_flags.none=-w -DDEBUG_LEVEL=DEBUG_NONE compiler.warning_flags.default=-DDEBUG_LEVEL=DEBUG_NONE compiler.warning_flags.more=-Wall -DDEBUG_LEVEL=DEBUG_FAULT compiler.warning_flags.all=-Wall -Wextra -DDEBUG_LEVEL=DEBUG_ALL compiler.combine.flags=-u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid # compiler variables ..

luca_stm32
Пт 08 декабря 2017 г. 9:01
@Pito.
Привет, пито. Пожалуйста, будьте терпеливы, меня: я не очень хорош с затмением : oops: Как я могу правильно вставить эти директивы в Словебер? Я изменил платформу.TXT Under/Home/LUCA/ARDUINO/ARDWARE/ARDUINO_STM32-MASTER/STM32F1/PLARTION.TXT, перезапущенный Slaeber, очищенный проект, перестроенный проект, но я вижу дополнительные флаги в выходной консоли, и Sletch все еще не работает.
Starting combiner "/home/luca/sloeber//arduinoPlugin/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-g++" -Og -Wl,--gc-sections -mcpu=cortex-m3 "-T/home/luca/arduino/hardware/Arduino_STM32-master/STM32F1/variants/generic_stm32f103c/ld/jtag_c8.ld" "-Wl,-Map,/home/luca/Documenti/sloeber-workspace/Sprintf_Test/Release/Sprintf_Test.map" "-L/home/luca/arduino/hardware/Arduino_STM32-master/STM32F1/variants/generic_stm32f103c/ld" -o "/home/luca/Documenti/sloeber-workspace/Sprintf_Test/Release/Sprintf_Test.elf" "-L/home/luca/Documenti/sloeber-workspace/Sprintf_Test/Release" -lm -lgcc -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols -Wl,--start-group ./sloeber.ino.cpp.o /home/luca/Documenti/sloeber-workspace/Sprintf_Test/Release/arduino.ar -Wl,--end-group /home/luca/sloeber/arduinoPlugin/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7-m/libnosys.a(sbrk.o): In function `_sbrk': sbrk.c:(.text._sbrk+0x30): warning: undefined reference to `end' Finished building: Sprintf_Test.elf

Пито
Пт, 08 декабря 2017 12:15
Рецепт комбинации на платформе.txt (он добавляет {компилятор.комбинировать.флаги} в сборку): ## Combine gc-sections, archives, and objects recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mcpu={build.mcu} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -lm -lgcc -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols -Wl,--start-group {compiler.combine.flags} {object_files} "{build.path}/{archive_file}" -Wl,--end-group

luca_stm32
Пт, 08 декабря 2017 г., 19:25
Привет, пито.
Спасибо за предложения.
В файловой платформе.TXT, который находится под/home/luca/arduino/hardware/arduino_stm32-master/stm32f1/platform.txt я добавил: name=STM32 Boards (STM32duino.com) version=0.1.2 compiler.warning_flags=-w -DDEBUG_LEVEL=DEBUG_NONE compiler.warning_flags.none=-w -DDEBUG_LEVEL=DEBUG_NONE compiler.warning_flags.default=-DDEBUG_LEVEL=DEBUG_NONE compiler.warning_flags.more=-Wall -DDEBUG_LEVEL=DEBUG_FAULT compiler.warning_flags.all=-Wall -Wextra -DDEBUG_LEVEL=DEBUG_ALL compiler.combine.flags=-u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid

victor_pv
Пт, 08 декабря 2017 г., 8:21 вечера
В свойствах проекта измените доску на что -то другое, примените, а затем вернитесь к тому, который вы использовали. Это перезагружает все флаги с платформы.текст

Не уверен, что это перезагружает их, просто закрыв и открывая, я считаю, что это не так.

Я использую Slakeber 4.1 в Windows 10 и 4.0 В победе 8.1, оба работают нормально.

Стивестронг
Пт, 08 декабря 2017 г., 8:46 вечера
Лука, какой метод загрузки вы используете?
Я думаю, что файл линкера не правильный. Вместо jtag_c8.лд это должно быть Bootloader_20.лд.

luca_stm32
Сб 09 декабря 2017 г. 9:58 утра
@Виктор
Я следовал вашим инструкциям, и теперь добавленные директивы загружены Correclty, а эскиз работает, как и в Sloceber : D

@Стив
Я использую программист Stlink. Я думаю, что jtag_c8.LD в этом случае верен.

@Victor, Стив, Пито и Роджер
Еще раз спасибо за вашу поддержку : D

@Роджер
Возможно, добавить эти директивы на платформе.TXT по умолчанию? Я проверил этот эскиз с модифицированной платформой.TXT и Arduino IDE и Works, но я не знаю, имеют ли дополнительные директивы.
Я верю, что я не первый, кто спрашивает тебя об этом. Я также знаю, что при Arduino IDE STM32 Core работает правильно, и Core STM32 предназначен для Arduino IDE.
В противном случае, есть ли другой способ сделать его «совместимым» с Eclipse IDE?
Я пытаюсь сказать, что если кто -то хочет использовать ядро ​​STM32 из репозитория и использовать Eclipse, такие функции, как New (), Sprintf... не работает, и они не знают, почему.

Еще раз спасибо и еще раз дополняют вашу работу.

С уважением.
Лука.

Пито
Сб 09 декабря 2017 г. 10:44
Не уверен, что это перезагружает их, просто закрыв и открывая, я считаю, что это не так. В Слове, чтобы загрузить новые свойства и настройки, вам нужно идти:

Проект -> Характеристики -> Ардуино -> Применять -> ХОРОШО.

Arduino Ide 1.6.8 теперь выпущен !