Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 3 gru 2024, o 00:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 48 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 6 lip 2012, o 11:12 

Pomógł: 0

Ok, wysyła mi to co dostaje ;), tj. nie do końca, ponieważ wysyłając -01,230$0d000,450$Od$0A, urywa początek do pierwszego znaku $0d, czyli do CR, to akurat rozumiem, bo w case jest, że ma ignorować znak LF, ale wywalając tego case 10, nadal nie dostaję całej linii.
Po za tym, zależy mi na wysupłaniu tylko i wyłącznie danych do pierwszego CR. Czyli przychodzi -01,230$0d000,450$Od$0A, non stop, jedno za drugim, a ja chce tylko dane do pierwszego CR.

Próbowałem zastąpić wersję z switch(data).....
wersją
if(data == 10){
ascii_line++;
}
to dostaję na zmianę, raz daną do pierwszego CR, raz do drugiego, a raz 0.


PS. Dziękuje Mirku za cierpliwość, jeszcze nie "kumam" za bardzo tych eventów, traktuje je bardziej jak czarne skrzynki ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 11:49 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Ale nie za bardzo wiem co ty teraz piszesz i przerabiasz z tym:

if(data == 10){
ascii_line++;
}

przecież znaki LF są ignorowane już wewnątrz biblioteki - nie ma ich ;) ale ja już czuję coś - jaką ty mistyfikację popełniasz ;) tzn tak mi się tylko wydaje ;)

piszesz że odbierasz wciąż taką ramkę:

-01,230$0d000,450$Od$0A

pomijam już, że ja widzę w tej ramce na końcu $O litera duże O zamiast zero - ale może ty to przepisywałeś ręcznie więc się dziabnąłeś

nie mniej jednak powiedz mi panie kochany - bo może tu masz MEGA NAJWIĘKSZY kłopot ;) ?????

czy w tej ramce na końcu przylatują ci znaki ASCII\

$0d$0A

czy tak sobie tylko wpisałeś a na końcu tej ramki są po prostu pojedyncze bajty o wartościach 13 i 10 ??????????

bo być może cała twoja ramka składa się z kodów ASCII w tym z tych $0d$0a - to jak ty byś chciał żeby to było odebrane do $0d automatycznie ..... oj oj

wiesz co? zrób tak, odpal sobie jakiś terminal i zrób zrzut ekranu z tego co przylatuje ale ustaw go tak żeby pokazywał znaki niedrukowalne czyli CR i LF

to wtedy ci powiem gdzie być może robisz potwornego babola w tych rozważaniach (o ile dobrze myślę - ale może się mylę) ;) dlatego dawaj pan ten zrzut ekranu

------------------------ [ Dodano po: 10 minutach ]

Zobacz - jak to wygląda na zestawie ATB, w terminalu wpisałem napis i kliknąłem klawisz ENTER, który przecież wygenerował na końcu CR i LF no i od razu wpadło to na mój LCD pięknie ;)

Obrazek

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 12:10 

Pomógł: 0

Ok, fakt, przyznaję się bez bicia, chociaż należało by przywalić, pomyliłem 0 z zero '0'

Teraz, zmieniłem na oryginalnie z case (czyli tak jak w książce i L21)

wysyłam dokładnie to -01,230$0d000,450$0d$0A (przekopiowane, nie przepisane, O zmienione na zero)

na wyjściu uarta dostaje 2D 30 31 2C 32 33 30 30 30 30 2C 34 35 30
na wyświetlaczu oczywiście
odebrano:
000,450

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Niestety, problem u mnie jest następujący. Myślałem, że pisze pogram pod urządzenia które są standardem, niestety, jedno wysyła ramkę
-01,230$0d000,450$0d$0A, ewentualnie 001,230$0d000,450$0d$0A (oczywiście przecinek czyli kod 2C, też zmienia miejsce;) bo zależy od od nośności urządzenia). Problem powstaje gdy, jedno z "nowszych" urządzeń, samo sobie obcina znaczące zera i wysyła coś w postaci -1,230$0d0,450$0d$0A lub 1,230$0d0,450$0d$0A, analogicznie do poprzednich danych.
Cały czas mam problem, z właściwą interpretacją tych danych, jak wcześniej wklejałem Mirku kod swojego programu na ifach ;), to on ogólnie działa, ale niestety wykłada się właśnie przy zmiennej ilości danych, zresztą wiadomo dla czego. Sam fakt rozbijania tablicy poprzez miejsca w tablicy (ależ masło maślane), na odpowiednie miejsce na wyświetlaczu LED (6cyfr), po po pierwsze przecinek może być w różnych miejscach 00,000 000,00 0000,0 albo by było śmieszniej bez przecinka 0000 to jeszcze pojawiają się komunikaty OF i UF.
Przez co interpretacja danych w moim wcześniejszym programie wygląda jak wygląda ;). Chyba jedyną dobrze opanowaną komendą jest if...then ;).

