printf в Print

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

Новичкам, задолбавшимся печатать бесконечные Serial.print() да Serial.println() c каждой переменной, которую они хочут вывести, могу посоветовать открыть файл Print.h и в описание класса в конец вставить вот это 

	size_t printf(const char *format, ...) {
		const uint8_t MAX_STRING_SIZE = 64;		
		char buf[MAX_STRING_SIZE];

		va_list args;
		va_start(args, format);
		vsnprintf(buf, MAX_STRING_SIZE, format, args);
		va_end(args);
		return print(buf);
	}

и тогда все свои переменные можно писать в одну строчку со всеми плюшками стандартной функции printf()

Описание форматов можно почитать у DIHALT:  http://we.easyelectronics.ru/Soft/formatnyy-vyvod-na-si-dlya-mikrokontrollerov.html

Теперь лехко можно писать 

	const uint8_t ARRAY_SIZE = 100;

	int Array[ARRAY_SIZE];
	for (uint8_t i = 0; i < ARRAY_SIZE; i++) Array[i] = 10*i;

	const char *Prompt = "Line";

	for (uint8_t i = 0; i < ARRAY_SIZE; i++) {
		Serial.printf("%s%-3d: Array[%d] = \t%d\n", Prompt, i + 1, i, Array[i]);
	}

Если возникнут затруднения со вставкой, пишите, я покажу куда. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Дед, ну в первых в h, по взрослому, надо тока описание воткнуть, а код в cpp

и во вторых, этож все до первого обновления/переустановки.

а так да КЛАСС!

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

Для классов в .h файле допустима и реализация.  Например, шаблонные классы по другому и не сделаешь. 

Ну, а при переустановке 5 строк сохранить, наерна, не проблема. А можно просто принцип понять и сделать так же потом, если штучка реально полезная. Мне вот для отладки пригождается, а в конечном коде, абычна, и сериала-то нет. :-)

Feofan
Offline
Зарегистрирован: 28.05.2017

Вставил в конец файла

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h

перед последней скобкой "};", после строки "virtual void flush() { ..."

    size_t printf(const char *format, ...)
    {
      const uint8_t MAX_STRING_SIZE = 64;		
      char buf[MAX_STRING_SIZE];

      va_list args;
      va_start(args, format);
      vsnprintf(buf, MAX_STRING_SIZE, format, args);
      va_end(args);
      return print(buf);
    }
};

#endif

Результат

error: 'class HardwareSerial' has no member named 'printf'; did you mean 'print'?
    Serial.printf("%05d\n", ui16);
           ^~~~~~
           print
exit status 1
'class HardwareSerial' has no member named 'printf'; did you mean 'print'?

Что сделал не так?

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

у меня вставлено так 

    size_t println(void);  // существующая строка

	size_t printf(const char *format, ...) {
		const uint8_t MAX_STRING_SIZE = 64;
		char buf[MAX_STRING_SIZE];

		va_list args;
		va_start(args, format);
		vsnprintf(buf, MAX_STRING_SIZE, format, args);
		va_end(args);
		return print(buf);
	}

    virtual void flush() { /* Empty implementation for backward compatibility */ } // существующая строка

 

Feofan
Offline
Зарегистрирован: 28.05.2017
Дело было в путях. Надо править по:
C:\Users\...\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\cores\arduino
Вставил после строки "virtual void flush() { /* Empty impl..."
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нуууу, у мня VisualMicro, я написал #include <Print.h>, нажал правой кнопочкой на ней да выбрал "Открыть документ", оно мне сразу правильное и открывается. :)  Как там в Arduino IDE - я, слава богу, не знаю.  :)

От тут про форматный вывод лучше написано  http://microsin.net/programming/ARM/secrets-of-printf.html