Jak napisaæ w AVR-GCC funkcje dzia³aj±c± identycznie jak: printf("%02X", n); ?? Wywo³anie wygl±da³o by np. tak: uart_putchar_hex(n);
uart i hex
Dec 27, 2004
23 Replies
- Pomyśl jak zamienić bajt na 2 znaki hex: - rozdziel na starszą ((n >> 4) & 0x0f) i młodszą połówkę (n & 0x0f) - mając dwie liczby z zakresu 0..15 przekształć każdą z nich na znak szestnastkowy
- Wyślij te znaki funkcją typu uart_putchar (ch)
A dlaczego nie chcesz normalnie użyć printf, wcześniej się doczepiając do jego mechanizmu wywołaniem fdevopen?
bo nie umiem
Tyle, ¿e mi chodzi o takie co¶, ¿eby z np. 26 zrobiæ 1A (?), a potem wystawiæ znakowo 1 i A.
a co chcesz "robić" ? Przecież wewnętrznie i tak już jest.
uchar a, b;
a = 0x26; // na przykład b = a & 0x0F; uart_putchar( b + (b < 10) ? '0' : 'A' ); b = (a & 0xF0) >> 4; uart_putchar( b + (b < 10) ? '0' : 'A' );
ok?
Waldek
To maskowanie (a & 0xF0) jest zbędne. Wystarczy b=a>>4;
fuckt. Ale wygląda ładniej ;-) No i coniektóre kompilatory (nie wiem, czy GCC nie jest takim świnią) propagują MSB przy shifcie i już masz kłopot. Z moją wersją zresztą też, więc lepiej: b = (a >> 4) & 0x0F;
Waldek
MSB ? chodzi ci o najstarszy bit w bajcie ? Jeśli masz liczbę bez znaku to na najstarszy bit zawsze jest wpisywane 0, a jeśli ze znakiem to powielany jest bit znaku. W przykładzie który dałeś masz liczbę bez znaku więc zapis "b=a>>4;" jest w pełni wystarczający.
U¿ytkownik "Waldemar Krzok" snipped-for-privacy@charite.de napisa³ w wiadomo¶ci news: snipped-for-privacy@charite.de...
Propagacja MSB chyba zalezy od signed/unsigned a nie od kompilatora.
Krzysiek Rudnik
teoretycznie masz rację, ale już kiedyś dostałem kurwicy jąder, bo kompilator o tym nie wiedział ;-) Strzyżonego pan bóg strzyże...
Waldek
tak być powinno. Ale jak już pisałem, miałem kiedyś kompilator, który uparł się, że bedzie robił shifta na signed, choć wsio było unsigned. No i miałem problem, a koledzy nauczyli się trochę polskiej łaciny.
Waldek
Uwazaj, bo jak swierdzi ze typ jest "signed", to moze czasem z przodu dopelnic 1111
J.
Wytłumacz mi jak kompilator zmienną typu unsigned char może potraktować jako liczbę ze znakiem.
Mozesz zapomniec dopusac unsigned. Moze miec blad. Albo upierdliwie realizowac standard - byl tu jakis przyklad jak to GCC konwertowal na 16 bit ..
J.
^^^^^^^^^^^^^^^^^^^^^^^ To co, unsigned char ma zakres 0...127??
Pozdrawiam
Mogę się założyć, że ilość zmiennych ze znakiem jest małym procentem wszystkich zmiennych w programach do systemów terujących/osadzonych/itp. Więc prędzej ktoś z rozpędu dopisze unsigned tam gdzie go być nie powinno.
Chcesz przez to powiedzieć, że w wyniku tej konwersji wynik operacji był nieprawidłowy (tzn liczba została potraktowana jakby miała znak, choć go mieć nie powinna) ? Ciekawe, bo na stronie
formatting link
nic o tym nie ma.
Przeczytaj proszę jescze raz parę postów powyżej. To co napisałem dotyczyło operacji przesuwania w prawo liczby bez znaku (x>>y).
No, tak. Niedoczytałem, że chodzi o 0 wpisywane w wyniku przesuwania.
Serdeczne
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required