Moja koncepcja jest taka trzeba rozdzielić informacje z ramki -01,230$0d000,450$0d$0A, pierwsze to Masa, drugie to tara, masę zostawiamy tarę odrzucamy.
Czyli jeżeli dana kończy się CR, to ją zostawiamy, jeżeli kończy się CRLF to ją odrzucamy.

czyli coś jak w poprzednim programie

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 9 lip 2012, o 11:15 przez rezasurmar, łącznie edytowano 1 raz

Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 12:35 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Ale poczekaj bo ja nadal nie rozumiem - i wytłumacz mi to proszę - to potem ja tobie coś powiem ;)

jak masz napisaną tą ramkę:

-01,230$0d000,450$0d$0A

to czy $0d oznacza JEDEN bajt czy oznacza TRZY bajty ???? to dla mnie bardzo ważne a pewnie i dla ciebie też

tak samo $0A to JEDEN bajt czy TRZY bajty w tej ramce

może zapytam inaczej, czy ramka wygląda tak: ?

bajt01 - [-]
bajt02 - [0]
bajt03 - [1]
bajt04 - [,]
bajt05 - [2]
bajt06 - [3]
bajt07 - [0]
bajt08 - [$0d]
bajt09 - [0]
bajt10 - [0]
bajt11 - [0]
bajt12 - [,]
bajt13 - [4]
bajt14 - [5]
bajt15 - [$0d]
bajt16 - [$0A]

czy tak: ?????

bajt01 - [-]
bajt02 - [0]
bajt03 - [1]
bajt04 - [,]
bajt05 - [2]
bajt06 - [3]
bajt07 - [0]
bajt08 - [$]
bajt09 - [0]
bajt10 - [d]
bajt11 - [0]
bajt12 - [0]
bajt13 - [0]
bajt14 - [,]
bajt15 - [4]
bajt16 - [5]
bajt17 - [$]
bajt18 - [0]
bajt19 - [d]
bajt20 - [$]
bajt21 - [0]
bajt22 - [A]


czekam na odpowiedź

a tymczasem podpowiem, że co to za różnica że ramka przychodzi raz taka a raz inna - żadna róznica - tak samo da radę ją obrobić i sparsować dane ....

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 13:16 

Pomógł: 0

Dokładnie tak

bajt01 - [-]
bajt02 - [0]
bajt03 - [1]
bajt04 - [,]
bajt05 - [2]
bajt06 - [3]
bajt07 - [0]
bajt08 - [$0d]
bajt09 - [0]
bajt10 - [0]
bajt11 - [0]
bajt12 - [,]
bajt13 - [4]
bajt14 - [5]
bajt15 - [$0d]
bajt16 - [$0A]

bo $0d i $0a do dokładnie znaki CR i LF, tylko mój terminal ma takie wymagania by przed znakiem specjalnym musi być znak $, czyli on nie uczestniczy, tylko jak by zamienia 0a, z dwóch znaków czyli zera i litery a, na kod CR w ascii.

Moja ramka z urządzenia to jest dokładnie - 0 1 , 2 3 0 0d 0 0 0 , 4 5 0 0d 0A, no przecinki są automatycznie zamieniane na kod 2c. Trochę namieszałem tymi $, ale mamy dziś w firmie uruchamianie linii sortującej i biegam od komputera do linii.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lip 2012, o 13:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

rezasurmar napisał(a):
Dokładnie tak

bajt01 - [-]
bajt02 - [0]
bajt03 - [1]
bajt04 - [,]
bajt05 - [2]
bajt06 - [3]
bajt07 - [0]
bajt08 - [$0d]
bajt09 - [0]
bajt10 - [0]
bajt11 - [0]
bajt12 - [,]
bajt13 - [4]
bajt14 - [5]
bajt15 - [$0d]
bajt16 - [$0A]



