Форматный вывод через printf

Sidor89
Offline
Зарегистрирован: 22.05.2017

В ардуино не смог  вывести через printf() число в двоичном формате,  пробовал как %b и %B . В форматах %d  и %X  работает. 

#include <SPI.h>
#include "printf.h"
void setup(void)
{
  int i;
  Serial.begin(115200);
  printf_begin();
  for (i=-16;i<=16; i++)
  {
  printf("  dec i="); printf("%3d",i);
  printf("  bin i="); printf("%17b",i); 
  printf("  hex i="); printf("%4X",i);
  printf("\n\r");
  }
}
void loop(void){}

И попутно - почему printf() не компилируется без библиотеки SPI.H, зачем она нужна последовательному порту  ?

 

Sidor89
Offline
Зарегистрирован: 22.05.2017

%b вроде как разрешенный формат: http://www.softtime.ru/bookphp/gl3_6.php

 

 

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
//#include <SPI.h>
//#include "printf.h"
void setup(void)
{
  int i;
  Serial.begin(115200);
//  printf_begin();
  for (i=-16;i<=16; i++)
  {
  printf("  dec i="); printf("%3d",i);
  printf("  bin i="); printf("%17b",i); 
  printf("  hex i="); printf("%4X",i);
  printf("\n\r");
  }
}
void loop(void){}

остальные ответы в комментах в файле stdio.h

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

Sidor89 пишет:

В ардуино не смог  вывести через printf() число в двоичном формате,  пробовал как %b и %B . В форматах %d  и %X  работает. 

И не должно. См. описание AVR-LIBC.

Sidor89 пишет:

И попутно - почему printf() не компилируется без библиотеки SPI.H, зачем она нужна последовательному порту  ?

Я не знаю, что у Вас там за библиотека. Наверняка использует какую-то константу из SPI.h, но разбираться не хочу.

Возьмите нормальную реализацию и "забудьте о перхоти".

//	Эти три строки пишем в начале файла
#include <stdio.h>
static int serial_fputchar(const char ch, FILE *stream) { Serial.write(ch); return ch; }
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);

void setup(void) { 
	stdout = serial_stream; // эта строка первая в setup
	//
	// А ТЕПЕРЬ ТУПО ПОЛЬЗУЕМСЯ printf
	//
	Serial.begin(115200);
	int a = 28;
	// Печатаем a в разных видах
	printf("a=%d, a=%03d, a=%04d, a=%05d, a=%06d\n", a, a, a, a, a);
	// Тоже самое в hex
	printf("a=%d, a=%03x, a=%04x, a=%05x, a=%06x\n", a, a, a, a, a);
	// Тоже самое в HEX
	printf("a=%d, a=%03X, a=%04X, a=%05X, a=%06X\n", a, a, a, a, a);
}

void loop(void){}

Если хотите, засуньте это в отдельный файл - будет "библиотека".

Sidor89 пишет:

%b вроде как разрешенный формат: http://www.softtime.ru/bookphp/gl3_6.php

А причём тут php? Правильную ссылку на описание "местной" библиотеки я Вам дал выше.

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

Да, кстати, так никто не пишет

printf("  dec i="); printf("%3d",i);

Это же printf, а не, прости Господи, Serial.print. Здесь пишут так:

printf("  dec i=%3d",i);

 

Sidor89
Offline
Зарегистрирован: 22.05.2017

ЕвгенийП пишет:
Да, кстати, так никто не пишет

printf("  dec i="); printf("%3d",i);

Это же printf, а не, прости Господи, Serial.print. Здесь пишут так:

printf("  dec i=%3d",i);

Serial.print ограничивает и  отбивает у меня привычку форматного вывода

Sidor89
Offline
Зарегистрирован: 22.05.2017

Цитата:
static int serial_fputchar(const char ch, FILE *stream) { Serial.write(ch); return ch; }
что означает static применительно к функции, а не переменной?

Цитата:
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);
А это одновременно объявление указателя serial_stream и исполнение функции? Пока непонятная для меня конструкция.

Sidor89
Offline
Зарегистрирован: 22.05.2017

ЕвгенийП пишет:
Возьмите нормальную реализацию и "забудьте о перхоти".
Бинарный формат вывода очень нужен, что делать ?

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

Sidor89 пишет:

что означает static применительно к функции, а не переменной?

То, что она не видна из других файлов.

Sidor89 пишет:

А это одновременно объявление указателя serial_stream и исполнение функции? Пока непонятная для меня конструкция.

Объявление переменной и инициализация. Точно также, как 

int i = 0;

 

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

Sidor89 пишет:

Бинарный формат вывода очень нужен, что делать ?

Самому написать через операцию сдвига и наложения маски.

Вам какие числа надо выводить? byte, int или long? Берётся буфер соответсвенно 9, 17 или 33 байта и заполняется остатками от деления на 2 справа налево. Потом как строка епчатается.

Logik
Offline
Зарегистрирован: 05.08.2014

Sidor89 пишет:

ЕвгенийП пишет:
Возьмите нормальную реализацию и "забудьте о перхоти".
Бинарный формат вывода очень нужен, что делать ?

Делать так.

  byte b=0x55;
  char r[20]; 
  itoa(b, r, 2); 
  Serial.println(r);

Троичный, четверичный и прочие шестеричные форматы так же.

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

Ну, если лидирующие нули не нужны, то можно и как Logic советует.