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