No to mam już byka za rogi ;) i teraz wiem dlaczego piszesz, że program zjada ci początek ramki ;) czyli że niby nie odbiera tego co zaczyna się od -1....

oczywiście program wszystko odbiera tylko ty nie potrafisz sobie na razie tego zwizualizować - więc tak na gorąco (pozwól że będziemy się posługiwali jeszcze tym najprostszym przykładem ze zdarzeniem zamiast tych twoich ifów itp ok?) - zrób sobie tą funkcję tak teraz i zobacz co się stanie na LCD ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i powiedz mi co teraz widzisz ? ;)

------------------------ [ Dodano po: 3 minutach ]

Naturalnie kolejnym krokiem może być w tej samej funkcji piękne sparsowanie danych i np taki wynik na wyświetlaczu:

P1=-01 ** P2=230
P3=000 ** P4=45

Oczywiście te P1, P2 to tak tylko poglądowo dałem żeby było widać że każdy Parametr jest wyświetlony oddzielnie ;)

------------------------ [ Dodano po: 5 minutach ]

i już masz rozbite poszczególne części każdej ramki (linii) na pojedyncze wartości rozdzielone przecinkami. Można je też łatwo zamienić z tekstów ASCII na liczby bezpośrednio już funkcjami typu ATOI()

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 10:49 

Pomógł: 0

No ładnie oddziela pierwszą daną od drugiej. Czyli na górze (1 linijka) pojawia się dana do pierwszego znaku CR, a w drugiej linijce dana do drugiego CR.
Czyli widzę coś takiego
do pierwszego CRa
0003.00
do drugiego CRa
0000.00

czyli przylatuje 30 30 30 32 2C 30 30 CR 30 30 30 30 2C 30 30 CR LF

wylatuje ;) 30 30 30 32 2C 30 30 30 30 30 30 2C 30 30, czyli zjada (prawidłowo) znaki poniżej znaków drukowalnych


Hmmmm. Teraz tylko muszę pomyśleć, jak to przełożyć na wyświetlanie na LEDach,

Dziękuje ci Mirku, odpisuje dopiero teraz, bo weekend miałem bardziej rodzinny ;) i odpuściłem sobie siedzenie przy kompie.

Da się jakoś przerobić funkcję pobierania z bufora, by jednak zostawiała znak CR i LF, ewentualnie by zamiast tego do pierwszej danej dokładała jakiś nagłówek, tak samo do drugiej. Bo zdecydowanie jednak łatwiej operowało mi się na starej bibliotece, gdzie znaki CR i LF przelatywały dalej, teraz nie mam za bardzo pomysłu, jak zrobić parser, by te dwie dane rozdzielić. Na LCD jest to banalne, ale dla LED całkowicie inne.

Teraz, po wysłaniu funkcją uart_puts( mybuf ) danej spowrotem na RSa, dostaję ciurkiem czyste ASCII powyżej kodów 32, czyli jednym ciągiem bez żadnych przerw dane idą ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 12:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Aaaa no jednak wypróbowałeś sposób - a najpierw przeczytałem maila od ciebie niż ten post i pomyślałem że w ogóle zrezygnowałeś z prób, które proponuję.....

OK ;) skoro masz już ładny podział to zostało dosłownie niewiele żeby to porozbijać dalej na kawałki ;) rozłupać jak ci się żywnie spodoba ;) i bez żadnych tam takich pomysłów żeby pozbywać się z biblioteki wycinania CR iLF'ów bo trzeba by ją było chyba pisać od nowa ;)

teraz tylko mi powiedz - widzisz już że masz ładnie wydzielone rameczki każdą z osobna. A mówiąc ramka mam na myśli tekst ASCII pomiędzy znakami CR - i o to głównie chodziło

Teraz już pozostaje to tylko sparsować. Jak ???? no najpierw warto zaczytać jeszcze i tu odeślę cię na chwilkę do książki

koniecznie poczytaj proszę uważnie tekst od ostatniego akapitu na dole strony nr: 423

bardzo cię proszę - tam jest pokazane KROK po KROCZKU jak można dokonywać parsowania stringów ;) takich które zawierają TOKENY .... co to są tokeny ???

TOKEN1,TOKEN2,TOKEN3

o to są tokeny czyli informacje zawarte między separatorami w stringu rozumiesz ??? separatorem może być np przecinek albo dowolny znak jaki uznasz za stosowny

a zatem w twojej ramce

-010,0043

widzimy dwa tokeny jeden to tekst

