Распечатайте число с плавающей запятой, используя printf() на консоли ARM Cortex M0 uart

Я настроил UART Atmel ARM Cortex M0 для печати строк и целых чисел на консоли, используя стандартную функцию C printf() в Atmel studio 7.

Случай I

Я пытаюсь сделать тип функции printf() для печати значений с плавающей запятой, и для этого я выполнил следующие предложения:

arm-none-eabi-gcc : Печать числа с плавающей запятой с использованием printf< /а>

а позже я редактировал/добавлял флаги компоновщика, следующие за текстами отдельно в разное время:

-lc -u _printf_float
-lc -lrdimon -u _printf_float 

Случай 2

Хотя я не мог понять всего, что они говорили, но я также последовал некоторым предложениям по редактированию make-файла с этого форума.

Printf/Sprintf для переменных с плавающей запятой не работает

и добавил следующий текст внутри make-файла

ldflags-gnu-y += -lc -u _printf_float 

Путь к Makefile (Atmel Studio 7, использование ASF): ../src/ASF/sam0/utils/make/Makefile.sam.in

Теперь в main.c я использовал printf() для печати числа с плавающей запятой как:

float a = 345.65412;
char buffr[20];         
/* --- Print Float using printf only --- */
printf("Float Number 1 : %f\r\n", a);   
/* --- Print Float using sprintf ---*/
sprintf(buffr, "Float Number ( Using Sprintf) : %3.3f\r\n", a); 
printf(buffr);

Вывод в консольном приложении UART:

Случай I:

Float Number 1 : 2.000000
Float Number ( Using Sprintf) : -0.000

Случай II:

Float Number 1 : 
Float Number ( Using Sprintf) :

Кто-нибудь знает, как настроить компоновщик, чтобы заставить printf(), sprintf() или vprintf() работать для печати числа с плавающей запятой на консоли для ARM Cortex M0 (SAM B 11) в Atmel Studio 7?


person mrUnfused    schedule 12.05.2016    source источник
comment
Я перешел по некоторым другим ссылкам, которые не смог включить в вопрос: Printf с поддержкой плавающей запятой в armgcc Использование поплавков с sprintf, gcc-arm-none-eabi, nRF51822   -  person mrUnfused    schedule 12.05.2016


Ответы (1)


Ваш буфер слишком мал для ваших данных

char buffr[20];

должно быть не менее (учитывая 0.0 в качестве вывода формата)

char buffr[38];

Небольшой буфер вызывает «запись за пределы» массива. Это означает, что у вас есть неопределенное поведение и переменная a загрязнена.

sprintf отличается от printf. Он копирует все символы в выходной буфер, и вы должны предоставить место для текста и для всех символов, которые будут добавлены спецификаторами формата.

В вашем конкретном случае:

  • Float Number ( Using Sprintf) : --> занимает 32 символа
  • %3.3f --> занимает 7 символов из-за реального вывода 345.654
  • \r\n --> занимает 2 символа
  • последний байт необходим для нулевого терминатора '\0'

Это меню вашего буфера должно быть:

char buffr[42];
person LPs    schedule 12.05.2016
comment
Увеличил размер массива, но проблема не решена? Если требовалось не менее 37 байтов пространства, как эти строки печатались на консоли (как в случае I и II)? - person mrUnfused; 12.05.2016
comment
В вашем конкретном случае вам нужно char buffr[42];, как я описал. Кстати, с вами происходит (как я уже писал) неопределенное поведение, что означает, что вывод не определен. - person LPs; 12.05.2016