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