-010

a drugi to tekst

0043

i właśnie na tych stronach jest pokazane jak w C przepięknie - podkreślam PRZEPIĘKNIE się to robi i to za pomoca już wbudowanych funkcji takich jak strtok() albo strtok_r()

i teraz jak to przeczytasz i ew coś popróbujesz to daj znać - i jeszcze chwilę się wstrzymaj z chęcią wyświetlenia tego od razu na wyświetlaczu LED - weź jeszcze troszkę na wstrzymanie i wyświetl to sobie na razie na LCD - każdy sparsowany token osobno. A obiecuję, że później już będzie OSTATNI prosty krok aby to pokazać na wyświetlaczu LED

po prostu trzeba sobie podzielić rozwiązywanie takiego zadania na kilka prostszych etapów, potem dopiero będziesz to robił jednym ciurkiem ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 13:51 

Pomógł: 0

Pozwalam sobie wrzucić PW od Mirka by temat nie stracił na spójności.
Cytuj:
Witam,

nie zanudziłeś ale najbardziej podobają mi się twoje oceny że np

Cytuj:
"to jest dobry sposób ten co pokazałeś ale on nadaje się tylko na LCD a nie na wyświetlacz LED"


No aż micha mi się śmieje jak będziesz śpiewał niedługo jak zobaczysz że to nadaje się do WSZYSTKIEGO a nie tylko na jakiś tam wyświetlacz. Ale mam nadzieję, że wtedy na forum odwołasz te słowa ;) hyhyhy (żartuję oczywiście) bo micha mi się bardziej z tego cieszy jaki będziesz zdziwiony i zaskoczony - że to już koniec, że po zastrzyku i nie bolało a wszystko działa jak chciałeś ;)

Myślałem że przecinek w tej ramce to separator ale widzę że to normalny przecinek dziesiętny więc jest jeszcze prościej hyhyhy czyli ta twoja cała ramka to jakby dwie wartości zmiennoprzecinkowe

i super

zatem wartość

-01,230

co tu widzimy znaki ASCII ;) kody ASCII

tak wyprzedając fakty - i robiąc na chwilę duży skok bo nie mogę wytrzymać, że mówisz że to się nie nadaje na LCD i jeszcze gdzieś tam kołaczą ci się wciąż te jakieś dziwne sposoby z tymi CRLF'ami

panie kochany żebyś może lepiej zrozumiał to na moment odpuśćmy sobie znak ujemny i wygaszanie zer OK ???? tylko proszę spróbuj podążyć tym tokiem myślenia - a za dużo go nie będzie

więc załóżmy że mamy

01,230

i siedzi to w mybuf[] ;)

rozumiem też że masz 5 wyświetlaczy LED - to teraz skok do pierwszej mojej książki i przypomnij sobie rozdział o wyświetlaczu LED ..... KONIECZNIE - co tam było ????

ano dla każdej cyfry mieliśmy pięknie zmienne:

cy1, cy2, cy3, cy4

teraz poszerzysz to o cy5

no i wpisanie tej ramki do wyświetlacza LED sprowadzi się UWAGA w uproszczeniu do:

cy1 = mybuf[0] - '0';
cy2 = mybuf[1] - '0';
cy3 = mybuf[2] - '0';
cy4 = mybuf[3] - '0';
cy5 = mybuf[4] - '0';

to WSIO ;)

teraz tylko ew sprawdzać czy pierwszy bajt bufora to np znak minus

if( mybuf[0] = '-' ) to coś tam

albo czy na początku jest zero nieznaczące

if( mybuf[0] = '0' ) to nie wyświetlaj

;)

i co ???? potrzeba jakichś tam CRLF'ów ?

Pozdr Mirek


OK, to sobie to teraz wszystko na spokojnie przetrawię, to i z pw.
Mam nadzieję, że teraz mnie olśni ;). Mam już pewną koncepcję, jak przenosić z mybuf na LEDy. Bo dodatkowo do ramki mogę dodać dla pierwszej danej dodatkowy znak ascii 30, czyli dodatkowe zero, a do drugiej danej dodatkowo na początku 34, czyli kod 4 w ascii. Bo w niektórych urządzeniach są jeszcze nagłówki, ale niestety nie we wszystkich przez co za dużo było by kombinacji.

Teraz tylko wszystko rozbija się o odpowiednie wykrycie przecinka. Oraz końca pierwszej linii.

