Re: Formátovaný tisk bylo Re: sprintf - co delam blbe?
David Obdrzalek
David.Obdrzalek na mff.cuni.cz
Pátek Duben 19 12:14:32 CEST 2024
Na Arduínu s AVR se to dá udělat takhle:
#include <stdio.h>
inline int serial_putchar(char c, FILE* f) {
if (c == '\n') serial_putchar('\r', f);
return Serial.write(c) == 1 ? 0 : 1;
}
static FILE serial_stdout;
inline void printfSerialBegin(unsigned long baud) {
Serial.begin(baud);
fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &serial_stdout;
}
Pak je už potřeba jen nainicializovat, např. v setup() místo Serial.begin(115200);
volat printfSerialBegin(115200); a pak se normálně používá printf("blabla %i .. %i
\n",a,b); atd.
Pro podporu %f je nejjednodušší přidat do platfotm.local.txt
compiler.c.elf.flags={compiler.warning_flags} -Os -g -flto -fuse-linker-plugin
-Wl,--gc-sections -Wl,-u,vfprintf -lprintf_flt -lm
(ale kdo by na AVR používal float...)
Ano, žere to paměť, jak programovou, tak datovou za běhu a ano, žere to i čas (je to
moloch a navíc Serial je blokující). Ale pro nějaké to menší ladění se to dá přežít.
Rozhodně je komfortnější napsat printf("%3u. x=%3i y=%3i v=%02x\n",index,x,y,v);
než to rozepisovat po jednotlivých Serial.print().
D.O.
On 17 Apr 2024 at 10:17, Ladislav Vaiz wrote:
> To by bylo vhodné řešení pro Arduino, tam existuje bázová třída Stream.
> Tím bude fungovat se Serial případně s dalšími odvozenými třídami.
> L.
>
>
> On 17.04.2024 9:52, Jan Waclawek wrote:
> > Jedna z moznosti, ktora este nezaznela, je odovzdanie funkcie, ktora
> > vytlaci znak, tej formatovacej rutine. Ta si potom moze alokovat
> > lokaly buffer podla lubovole...
> >
> > wek
Další informace o konferenci Hw-list