Dodatki‎ > ‎

UART + printf?

W typowym, konsolowym programie w C użycie funkcji printf(...) wysyła wyniki (znaki) na konsolę.
W innym artykule przedstawiłem przykładową implementację wysyłania znaku i napisu na terminal (przez port asynchroniczny - SCI, UART). Niektóre mikrokontrolery (a właściwie środowiska programistyczne dla nich przeznaczone) domyślnie przekierowują standardowe wejście/wyjście właśnie na port szeregowy - co wydaje się dość logiczne, skoro mikrokontroler nie ma własnej klawiatury i konsoli tekstowej.

Czy na pewno jest to najlepsze rozwiązanie?

Można sobie wyobrazić scenariusze użycia innych interfejsów znakowych - I2C, SPI, albo bardziej egzotycznych - niekoniecznie zawsze musi to być UART.
Uniwersalnym i łatwym do implementacji rozwiązaniem byłoby wcześniejsze przygotowanie tablicy znaków do wysłania, a następnie wywołanie funkcji podobnej do send_str(char *s) z argumentem będącym właśnie tą tablicą (a raczej wskaźnikiem na jej początek).
Tutaj idealnie sprawdzi się ogólnie dostępna, ale niezbyt popularna funkcja sprintf(...). 
Różnica między sprintf(...) a zwykłym printf(...) jest taka, że sprintf zamiast na bliżej nieokreślone standardowe wyjście, zapisuje wyniki działania do bufora (tablicy znakowej) przekazanej jako pierwszy argument jej wywołania.
Pozostałe argumenty są takie, jak w zwykłym printf - czyli należy być czujnym i zwracać uwagę na pułapki zastawione na nieostrożnych programistów.

Jak tego użyć w praktyce?

Przykładowy kod pojawił się w opisie użycia ADC, oto jego fragment:

char buf[100]; //nasz bufor znakowy - zakładamy, że 100 znaków wystarczy
sprintf(buf, "AN0 = %d\r\n", adc[0]); //prawie jak printf!
send_str(buf);  //Przygotowane wyżej znaki możemy wysłać dokądkolwiek, np. radiowo. 
                //Wcale nie musi to być UART!

Oczywiście nie wolno zapomnieć o odpowiednim pliku nagłówkowym - zwykłe stdio.h rozwiązuje problem:
#include <stdio.h>