Zarzuciłem pomysł z wyświetlaniem tylko nieparzystych linii, bo nie był by to pomysł odporny na błędy. Chociaż po zastanowieniu, zawsze przecież przychodzi pełna ramka, więc możliwe, że uda mi się zastosować pomysł z wyświetlaniem na 6 wyświetlaczach CY1----CY6 co drugiej linii :).



Ostatnio edytowano 11 lip 2012, o 14:04 przez rezasurmar, łącznie edytowano 1 raz

Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 13:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Olśni olśni cię - już ci podesłałem parę słów na PRIV ;) bo atakujesz mnie na wszystkie strony - ale to dobrze ;)

Tylko o tyle lepiej by było toczyć to na forum te rozważania i twoje obawy - bo właśnie tutaj pięknie wyjaśniałoby się to także później innym w głowach.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 15:00 

Pomógł: 0

Ok, najwyżej brakujące rozmowy przeniosę potem na forum ;)

Możesz mi tylko odpowiedzieć na jedno nurtujące mnie pytanie.
Prubuję wydzielić dane wykorzystując przecinek jako token,
z tego co zrozumiałem strtok_r pierwszy argument powinien być wskaźnik do pierwszego elementu tablicy, wydaje mi się, że właśnie mybuf jest przecież wskaźnikiem na pierwszy element? czy źle zrozumiałem? char * mybuf, to przecież mybuf jest wskaźnikiem na tablicę, do której trafiają dane z eventu obsługi ramki?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wywala warning
assignment makes pointer from integer without a cast
implicit declaration of function 'strtok_r'

czyli jednak coś źle jest z tymi wskaźnikami, jak wykorzystałem przykład z książki, tj. zadeklarowałem tab[]="napis, testowy"
i zamiast mybuf wrzuciłem tab, to ładnie mi rozdzieliło na "napis" i "testowy"

PS.
To będzie chyba najlepsza droga do parsowania tych danych, bo wtedy nie zależy nic od długości zmiennych.
tj. dostanę 4 sparsowane zmienne, czyli wartość przed przecinkiem i po przecinku dla obydwu danych
jak to już ładniej rozrysowałeś wcześniej.

P1=-01 ** P2=230
P3=000 ** P4=45

Przez co łatwo potem można zapanować nad wyświetlaniem, bo wiemy że separatorem danych jest przecinek i wystarczy go potem zapalić na właściwym miejscu, zależnym tak naprawdę od długości zmiennej P2 :):):), w tym przypadku przecinek bedzie zapalony na miejscu cyfry 3 od lewej :).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 15:07 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

rezasurmar napisał(a):

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wywala warning
assignment makes pointer from integer without a cast
implicit declaration of function 'strtok_r'.


ale tu nie ma żadnego warninga, wkleiłem na żywca to do siebie i skompilowałem ;) zero problemu - pokaż dokładnie komunikat z konsoli z numerami linii - może to dotyczy czegoś innego a nie tej linii

------------------------ [ Dodano po: 2 minutach ]

już chyba zaczynasz to CZUĆ ;) ??? co ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lip 2012, o 07:29 

Pomógł: 0

Ten błąd, co dziwne, pojawia się, gdy aktywna jest (podświetlony) nazwa projektu, gdy kliknę na main i jeszcze raz skompiluje wtedy warningów nie ma. Co ciekawe, po clean projekt, za pierwszym razem też są te warningi, a za kolejnym razem już nie.

i dokładnie w tej linijce
masa_wsk = strtok_r(mybuf, ",", &tara_wsk);



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lip 2012, o 09:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

rezasurmar napisał(a):
Ten błąd, co dziwne, pojawia się, gdy aktywna jest (podświetlony) nazwa projektu, gdy kliknę na main i jeszcze raz skompiluje wtedy warningów nie ma. Co ciekawe, po clean projekt, za pierwszym razem też są te warningi, a za kolejnym razem już nie.


To nie jest ciekawe ;) tylko normalne zjawisko i wcale nie należy uważać, że warningów nie ma skoro znikają po drugiej kompilacji. ;) już wyjaśniam. Po pierwsze LICZY się tylko ten stan, który jest po CLEAN czyli pierwszej czystej kompilacji. A ponieważ są to tylko warningi (ostrzeżenia) a nie błędy, to kompilator uznaje, że jak programista klika drugi raz "Kompiluj" to mówi kompilatorowi w niewybredny sposób coś takiego mniej więcej:

