Witam serdecznie
Moja xmega ma docelowo odbierać liczby po uart z zewnętrznego urządzenia przy 9600bps. Cyfra po cyfrze liczba z zakresu 0..99999. Na końcu standardowo \r\n.
Liczby przychodzą 20x /s. Czyli w max wersji 140 bajtów 8-bitowych na sekundę.
Po konwersji jednostek (stopy na metry czyli zakres 0..30000), do tych liczb chcę dodawać (nie algebraicznie) inne liczby (m.in. stan timera RTC) czyli powiedzmy aktualny czas przyjścia danej liczby i może jeszcze inną/e liczby wyliczone na podstawie tamtych.
Te nowe liczby int odsyłam do jeszcze innego urządzenia zewn (soft na PC) po drugim uart'ie z jak najmniejszym baudrat'em jak się da. Jeśli nie zdążę 9600 to może 19200. Ale to wyjdzie w praniu.
Nie chcę używać ASF'a, funkcji itoa, atoi itp z zewnętrznych bibliotek.
I założyłem sobie, że zamiast cyfra po cyfrze liczby int chcę podzielić na dwa bajty 8-bitowe (LO i HI). Pięciocyfrową liczbę wyślę wówczas dwoma bajtami, odpadnie konieczność dodatkowych znaczników (znaków oddzielających liczby) i/lub pętlenia w kodzie aby dodać zera wiodące. Mam nadzieję się wyrobić w czasie. (Odbiór mam w przerwaniach).
Ale do rzeczy. Utknąłem przy próbie zmiany odebranego int'a na LO i HI i wysłaniu ich.
Niezredukowany jeszcze do 2-3 linii sposób wygląda tak:
Niby hula, ale....
Małe liczby przechodzą ok.
Większe liczby przechodzą o 1 mniejsze a jeszcze większe przechodzą o 2-3 mniejsze.
Dla przykładu 16384 powinno podzielić się na bajty HI=64 i LO=0 ale w terminalu odbieram o 3 mniejszą. Podane wyżej bajty HI i LO odbieram dopiero kiedy wyślę 16387 ! A przecież wówczas powinienem odebrać 64 i 3.
No i oglądam to z lewej i z prawej i nie mogę znaleźć "knota".
Może ktoś coś widzi co tu bruździ lub spotkał się z podobnym zachowaniem?
pozdrawiam
Przemo
Moja xmega ma docelowo odbierać liczby po uart z zewnętrznego urządzenia przy 9600bps. Cyfra po cyfrze liczba z zakresu 0..99999. Na końcu standardowo \r\n.
Liczby przychodzą 20x /s. Czyli w max wersji 140 bajtów 8-bitowych na sekundę.
Po konwersji jednostek (stopy na metry czyli zakres 0..30000), do tych liczb chcę dodawać (nie algebraicznie) inne liczby (m.in. stan timera RTC) czyli powiedzmy aktualny czas przyjścia danej liczby i może jeszcze inną/e liczby wyliczone na podstawie tamtych.
Te nowe liczby int odsyłam do jeszcze innego urządzenia zewn (soft na PC) po drugim uart'ie z jak najmniejszym baudrat'em jak się da. Jeśli nie zdążę 9600 to może 19200. Ale to wyjdzie w praniu.
Nie chcę używać ASF'a, funkcji itoa, atoi itp z zewnętrznych bibliotek.
I założyłem sobie, że zamiast cyfra po cyfrze liczby int chcę podzielić na dwa bajty 8-bitowe (LO i HI). Pięciocyfrową liczbę wyślę wówczas dwoma bajtami, odpadnie konieczność dodatkowych znaczników (znaków oddzielających liczby) i/lub pętlenia w kodzie aby dodać zera wiodące. Mam nadzieję się wyrobić w czasie. (Odbiór mam w przerwaniach).
Ale do rzeczy. Utknąłem przy próbie zmiany odebranego int'a na LO i HI i wysłaniu ich.
Niezredukowany jeszcze do 2-3 linii sposób wygląda tak:
Kod: C / C++
Niby hula, ale....
Małe liczby przechodzą ok.
Większe liczby przechodzą o 1 mniejsze a jeszcze większe przechodzą o 2-3 mniejsze.
Dla przykładu 16384 powinno podzielić się na bajty HI=64 i LO=0 ale w terminalu odbieram o 3 mniejszą. Podane wyżej bajty HI i LO odbieram dopiero kiedy wyślę 16387 ! A przecież wówczas powinienem odebrać 64 i 3.
No i oglądam to z lewej i z prawej i nie mogę znaleźć "knota".
Może ktoś coś widzi co tu bruździ lub spotkał się z podobnym zachowaniem?
pozdrawiam
Przemo