Formatovany tisk pro 8bit
Martin Záruba
swz na volny.cz
Pátek Duben 19 21:23:43 CEST 2024
Já to tak původně dělal, jenže byl to mnohem složitější a vlastně můžete
takto udělat jen část než narazíte na první formátovací znak. Pak už je
to stejně jen odeslání čísla. protože nevíte, zda nebude následovat
další formátovací znak po libovolné počtu "výplní". Tvar text,val, míst
se mi nelíbil, protože s ním neuděláte třeba 10mV. Takto je text
kdekoli, dokonce je kdekoli i třeba \n, takže nemá smysl println. A
varinta txtPred, val, míst, txtPo to sice umí, ale jsou 4 parametry a
stejně nejde udělat třeba odskočené tisíce. Taky se mi líbí, že to
sežere i float. Předpokládím, že buffer se vytvoří na zásobníku a po
opuštění funkce zmizí. Je to tak?
Ještě to chci doplnit o možnost mít formátovací řetězec ve flash. Není
mi ale jasné, jaký je rozdíl mezi PSTR("V paměti flash") a F("V paměti
flash"). Asi se mi víc líbí F(" "), je to kratší zápis a dovoluje
přetížení funkce. Ale možná má nějakou nevýhodu, na kterou jsem nepřišel.
Martin Záruba
Dne 19.4.2024 v 20:50 Pavel Hudeček napsal(a):
> Moc pěkný.
> Já bych teda akorát nekopíroval celý text do velkého bufferu a místo
> toho text před číslem rovnou odesílal v prvním do/while, pak převed a
> odeslal číslo a nakonec odeslal zbytek vstupního textu.
>
> Už jsem taky kdysi použil variantu, kdy se zadávají parametry (text,
> val, mist) a v textu je pak znak pro umístění čísla a des. míst se
> odešle podle hodnoty mist. Častějc mám ale (txtPred, val, mist, txtPo).
>
> Odesílání mám teda téměř vždy rovnou průběžně po znacích a odesílací
> funkce čeká jen na dokončení předchozího znaku, takže konverze na
> výstupní text probíhá paralelně s odesíláním.
>
> PH
>
> Dne 19.04.2024 v 19:23 Martin Záruba napsal(a):
>> Už jsem se Vás dost natrápil na toto téma a měl jsem pocit, že nic
>> moc úsporného a jednoduše použitelného není. Jenže jsem paličatý a
>> zkusil jsem přece něco vymyslet. Požadavek byl:
>>
>> Výpis na požadovaný počet míst s možností textu před i za číslem.
>>
>> Potlačení nevýznamných nul.
>>
>> Co nejúspornější kód jak funkce, tak volání, vhodný pro malinky
>> procesor.
>>
>> Přímý tisk bez nutnosti psaní Serial.print();
>>
>> Vyrobil jsem toto, posuďte a navrhněte prosím co by ještě šlo líp.
>>
>>
>> void pr(int32_t h, const char* f) {
>> char buf[100];
>> uint8_t i = 0xFF;
>> int32_t x = abs(h);
>> do {
>> i++;
>> buf[i] = f[i];
>> } while (f[i] != 0);
>>
>> do {
>> i--;
>> if (buf[i] == '#') {
>> if (x != 0) {
>> buf[i] = x % 10 + (uint8_t)'0';
>> if (h < 0 && x < 10) {
>> i--;
>> buf[i] = '-';
>> }
>> } else {
>> buf[i] = ' ';
>> }
>> x /= 10;
>> }
>> } while (i != 0);
>> Serial.print(buf);
>> }
>>
>>
>> Funkce má jediný formátovací znak #
>>
>> Příklady:
>>
>> int32_t napetimV = 5432;
>> pr(napetimV, "Pokus1=###.###V\n");
>> pr(-21, "Pokus2=### zaporne cislo\n");
>> pr(9876543, "Pokus3=# ### ### cislo s mezerami po 1000\n");
>> float a = 54.3;
>> pr(a*10, "Pokus4=####.# vypis float na 1 desetinne misto\n");
>>
>> Výsledek vypadá takto:
>>
>> Pokus1= 5.432V
>> Pokus2=-21 zaporne cislo
>> Pokus3=9 876 543 cislo s mezerami po 1000
>> Pokus4= 54.3 vypis float na 1 desetinne misto
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240419/88406534/attachment-0001.htm>
Další informace o konferenci Hw-list