"teee kompilator przestań już pyszczyć, nie chcę nic słyszeć o warningach, ja jestem pewien że wszystko jest OK"

no i kompilator dlatego grzecznie już za drugim razem ich nie pokazuje, TYLKO DLATEGO ;) Dlatego na drugi raz nawet się nie zastanawiaj dlaczego warningi znikają po drugiej kompilacji.

rezasurmar napisał(a):
i dokładnie w tej linijce
masa_wsk = strtok_r(mybuf, ",", &tara_wsk);


Tak nieraz widzę, że kolega uparcie wszystko po swojemu a nie tak jak poproszę - ale ok, dłużej to potrwa ale damy radę ;)

Pisałem, żebyś najlepiej zaznaczył cały obszar mychą w konsoli z tym warningiem i go tu dokładnie wkleił pokazując może nawet zrzut ekranu z miejsca kodu, który tam masz. Bo jak mówię - ja nawet testowałem ten twój kod u siebie pomimo że widać iż błędu w nim nie było - i oczywiście się poprawnie kompiluje.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lip 2012, o 12:15 

Pomógł: 0

Ok wklejam cały kod
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Description Resource Path Location Type
assignment makes pointer from integer without a cast main.c /LargeLed_v2 line 57 C/C++ Problem
implicit declaration of function 'strtok_r' main.c /LargeLed_v2 line 57 C/C++ Problem


PS.
Parsowanie po przecinku działa ;), ale jak rozpoznać teraz przez brak znaku CR, te dwie dane w ramce oddzielone znakiem CR?
Na wyświetlaczu rozdziela je na dwie linie
przy wykorzystaniu tej funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W tym momencie rozumiem, tylko sens użycia if i zmiennej cnt, która to rozdziela daną z mybuf, na dwie linie. Ale nie rozumiem, w jaki sposób funkcja lcd_str wie że jest nowa linia, przecież wywołując uart_puts(mybuf); nie dostajemy znaku nowej linii?
chyba że - zaraz, zaraz - funkcja uart_puts(mybuf), usuwa CR, ale nie jedynie przerywa kiedy napotka 0, znowu funkcja którą wykorzystuje uart_puts, czyli uart_putc, dokładnie to co dostaje to wyrzuca na uart?
W takim razie, skąd wiadomo, że następuje kolejna dana w ramce -01,230CR000,450CRLF, bo rozdzielenia -01,230 od 000,450, przy braku CRa między nimi za bardzo zrozumieć nie mogę ;).

Nawet dodałem do main deklarację funkcji extern void czytaj_dane_z_rs232( char * mybuf ); ale nic to nie zmieniło, coś pomieszałem z typami danych w funkcji strtok_r.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lip 2012, o 15:54 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No to po kolei, widzisz - teraz jak podałeś komunikat pełny z konsoli to od razu wiadomo o co chodzi ;)

użyłeś pan funkcji strtok_r() ..... a dodać odpowiedni plik nagłówkowy w którym ona się znajduje to co ???? amba zjadła ? ;)

Kod:
#include <string.h>


i problem znika ;)

to teraz dalej ;)

------------------------ [ Dodano po: 19 minutach ]

rezasurmar napisał(a):
Parsowanie po przecinku działa ;), ale jak rozpoznać teraz przez brak znaku CR, te dwie dane w ramce oddzielone znakiem CR?


Aleś ty się uczepił tego CR ;) ..... eeeeh jak jeszcze raz usłyszę, że powiesz o CR - to umawiamy się, że odetnę koledze język ;) ..... (żarto oczywiście)

rezasurmar napisał(a):
Na wyświetlaczu rozdziela je na dwie linie
przy wykorzystaniu tej funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W tym momencie rozumiem, tylko sens użycia if i zmiennej cnt, która to rozdziela daną z mybuf, na dwie linie. Ale nie rozumiem, w jaki sposób funkcja lcd_str wie że jest nowa linia, przecież wywołując uart_puts(mybuf); nie dostajemy znaku nowej linii?


Wytłumacz mi proszę - skąd u licha bierze się tu w twoich rozważaniach nagle ten uart_puts(mybuf) bo tego KOMPLETNIE nie rozumiem ? czyżbyś chciał sobie znowu coś utrudnić na siłę ?

