No jak nie ma minusa to w ramce występuje 0, czyli kod 0x30 w ascii, czyli zero.
Nie chodzi o to by dokładać zera, ale by uniewrażliwić funkcję wyświetlającą na wyświetlaczu LED poszczególne znaki, od długości danej w ramce.
Bo problem jest następujący, przylatuje jak już pisałem po RSie w jednym przypadku 001,230CR000,000CRLF, czyli dokładniej mówiąc pierwszą daną jest masa, drugą tara. Zgodnie z
pozp = strcspn (mybuf,",");
kg = (mybuf,",",&g);
.....
wiemy, że do zmiennej "tablicy" kg, przypisywana jest część 001 a do "tablicy" g, przypisywana jest część 230.
Teraz wiedząc dzięki funkcji strscpn, że na czwartym miejscu w tablicy mybuf jest przecinek, możemy "dodać", do zmiennej przekazywanej do cy3 offset, potrzebny do zapalenia danej cyfry z przecinkiem. W moim przypadku 0x14. Co widać na poniższym przykładzie z ifami
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Problem jest gdy już urządzenie samo zaczyna usuwać zbędne zera, czyli zamiast wysyłać 001,230.... wysyła 1,230. Przez co przypisania
cy1=tab[0]
cy2=tab[1] itd, się rozjeżdzają
Mam nadzieję, że nadążacie, jak nie to rozpiszę jeszcze dokładniej
Przypominam, że w ramce przecinek jest wysyłany przecież też w kodzie ASCII, czyli taki zapis 001,230CR000,450CRLF wysłany będzie jako następujące kody
ascii 30 30 31 2d 32 33 30 0d 30 30 30 2d 34 35 30 0d 0a
po rozdzieleniu na pierwsza i drugą linię dzięki bibliotekom Mirka
zostanie nam po drugim wywołaniu eventu w naszym buforze 30 30 31 2d 32 33 30, następnie po sparsowaniu funkcją strtok_r, dostajemy w tablicy kg -> 30 30 31 a w tablicy g -> 32 33 30 no i wiedząc że czwartym elementem tablicy jest przecinek (numeracja w C od zera) zapalamy odpowienio przecinek.
Ale przy wysłaniu 31 2d 32 33 30 0d 30 2d 34 35 30 0d 0a, analogicznie do tablicy kg trafia 31 (czyli jednak dana tylko), a do g 32 33 30. Mierząc teraz ilość elementów do znaku 2d (czyli przecinka) dostajemy 1, no a przecież nie możemy zapalić przecinka na pierwszym wyświetlaczu, tylko ciągle na trzecim, bo zakres pomiaru się nie zmienił. Nadal potrzebujemy dostać na wyświetlaczu LED 1,230 czyli wygaszone dwa pierwsze wyświetlacze.
Mam nadzieje, że teraz trochę jaśniej
.
PS. Powoli się zastanawiam, czy nie lepiej było by mierzyć rozmiar g, zamiast kg bo wielkość tablicy g się nie zmienia, ale nie wiem jaka funkcja by sobie z tym poradziła bo strcspn mierzy ilość znaku do "," a nie od do końca. Coś mi się wydaje, że za samo zrozumienie problemu powinna być już jakaś nagroda
;).
Części u mnie dużo, mogę coś dorzucić do tej atmegi
. (Pewnie magazynu kolegi SunRivera nie pobije, bo najdalej po części to byłem w Bielsku białej
)
-- 11 minutach --
Malutki_27 napisał(a):
A jak nie będzie minusa w ramce to co ma sie wyświetlić na pierwszym wyświetlaczu ?
Drugie pytanie a po co te literki w tablicy ?
Literki są do wyświetlania komunikatów error, ver, noData itp.
Chciałem zrobić zgodność miejsca w tablicy z kodami ascii, ale tablica zajmowała by strasznie dużo miejsca.
Po za tym i tak musiał bym robić dodatkowo kody dla cyfr z przecinkami, bo nie wpadłem jak wyświetlić na wyświetlaczu 2. 1. itp. pewnie dało by się jakoś za pomocą wskaźników, ale ostatnio i tak sukcesem jest umiejętność wykorzystania eventów (z bibliotek Mirka), oraz obsługi tablic za pomocą wskaźników, chociaż mi to opornie strasznie idzie.
Programowanie w C to dla mnie na razie chodzenie po omacku często. Nakupiłem Atmeg, bo boję się że te 10tyś możliwych zaprogramowań nie starczy do końca napisania programu
.