Ale tłumacząc początek tego pytania - to funkcja lcd_str() NIC NIE WIE. A co ona ma wiedzieć ? ona dostaje tylko rozkaz coś wyświetlić więc nic nie wie. Zastanów się lepiej dlaczego dwa razy oddzielnie wywołuje się twoja funkcja

czytaj_dane_z_rs232( char * mybuf )

????? .... takie pytanie powinieneś sobie zadać. No dobra zakładamy że je zadałeś to ja odpowiadam. Po kolei:

urządzenie wysyła ramkę

-010,024[CR]045,456[CR][LF]

biblioteka UART odbiera kolejno znaki i NAGLE !!!!!!!!!!!! dostrzega pierwszy znak CR !!!!!!!!!!!!

w tym momencie uznaje że dotarła PIERWSZA LINIA do bufora cyklicznego i zwiększa zmienną mówiącą o siedzących liniach w buforze na potrzeby zdarzenia EVENT() i jednocześnie ignoruje ten znak CR ... no ale to nie koniec bo przecież ciurkiem nadlatują kolejne dane tej całej ramki z urządzenia prawda ??? czyli 045,456[CR][LF] ...

No i co? znowu biblioteka dochodzi do znaku CR .... czyli kolejna nowa linia !!!! zwiększa zmienną ilości linii odebranych w buforze cyklicznym!!!!!! i jednocześnie ignoruje znak [CR] - dalej wczytuje - patrzy a tu znak [LF] no to też go ignoruje.

i to wszystko co zrobiła biblioteka w przerwaniach obsługując bufory cykliczne, jednocześnie dała CYNK dla funkcji zdarzenia UART_EVENT() że w końcu pojawiły się upragnione dane !!!!!!! hurrraaaaa

no i teraz sobie wyobraź, że odbywa się kolejny przebieg pętli głównej while(1) .... i wykonuje się zdarzenie UART_EVENT, ono pięknie sprawdza licznik linii odebranych w buforze cyklicznym i co ???? bierze pierwszą linię i jeśli wcześniej zarejestrowałeś swoją funkcję

czytaj_dane_z_rs232()

to ją wywołuje przekazując jako argument CO ?????? UWAGA!!!!! tą pierwszą linię panie kochany - czyli

-010,024

dzięki temu - ta funkcja wywołuje się PIERWSZY raz i dzięki zmiennej cnt wyświetla ją na pierwszej linii LCD, wychodzi program z funkcji, wraca do zdarzenia, zdarzenie się kończy i pętla główna while(1) biegnie dalej - w tym czasie na LCD nie ma jeszcze NIC, drugiej linii !!!!!!! musisz to sobie wyobrazić - wejść do matrixa bo to się dzieje tak szybko

no i w końcu nadchodzi drugi obieg pętli while(1) ... znowu wykonuje się zdarzenie UART_EVENT() i CO?????????

nadal widać że jeszcze jedna linia siedzi w buforze cyklicznym, więc co dalej ????? ponownie grzecznie wywołuje twoją funkcję do parsowania danych, i w argumencie mybuf przekazuje ci grzecznie, drugą część ramki:

045,456

bez żadnych tam nikomu nie potrzebnych CRLF'ów ;) .... a durna funkcja lcd_str() dzięki locate() i cnt wyświetla ją grzecznie w drugiej linii LCD

a że dzieje się ten odbiór dwóch linii strasznie szybko to tobie - śmiertelnikowi wydaje się że to się od razu wyświetliło na LCD ;)

czyli teraz masz w pierwszym wywołaniu swojej funkcji do podziału na kawałki tylko

-010,024

więc pomyśl - użyjesz teraz tego znowu - czyli strtok_r() i podzielisz to dalej na tokeny

tak samo w drugim wywołaniu tej funkcji podzielisz na tokeny

045,456

czy teraz jaśniej na razie ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lip 2012, o 13:12 

Pomógł: 0

Widzisz Mirku i w końcu to zrozumiałem, bo nie bardzo umiałem pojąć co się dzieje z tymi liniami ;). Pewnie jak bym opanował puszczanie programu po kroku to bym szybciej zajarzył, to o czym mówisz.

Chwilowo dotarłem do następującego etapu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Chwilowo obsługa cyfr LED jest wrzucona do funkcji czytaj_dane_z_rs232, jak ładnie można zauważyć udało się podzielić dane przed i za przecinkiem, dokładnie jak pisałeś, przez strtok_r, oraz "poszukałem" w mojej biblioteczce spisu funkcji biblioteki string, znalazłem fajną funkcję strcspn, która zwraca miejsce występowania danego znaku.
Dzięki temu zrobię na switch, rozdzielanie zależnie od tego w którym miejscu wystąpi przecinek.

Jedynie z czym mam jeszcze problem, to zmienna ilość początkowych danych, tj. usuwanie zbędnego zera już w samych danych lecących z rs232. Z -01,230 zostanie mi -1,230 czyli po sparsowaniu pierwszy człon będzie -1, czyli jak by namiesza mi to trochę bo już nie moge się odwołać w ten sposób
cy1=kg[0]-0x30;
cy2=kg[1]-0x30;
cy3=kg[2]-0x30;
bo "tablica" kg będzie miała tylko dwie zmienne.
Chyba, że wykorzystam jeszcze funkcje kg_roz = sizeof (kg)/sizeof(char*); ale nie do końca mi to chce działać ;).

Abstrahując chwilowo od zmiennej ilości zer na początku. Wydaje mi się, że wrzucenie do funkcji czytaj_dane_z_rs232 whila z case sprawdzającym miejsce przecinka i rozdzielenie na podfunkcje poszczególnych "zakresów" zależnych od miejsca występowania przecinka da mi uniwersalność samego programu, bo praktycznie twoje biblioteki obsługi RSa, LEDów pozostają prawie bez zmian (ledy musiałem przerobić, bo mam wyświetlacze z wspólną anodą no i jest ich 6, a nie 4).

Masz może jakiegoś pomysła, albo koncept w jaki sposób dobrać się do tej zmiennej ilości danych w "tablicy" kg??. Bo wygaszać zera znaczące przy danych np. -01,230 001,422 001,32 muszę sam, ale wykorzystując stary sposób z wygaszaniem zer za pomocą if, rozjeżdżać będzie mi się w przypadku gdy dostanę dane -1,230 1,422 1,32 po RSie.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lip 2012, o 13:58 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No widzisz - i NAJWAŻNIEJSZE w tym wszystkim było zaskoczenie i załapanie o co chodzi z tą funkcją do parsowania i jak działają ZDARZENIA .... chyba sam przyznasz - że to było MEGA NAJWAŻNIEJSZE. I przyznasz chyba że to jest rewelacyjne w użyciu ;) teraz hmmm mówię o idei twojej własnej funkcji ;) wywoływanej ze zdarzenia. Wszystko daje radę ładnie powiązać - sam widzisz idzie jak po sznurku.

Posłuchaj - takie rzeczy mogę tłumaczyć bo to milion razy trudniej zrozumień czy dojść samemu jak się jest początkującym w tej dziedzinie niż takie tam jakieś PIKUSIOWE problemy związane z usuwaniem ilości zer nieznaczących - bo to już TYLKO zwykłe operacje na tablicach.

Owszem zdaję sobie sprawę, że to dla ciebie teraz problem ale musisz zacząć rozróżniać wagi tych problemów jeśli chcesz się szybko dalej uczyć programować. Dlatego, że do zrozumienia działania wielowątkowości rzeczywiście czasem trzeba dostać kopa w postaci dobrej podpowiedzi o co tu chodzi

ale jeśli chodzi o podstawy - tak podstawy - bo działania na tablicach to podstawy - niestety trzeba już tu samemu ćwiczyć i ćwiczyć ..... Ja teraz już poczułbym się jakbym miał pisać cały kod za ciebie mówiąc tak trochę żartem oczywiście ;)

dlatego to pozostawiłbym już ci teraz jako zadanie domowe ;)

albo ......

wiesz ... na forum użytkownicy sami proszą o dział RYBNY. Czyli zadajesz pytanie a niech spróbują chętni je rozwiązać dla ciebie - jeśli będą chętni. Ja tam będę to obserwował (zresztą pewnie nie tylko ja) ... i w razie czego naprowadzimy na właściwy tor - ale dzięki temu będziesz i ty zadowolony i ci, którzy mogą sobie poćwiczyć na prawdziwym przykładzie zadowoleni ;)

Zaraz normalnie chyba założę ten DZIAŁ RYBNY na forum ;) wiesz chyba o co chodzi ? byłeś przy tej dyskusji ? ;)

------------------------ [ Dodano po: 4 minutach ]

O! już jest - DZIAŁ RYBNY ;)

forum30.html

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 48 ]  Przejdź na stronę Poprzednia strona  1, 2

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO