<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=977&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-07-11T14:04:00+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=977&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-11T13:58:03+01:00</updated>
<published>2012-07-11T13:58:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9558#p9558</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9558#p9558"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9558#p9558"><![CDATA[
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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> teraz hmmm mówię o idei twojej własnej funkcji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> wywoływanej ze zdarzenia. Wszystko daje radę ładnie powiązać - sam widzisz idzie jak po sznurku.<br /><br />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.<br /><br />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<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />dlatego to pozostawiłbym już ci teraz jako zadanie domowe <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />albo ......<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Zaraz normalnie chyba założę ten DZIAŁ RYBNY na forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> wiesz chyba o co chodzi ? byłeś przy tej dyskusji ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br />O! już jest - DZIAŁ RYBNY <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/forum30.html" >forum30.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 lip 2012, o 13:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-11T13:12:10+01:00</updated>
<published>2012-07-11T13:12:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9554#p9554</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9554#p9554"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9554#p9554"><![CDATA[
Widzisz Mirku i w końcu to zrozumiałem, bo nie bardzo umiałem pojąć co się dzieje z tymi liniami <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Pewnie jak bym opanował puszczanie programu po kroku to bym szybciej zajarzył, to o czym mówisz.<br /><br />Chwilowo dotarłem do następującego etapu<br />[syntax=c]<br />void czytaj_dane_z_rs232( char * mybuf ) {<br /><br />            static uint8_t cnt = 0;<br />            uint8_t pozp=0;<br />            char *kg = 0;<br />            char *g;<br />        lcd_locate(cnt,0);<br /><br />       if ( cnt == 0){<br />       pozp = strcspn (mybuf,&quot;,&quot;);<br />       kg = strtok_r(mybuf,&quot;,&quot;,&amp;g);<br /><br />       cy1=kg[0]-0x30;<br />       cy2=kg[1]-0x30;<br />       cy3=kg[2]-0x30;<br />       cy4=g[0]-0x30;<br />       cy5=g[1]-0x30;<br />       cy6=g[2]-0x30;<br />       uart_puts(kg);<br />       uart_puts(g);<br />        }<br />        cnt++;<br />        lcd_int(pozp);<br />        if( cnt &gt; 1 ) {<br />        cnt=0;<br />        }<br /><br />    }<br />[/syntax]<br /><br />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 &quot;poszukałem&quot; w mojej biblioteczce spisu funkcji biblioteki string, znalazłem fajną funkcję strcspn, która zwraca miejsce występowania danego znaku.<br />Dzięki temu zrobię na switch, rozdzielanie zależnie od tego w którym miejscu wystąpi przecinek.<br /><br />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<br />cy1=kg[0]-0x30;<br />cy2=kg[1]-0x30;<br />cy3=kg[2]-0x30;<br />bo &quot;tablica&quot; kg będzie miała tylko dwie zmienne.<br />Chyba, że wykorzystam jeszcze funkcje kg_roz = sizeof (kg)/sizeof(char*); ale nie do końca mi to chce działać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />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 &quot;zakresów&quot; 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).<br /><br />Masz może jakiegoś pomysła, albo koncept w jaki sposób dobrać się do tej zmiennej ilości danych w &quot;tablicy&quot; 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.<p>Statystyki: Napisane przez Gość — 11 lip 2012, o 13:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-10T15:54:17+01:00</updated>
<published>2012-07-10T15:54:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9505#p9505</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9505#p9505"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9505#p9505"><![CDATA[
No to po kolei, widzisz - teraz jak podałeś komunikat pełny z konsoli to od razu wiadomo o co chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />użyłeś pan funkcji strtok_r() ..... a dodać odpowiedni plik nagłówkowy w którym ona się znajduje to co ???? amba zjadła ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">#include &lt;string.h&gt;</div><br /><br />i problem znika <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />to teraz dalej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br /><div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Parsowanie po przecinku działa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, ale jak rozpoznać teraz przez brak znaku CR, te dwie dane w ramce oddzielone znakiem CR?<br /></div><br /><br />Aleś ty się uczepił tego CR <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ..... eeeeh jak jeszcze raz usłyszę, że powiesz o CR - to umawiamy się, że odetnę koledze język <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ..... (żarto oczywiście)<br /><br /><div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Na wyświetlaczu rozdziela je na dwie linie <br />przy wykorzystaniu tej funkcji<br />[syntax=c]<br />void czytaj_dane_z_rs232( char * mybuf ) {<br />     <br />            static uint8_t cnt;<br />     <br />        lcd_locate(cnt,0);<br />        lcd_str(&quot;                &quot;);<br />        lcd_locate(cnt++,0);<br />        lcd_str( mybuf );<br />     <br />        if( cnt &gt; 1 ) cnt=0;<br />    }<br />[/syntax]<br />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?<br /></div><br /><br />Wytłumacz mi proszę - skąd u licha bierze się tu w twoich rozważaniach nagle ten <strong><span style="color: #0040FF"><span style="font-size: 150%; line-height: normal">uart_puts(mybuf)</span></span></strong> bo tego KOMPLETNIE nie rozumiem ? czyżbyś chciał sobie znowu coś utrudnić na siłę ?<br /><br />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<br /><br />czytaj_dane_z_rs232( char * mybuf )<br /><br />????? .... takie pytanie powinieneś sobie zadać. No dobra zakładamy że je zadałeś to ja odpowiadam. Po kolei:<br /><br />urządzenie wysyła ramkę<br /><br />-010,024[CR]045,456[CR][LF]<br /><br />biblioteka UART odbiera kolejno znaki i NAGLE !!!!!!!!!!!! dostrzega pierwszy znak CR !!!!!!!!!!!!<br /><br />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] ...<br /><br />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.<br /><br />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<br /><br />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ę <br /><br />czytaj_dane_z_rs232()<br /><br />to ją wywołuje przekazując jako argument CO ?????? UWAGA!!!!! tą pierwszą linię panie kochany - czyli <br /><br /><strong><span style="font-size: 200%; line-height: normal"><span style="color: #0040FF">-010,024</span></span></strong><br /><br />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<br /><br />no i w końcu nadchodzi drugi obieg pętli while(1) ... znowu wykonuje się zdarzenie UART_EVENT() i CO?????????<br /><br />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:<br /><br /><strong><span style="font-size: 200%; line-height: normal"><span style="color: #0040FF">045,456</span></span></strong><br /><br />bez żadnych tam nikomu nie potrzebnych CRLF'ów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... a durna funkcja lcd_str() dzięki locate() i cnt wyświetla ją grzecznie w drugiej linii LCD<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />czyli teraz masz w pierwszym wywołaniu swojej funkcji do podziału na kawałki tylko <br /><br /><strong><span style="font-size: 200%; line-height: normal"><span style="color: #0040FF">-010,024</span></span></strong><br /><br />więc pomyśl - użyjesz teraz tego znowu - czyli strtok_r() i podzielisz to dalej na tokeny <br /><br />tak samo w drugim wywołaniu tej funkcji podzielisz na tokeny<br /><br /><strong><span style="font-size: 200%; line-height: normal"><span style="color: #0040FF">045,456</span></span></strong><br /><br />czy teraz jaśniej na razie ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 lip 2012, o 15:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-10T12:15:00+01:00</updated>
<published>2012-07-10T12:15:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9497#p9497</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9497#p9497"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9497#p9497"><![CDATA[
Ok wklejam cały kod<br />[syntax=c]<br />/*<br /> * main.c<br /> *<br /> *  Created on: 2012-04-05<br /> *      Author: sylwq<br /> */<br /><br />//#define F_CLK 11059200 Zdefiniowano w opcjach projektu, by kazdy plik .c mial dostep do F_CPU<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;d_led.h&quot; //dołączenie pliku nagłówkowego (obsługa LED)<br />#include &quot;rs232.h&quot; //dołączenie pliku nagłówkowego (obsługa RS232)<br />#include &quot;hd44780.h&quot; // Tylko celem testów RSa<br />#include &lt;avr/pgmspace.h&gt;<br /><br /><br />//definicje i deklaracje zmiennych globalnych<br /><br />extern volatile uint8_t CR;<br />extern volatile uint8_t LF;<br />extern volatile uint8_t nodata;<br />extern volatile uint8_t ascii_line;<br />volatile char *wsk_znak, *mybuf;<br />char znak[18];<br />uint8_t d1,d2,d3,d4,d5,d6,przecinek;<br />char bufor[17];// bufor na potrzeby odebranych danych z UART<br /><br />int main(void) {<br /><br />//******* Inicjacja ********<br /><br />USART_Init( __UBRR );// inicjacja USART<br />// rejestracja własnej funkcji do analizowania danych odebranych przez UART<br /><br /><br />sei();// Włączenie globalnej obsługi przerywań<br />d_led_init();// inicjacja wyświetlacza LED multiplekserowego<br />lcd_init();// inicjacja wyświetlacza LCD Tylko celem testów RSa<br />lcd_cls();<br />//*****************  pętla główna<br />register_uart_str_rx_event_callback( czytaj_dane_z_rs232 );<br />while(1)<br />{<br />UART_RX_STR_EVENT(bufor);// zdarzenie odbiorcze UART<br /><br />} // koniec pętli głównej programu<br /><br />} // koniec main<br /><br />void czytaj_dane_z_rs232( char * mybuf ) {<br />lcd_cls();<br />lcd_locate(0,0);<br />        char *kg_wsk;<br />        char *g_wsk;<br />        kg_wsk = strtok_r(mybuf, &quot;,&quot;, &amp;g_wsk);<br />        lcd_str(kg_wsk);<br />        lcd_locate(1,0);<br />        lcd_str(g_wsk);<br />    }<br /><br />[/syntax]<br /><br />DescriptionResourcePathLocationType<br />assignment makes pointer from integer without a castmain.c/LargeLed_v2line 57C/C++ Problem<br />implicit declaration of function 'strtok_r'main.c/LargeLed_v2line 57C/C++ Problem<br /><br /><br />PS.<br />Parsowanie po przecinku działa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, ale jak rozpoznać teraz przez brak znaku CR, te dwie dane w ramce oddzielone znakiem CR?<br />Na wyświetlaczu rozdziela je na dwie linie <br />przy wykorzystaniu tej funkcji<br />[syntax=c]<br />void czytaj_dane_z_rs232( char * mybuf ) {<br />     <br />            static uint8_t cnt;<br />     <br />        lcd_locate(cnt,0);<br />        lcd_str(&quot;                &quot;);<br />        lcd_locate(cnt++,0);<br />        lcd_str( mybuf );<br />     <br />        if( cnt &gt; 1 ) cnt=0;<br />    }<br />[/syntax]<br />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?<br />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?<br />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ę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />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.<p>Statystyki: Napisane przez Gość — 10 lip 2012, o 12:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-10T09:45:04+01:00</updated>
<published>2012-07-10T09:45:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9494#p9494</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9494#p9494"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9494#p9494"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />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.<br /></div><br /><br />To nie jest ciekawe <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> tylko normalne zjawisko i wcale nie należy uważać, że warningów nie ma skoro znikają po drugiej kompilacji. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 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 &quot;Kompiluj&quot; to mówi kompilatorowi w niewybredny sposób coś takiego mniej więcej: <br /><br />&quot;teee kompilator przestań już pyszczyć, nie chcę nic słyszeć o warningach, ja jestem pewien że wszystko jest OK&quot;<br /><br />no i kompilator dlatego grzecznie już za drugim razem ich nie pokazuje, TYLKO DLATEGO <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Dlatego na drugi raz nawet się nie zastanawiaj dlaczego warningi znikają po drugiej kompilacji.<br /><br /><div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />i dokładnie w tej linijce<br />masa_wsk = strtok_r(mybuf, &quot;,&quot;, &amp;tara_wsk);<br /></div><br /><br />Tak nieraz widzę, że kolega uparcie wszystko po swojemu a nie tak jak poproszę - ale ok, dłużej to potrwa ale damy radę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 lip 2012, o 09:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-10T07:29:09+01:00</updated>
<published>2012-07-10T07:29:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9491#p9491</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9491#p9491"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9491#p9491"><![CDATA[
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.<br /><br />i dokładnie w tej linijce<br />masa_wsk = strtok_r(mybuf, &quot;,&quot;, &amp;tara_wsk);<p>Statystyki: Napisane przez Gość — 10 lip 2012, o 07:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-09T15:07:15+01:00</updated>
<published>2012-07-09T15:07:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9451#p9451</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9451#p9451"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9451#p9451"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />[syntax=c]<br />void czytaj_dane_z_rs232( char * mybuf ) {<br /><br />        char *masa_wsk;<br />        char *tara_wsk;<br />        masa_wsk = strtok_r(mybuf, &quot;,&quot;, &amp;tara_wsk);<br /><br />    }<br />[/syntax]<br /><br />Wywala warning <br />assignment makes pointer from integer without a cast<br />implicit declaration of function 'strtok_r'.<br /></div><br /><br />ale tu nie ma żadnego warninga, wkleiłem na żywca to do siebie i skompilowałem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zero problemu - pokaż dokładnie komunikat z konsoli z numerami linii - może to dotyczy czegoś innego a nie tej linii<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />już chyba zaczynasz to CZUĆ <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ??? co ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2012, o 15:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-09T15:00:25+01:00</updated>
<published>2012-07-09T15:00:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9449#p9449</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9449#p9449"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9449#p9449"><![CDATA[
Ok, najwyżej brakujące rozmowy przeniosę potem na forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Możesz mi tylko odpowiedzieć na jedno nurtujące mnie pytanie.<br />Prubuję wydzielić dane wykorzystując przecinek jako token, <br />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?<br /><br />[syntax=c]<br />void czytaj_dane_z_rs232( char * mybuf ) {<br />lcd_locate(0,0);<br />        char *masa_wsk;<br />        char *tara_wsk;<br />        masa_wsk = strtok_r(mybuf, &quot;,&quot;, &amp;tara_wsk);<br />        lcd_str(masa_wsk);<br />        lcd_locate(1,0);<br />        lcd_str(tara_wsk);<br />    }<br />[/syntax]<br /><br />Wywala warning <br />assignment makes pointer from integer without a cast<br />implicit declaration of function 'strtok_r'<br /><br />czyli jednak coś źle jest z tymi wskaźnikami, jak wykorzystałem przykład z książki, tj. zadeklarowałem tab[]=&quot;napis, testowy&quot;<br />i zamiast mybuf wrzuciłem tab, to ładnie mi rozdzieliło na &quot;napis&quot; i &quot;testowy&quot;<br /><br />PS.<br />To będzie chyba najlepsza droga do parsowania tych danych, bo wtedy nie zależy nic od długości zmiennych. <br />tj. dostanę 4 sparsowane zmienne, czyli wartość przed przecinkiem i po przecinku dla obydwu danych <br />jak to już ładniej rozrysowałeś wcześniej.<br /><br />P1=-01 ** P2=230<br />P3=000 ** P4=45<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />:):), w tym przypadku przecinek bedzie zapalony na miejscu cyfry 3 od lewej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 9 lip 2012, o 15:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-09T13:56:01+01:00</updated>
<published>2012-07-09T13:56:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9443#p9443</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9443#p9443"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9443#p9443"><![CDATA[
Olśni olśni cię - już ci podesłałem parę słów na PRIV <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo atakujesz mnie na wszystkie strony - ale to dobrze <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2012, o 13:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-11T14:04:00+01:00</updated>
<published>2012-07-09T13:51:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9441#p9441</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9441#p9441"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9441#p9441"><![CDATA[
Pozwalam sobie wrzucić PW od Mirka by temat nie stracił na spójności.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Witam,<br /><br />nie zanudziłeś ale najbardziej podobają mi się twoje oceny że np<br /><br />Cytuj:<br />&quot;to jest dobry sposób ten co pokazałeś ale on nadaje się tylko na LCD a nie na wyświetlacz LED&quot;<br /><br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 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ś <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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<br /><br />i super<br /><br />zatem wartość<br /><br />-01,230<br /><br />co tu widzimy znaki ASCII <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> kody ASCII<br /><br />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<br /><br />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<br /><br />więc załóżmy że mamy<br /><br />01,230<br /><br />i siedzi to w mybuf[] <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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 ????<br /><br />ano dla każdej cyfry mieliśmy pięknie zmienne:<br /><br />cy1, cy2, cy3, cy4<br /><br />teraz poszerzysz to o cy5<br /><br />no i wpisanie tej ramki do wyświetlacza LED sprowadzi się UWAGA w uproszczeniu do:<br /><br />cy1 = mybuf[0] - '0';<br />cy2 = mybuf[1] - '0';<br />cy3 = mybuf[2] - '0';<br />cy4 = mybuf[3] - '0';<br />cy5 = mybuf[4] - '0';<br /><br />to WSIO <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />teraz tylko ew sprawdzać czy pierwszy bajt bufora to np znak minus<br /><br />if( mybuf[0] = '-' ) to coś tam<br /><br />albo czy na początku jest zero nieznaczące<br /><br />if( mybuf[0] = '0' ) to nie wyświetlaj<br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />i co ???? potrzeba jakichś tam CRLF'ów ?<br /><br />Pozdr Mirek<br /></div><br /><br />OK, to sobie to teraz wszystko na spokojnie przetrawię, to i z pw.<br />Mam nadzieję, że teraz mnie olśni <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. 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.<br /><br />Teraz tylko wszystko rozbija się o odpowiednie wykrycie przecinka. Oraz końca pierwszej linii.<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 9 lip 2012, o 13:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-09T12:53:52+01:00</updated>
<published>2012-07-09T12:53:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9430#p9430</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9430#p9430"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9430#p9430"><![CDATA[
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ę.....<br /><br />OK <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> skoro masz już ładny podział to zostało dosłownie niewiele żeby to porozbijać dalej na kawałki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> rozłupać jak ci się żywnie spodoba <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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<br /><br />Teraz już pozostaje to tylko sparsować. Jak ???? no najpierw warto zaczytać jeszcze i tu odeślę cię na chwilkę do książki <br /><br />koniecznie poczytaj proszę uważnie tekst od ostatniego akapitu na dole strony nr: 423 <br /><br />bardzo cię proszę - tam jest pokazane KROK po KROCZKU jak można dokonywać parsowania stringów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> takich które zawierają TOKENY .... co to są tokeny ???<br /><br />TOKEN1,TOKEN2,TOKEN3<br /><br />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<br /><br />a zatem w twojej ramce<br /><br />-010,0043<br /><br />widzimy dwa tokeny jeden to tekst<br /><br />-010<br /><br />a drugi to tekst<br /><br />0043<br /><br />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()<br /><br />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<br /><br />po prostu trzeba sobie podzielić rozwiązywanie takiego zadania na kilka prostszych etapów, potem dopiero będziesz to robił jednym ciurkiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2012, o 12:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-09T10:49:22+01:00</updated>
<published>2012-07-09T10:49:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9422#p9422</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9422#p9422"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9422#p9422"><![CDATA[
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.<br />Czyli widzę coś takiego<br />do pierwszego CRa<br />0003.00<br />do drugiego CRa<br />0000.00<br /><br />czyli przylatuje 30 30 30 32 2C 30 30 CR 30 30 30 30 2C 30 30 CR LF<br /><br />wylatuje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 30 30 30 32 2C 30 30 30 30 30 30 2C 30 30, czyli zjada (prawidłowo) znaki poniżej znaków drukowalnych<br /><br /><br />Hmmmm. Teraz tylko muszę pomyśleć, jak to przełożyć na wyświetlanie na LEDach,<br /><br />Dziękuje ci Mirku, odpisuje dopiero teraz, bo weekend miałem bardziej rodzinny <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i odpuściłem sobie siedzenie przy kompie.<br /><br />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.<br /><br />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ą <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 9 lip 2012, o 10:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-06T13:33:18+01:00</updated>
<published>2012-07-06T13:33:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9174#p9174</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9174#p9174"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9174#p9174"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Dokładnie tak<br /><br />bajt01 - [-]<br />bajt02 - [0]<br />bajt03 - [1]<br />bajt04 - [,]<br />bajt05 - [2]<br />bajt06 - [3]<br />bajt07 - [0]<br />bajt08 - [$0d]<br />bajt09 - [0]<br />bajt10 - [0]<br />bajt11 - [0]<br />bajt12 - [,]<br />bajt13 - [4]<br />bajt14 - [5]<br />bajt15 - [$0d]<br />bajt16 - [$0A]<br /></div><br /><br />No to mam już byka za rogi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i teraz wiem dlaczego piszesz, że program zjada ci początek ramki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> czyli że niby nie odbiera tego co zaczyna się od -1....<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]void czytaj_dane_z_rs232( char * mybuf ) {<br /><br />static uint8_t cnt;<br /><br />    lcd_locate(cnt,0);<br />    lcd_str(&quot;                &quot;);<br />    lcd_locate(cnt++,0);<br />    lcd_str( mybuf );<br /><br />    if( cnt &gt; 1 ) cnt=0;<br />}[/syntax]<br /><br />i powiedz mi co teraz widzisz ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Naturalnie kolejnym krokiem może być w tej samej funkcji piękne sparsowanie danych i np taki wynik na wyświetlaczu:<br /><br />P1=-01 ** P2=230<br />P3=000 ** P4=45<br /><br />Oczywiście te P1, P2 to tak tylko poglądowo dałem żeby było widać że każdy Parametr jest wyświetlony oddzielnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />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()<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 lip 2012, o 13:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-06T13:16:00+01:00</updated>
<published>2012-07-06T13:16:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9173#p9173</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9173#p9173"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9173#p9173"><![CDATA[
Dokładnie tak<br /><br />bajt01 - [-]<br />bajt02 - [0]<br />bajt03 - [1]<br />bajt04 - [,]<br />bajt05 - [2]<br />bajt06 - [3]<br />bajt07 - [0]<br />bajt08 - [$0d]<br />bajt09 - [0]<br />bajt10 - [0]<br />bajt11 - [0]<br />bajt12 - [,]<br />bajt13 - [4]<br />bajt14 - [5]<br />bajt15 - [$0d]<br />bajt16 - [$0A]<br /><br />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.<br /><br />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.<p>Statystyki: Napisane przez Gość — 6 lip 2012, o 13:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-06T12:35:20+01:00</updated>
<published>2012-07-06T12:35:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9172#p9172</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9172#p9172"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9172#p9172"><![CDATA[
Ale poczekaj bo ja nadal nie rozumiem - i wytłumacz mi to proszę - to potem ja tobie coś powiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />jak masz napisaną tą ramkę:<br /><br />-01,230$0d000,450$0d$0A<br /><br />to czy $0d oznacza JEDEN bajt czy oznacza TRZY bajty ???? to dla mnie bardzo ważne a pewnie i dla ciebie też <br /><br />tak samo $0A to JEDEN bajt czy TRZY bajty w tej ramce<br /><br />może zapytam inaczej, czy ramka wygląda tak: ?<br /><br />bajt01 - [-]<br />bajt02 - [0]<br />bajt03 - [1]<br />bajt04 - [,]<br />bajt05 - [2]<br />bajt06 - [3]<br />bajt07 - [0]       <br />bajt08 - [<strong><span style="color: #FF0000">$0d</span></strong>]<br />bajt09 - [0]<br />bajt10 - [0]<br />bajt11 - [0]<br />bajt12 - [,]<br />bajt13 - [4]<br />bajt14 - [5]<br />bajt15 - [<strong><span style="color: #FF0000">$0d</span></strong>]<br />bajt16 - [<strong><span style="color: #FF0000">$0A</span></strong>]<br /><br />czy tak: ?????<br /><br />bajt01 - [-]<br />bajt02 - [0]<br />bajt03 - [1]<br />bajt04 - [,]<br />bajt05 - [2]<br />bajt06 - [3]<br />bajt07 - [0]      <br />bajt08 - [<strong><span style="color: #FF0000">$</span></strong>]<br />bajt09 - [<strong><span style="color: #FF0000">0</span></strong>]<br />bajt10 - [<strong><span style="color: #FF0000">d</span></strong>]<br />bajt11 - [0]<br />bajt12 - [0]<br />bajt13 - [0]<br />bajt14 - [,]<br />bajt15 - [4]<br />bajt16 - [5]<br />bajt17 - [<strong><span style="color: #FF0000">$</span></strong>]<br />bajt18 - [<strong><span style="color: #FF0000">0</span></strong>]<br />bajt19 - [<strong><span style="color: #FF0000">d</span></strong>]<br />bajt20 - [<strong><span style="color: #FF0000">$</span></strong>]<br />bajt21 - [<strong><span style="color: #FF0000">0</span></strong>]<br />bajt22 - [<strong><span style="color: #FF0000">A</span></strong>]<br /><br /><br />czekam na odpowiedź<br /><br />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 ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 lip 2012, o 12:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-09T11:15:14+01:00</updated>
<published>2012-07-06T12:10:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9171#p9171</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9171#p9171"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9171#p9171"><![CDATA[
Ok, fakt, przyznaję się bez bicia, chociaż należało by przywalić, pomyliłem 0 z zero '0'<br /><br />Teraz, zmieniłem na oryginalnie z case (czyli tak jak w książce i L21)<br /><br />wysyłam dokładnie to -01,230$0d000,450$0d$0A (przekopiowane, nie przepisane, O zmienione na zero)<br /><br />na wyjściu uarta dostaje 2D 30 31 2C 32 33 30 30 30 30 2C 34 35 30 <br />na wyświetlaczu oczywiście <br />odebrano:<br />000,450 <br /><br />[syntax=c]<br />void czytaj_dane_z_rs232( char * mybuf ) {<br />lcd_cls();<br />            lcd_locate(0,0);<br />            lcd_str( &quot;odebrano: &quot; );<br />            lcd_locate(1,0);<br />            lcd_str( mybuf );<br />            uart_puts(mybuf);<br />}<br />[/syntax]<br /><br />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ę<br />-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 &quot;nowszych&quot; 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.<br />Cały czas mam problem, z właściwą interpretacją tych danych, jak wcześniej wklejałem Mirku kod swojego programu na ifach <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, 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.<br />Przez co interpretacja danych w moim wcześniejszym programie wygląda jak wygląda <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Chyba jedyną dobrze opanowaną komendą jest if...then <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />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.<br />Czyli jeżeli dana kończy się CR, to ją zostawiamy, jeżeli kończy się CRLF to ją odrzucamy.<br /><br />czyli coś jak w poprzednim programie<br /><br />[syntax=c]if(LF)<br />{<br />   while((*wsk_znak=uart_getc()) != 0x0a)<br />   {<br />     if(*wsk_znak == 0x0d &amp;&amp; *(wsk_znak+1) == 0x0a) break;<br />       uart_putc(*wsk_znak); // wysyłaj na wyjscie to co na wejsciu<br />      wsk_znak++;<br />lcd_char(*wsk_znak); // testowo do debugowania<br />   }<br /><br />uart_puts(&quot;\r\n&quot;); // dozuc do wyjscia znak nowej lini i powrot karetki<br />LF--;<br />}<br />wsk_znak=&amp;znak[0];<br />[/syntax]<p>Statystyki: Napisane przez Gość — 6 lip 2012, o 12:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-06T11:49:09+01:00</updated>
<published>2012-07-06T11:49:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9170#p9170</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9170#p9170"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9170#p9170"><![CDATA[
Ale nie za bardzo wiem co ty teraz piszesz i przerabiasz z tym:<br /><br />if(data == 10){<br />ascii_line++;<br />}<br /><br />przecież znaki LF są ignorowane już wewnątrz biblioteki - nie ma ich <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale ja już czuję coś - jaką ty mistyfikację popełniasz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> tzn tak mi się tylko wydaje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />piszesz że odbierasz wciąż taką ramkę:<br /><br />-01,230$0d000,450$Od$0A<br /><br />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ś<br /><br />nie mniej jednak powiedz mi panie kochany - bo może tu masz MEGA NAJWIĘKSZY kłopot <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ?????<br /><br />czy w tej ramce na końcu przylatują ci znaki ASCII\<br /><br />$0d$0A<br /><br />czy tak sobie tylko wpisałeś a na końcu tej ramki są po prostu pojedyncze bajty o wartościach 13 i 10 ??????????<br /><br />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 <br /><br />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<br /><br />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ę) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> dlatego dawaj pan ten zrzut ekranu<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/54_c3e80131d0139024828bb78c3683447a.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/54_c3e80131d0139024828bb78c3683447a.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 lip 2012, o 11:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-06T11:12:04+01:00</updated>
<published>2012-07-06T11:12:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9169#p9169</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9169#p9169"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9169#p9169"><![CDATA[
Ok, wysyła mi to co dostaje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, 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.<br />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.<br /><br />Próbowałem zastąpić wersję z switch(data).....<br />wersją  <br />if(data == 10){<br />    ascii_line++;<br />    }<br />to dostaję na zmianę, raz daną do pierwszego CR, raz do drugiego, a raz 0.<br /><br /><br />PS. Dziękuje Mirku za cierpliwość, jeszcze nie &quot;kumam&quot; za bardzo tych eventów, traktuje je bardziej jak czarne skrzynki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 6 lip 2012, o 11:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-06T10:27:09+01:00</updated>
<published>2012-07-06T10:27:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9167#p9167</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9167#p9167"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9167#p9167"><![CDATA[
No ok ja rozumiem, że funkcja parse_uart_data() może być na razie niezrozumiała. Ale zastanawiam się dlaczego uparcie próbujesz wciąż w tej pętli głównej while(1) wyświetlać 300 tys razy na sekundę zawartość mybuf skoro tam nawet nic się nie pojawi. Pomijam już oczywiste sprawy jak inicjalizacje itp ale czemu nie zrobisz tego tak?<br /><br /><br />[syntax=c]register_uart_str_rx_event_callback( czytaj_dane_z_rs232 );<br /><br />while(1) {<br />    UART_RX_STR_EVENT(bufor); <br />}<br /><br /><br />void czytaj_dane_z_rs232( char * mybuf ) {<br />                        lcd_cls();<br />                        lcd_locate(0,0);<br />                        lcd_str( &quot;odebrano: &quot; );<br />                        lcd_locate(1,0);<br />                        lcd_str( mybuf );<br />                        }[/syntax]<br /><br />sam zobacz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... wtedy jak tłumaczyłem wyżej w pętli głównej działa tylko obsługa zdarzenia tak? Wyobraź sobie że ta funkcja EVENT może być wykonywana bez obaw milion razy na sekundę ponieważ ona w ogóle nie blokuje działania pętli głównej i dzięki temu możesz tam dokładać jeszcze inny kod.<br /><br />No ale jak nadleci coś z RS232 czyli cała linia danych, to ten EVENT sam wywoła tą twoją funkcję. Czyli wykona się ona TYLKO i WYŁĄCZNIE wtedy gdy coś nadleci rozumiesz? a przy okazji dostajesz wskaźnik do bufora <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Po co zatem mnożyć te bufory albo wywoływać na darmo cały czas to wyświetlanie na LCD? Po to masz właśnie tą swoją funkcję do obsługi RS232 - i dzięki temu od razu możesz to co nadleciało analizować albo ot tak jak chcesz wysłać na LCD. Ale to wykona się tylko raz - wtedy kiedy trzeba - teraz troszkę jaśniej ? Jak nie to śmiało pytaj dalej bez żadnego zażenowania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 lip 2012, o 10:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-06T09:30:28+01:00</updated>
<published>2012-07-06T09:30:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9161#p9161</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9161#p9161"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9161#p9161"><![CDATA[
Próbuję właśnie coś spłodzić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, ale nie bardzo jeszcze wiem, jak się dobrać do UART_RX_STR_EVENT(bufor)<br /><br />[syntax=c]//#define F_CLK 11059200 Zdefiniowano w opcjach projektu, by kazdy plik .c mial dostep do F_CPU<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;d_led.h&quot; //dołączenie pliku nagłówkowego (obsługa LED)<br />#include &quot;rs232.h&quot; //dołączenie pliku nagłówkowego (obsługa RS232)<br />#include &quot;hd44780.h&quot; // Tylko celem testów RSa<br />#include &lt;avr/pgmspace.h&gt;<br /><br /><br />//definicje i deklaracje zmiennych globalnych<br /><br />extern volatile uint8_t CR;<br />extern volatile uint8_t LF;<br />extern volatile uint8_t nodata;<br />extern volatile uint8_t ascii_line;<br />volatile char *wsk_znak;<br />char znak[18];<br />uint8_t d1,d2,d3,d4,d5,d6,przecinek;<br />char bufor[64];// bufor na potrzeby odebranych danych z UART<br /><br />int main(void) {<br /><br />//******* Inicjacja ********<br /><br />USART_Init( __UBRR );// inicjacja USART<br /><br />sei();// Włączenie globalnej obsługi przerywań<br />//d_led_init();// inicjacja wyświetlacza LED multiplekserowego<br />lcd_init();// inicjacja wyświetlacza LCD Tylko celem testów RSa<br /><br />//*****************  pętla główna<br />lcd_cls();<br /><br />while(1)<br />{<br />lcd_home();<br />lcd_str(&quot;test&quot;);                                  // by cokolwiek sie wyswietliło<br />UART_RX_STR_EVENT(bufor);// zdarzenie odbiorcze UART<br /><br />lcd_str(bufor);                                 //na wyswietlacz nic nie wysyła ;(<br />if(strlen(bufor)){                       // bez warunku, terminal jest zasypywany FF<br />uart_putc(bufor); // wysyłaj na wyjscie to co na wejsciu<br />lcd_str(&quot; bufor&quot;);<br />}<br /><br /><br /><br />} // koniec pętli głównej programu<br /><br />} // koniec main<br />[/syntax]<br /><br />Połączenie są napewno sprawne, wgrywam inny program (który działa, tj. wyświetla i na LCD i na LED masę itp). Nie wiem, czy trzeba w głównym pliku dopisać register_uart_str_rx_event_callback( czytaj_dane_z_rs232 ); bo rozumiem, że tego brakuje, ale jak odczytać te dane, używając UART_RX_STR_EVENT(bufor), <br />bufor jak widać jest zadeklarowany jako tablica 64bajtowa;<br />Funkcja parse_uart_data(char * pBuf), jest dla mnie niezrozumiała jak to przełożyć na obsługę czytaj dane z rs232.<br /><br />Po przeanalizowaniu Mirku tego co napisałeś kolejny raz wyszło mi coś takiego<br /><br />[syntax=c]//#define F_CLK 11059200 Zdefiniowano w opcjach projektu, by kazdy plik .c mial dostep do F_CPU<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;d_led.h&quot; //dołączenie pliku nagłówkowego (obsługa LED)<br />#include &quot;rs232.h&quot; //dołączenie pliku nagłówkowego (obsługa RS232)<br />#include &quot;hd44780.h&quot; // Tylko celem testów RSa<br />#include &lt;avr/pgmspace.h&gt;<br /><br /><br />//definicje i deklaracje zmiennych globalnych<br /><br />extern volatile uint8_t CR;<br />extern volatile uint8_t LF;<br />extern volatile uint8_t nodata;<br />extern volatile uint8_t ascii_line;<br />volatile char *wsk_znak, *mybuf;<br />char znak[18];<br />uint8_t d1,d2,d3,d4,d5,d6,przecinek;<br />char bufor[64];// bufor na potrzeby odebranych danych z UART<br /><br />int main(void) {<br /><br />//******* Inicjacja ********<br /><br />USART_Init( __UBRR );// inicjacja USART<br />// rejestracja własnej funkcji do analizowania danych odebranych przez UART<br />register_uart_str_rx_event_callback( czytaj_dane_z_rs232 );<br /><br />sei();// Włączenie globalnej obsługi przerywań<br />//d_led_init();// inicjacja wyświetlacza LED multiplekserowego<br />lcd_init();// inicjacja wyświetlacza LCD Tylko celem testów RSa<br />lcd_cls();<br />//*****************  pętla główna<br /><br />while(1)<br />{<br />lcd_home();<br />lcd_str(&quot;test&quot;);<br />UART_RX_STR_EVENT(bufor);// zdarzenie odbiorcze UART<br />lcd_str(mybuf);<br />} // koniec pętli głównej programu<br /><br />} // koniec main<br /><br />void czytaj_dane_z_rs232( char * mybuf ) {<br />mybuf=bufor;<br />}<br />[/syntax]<br /><br />Nadal nie działa, ale wiem, że coś robię źle w funkcji czytaj_dane_z_rs232.<br /><br />Wrzucam jeszcze działającego main, stara wersja która nie jest odporna na błędy, oraz na dane o zmiennej szerokości<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2012-04-05<br /> *      Author: sylwq<br /> */<br /><br />//#define F_CLK 11059200 Zdefiniowano w opcjach projektu, by kazdy plik .c mial dostep do F_CPU<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;d_led.h&quot; //dołączenie pliku nagłówkowego (obsługa LED)<br />#include &quot;rs232.h&quot; //dołączenie pliku nagłówkowego (obsługa RS232)<br />#include &quot;hd44780.h&quot; // Tylko celem testów RSa<br />#include &lt;avr/pgmspace.h&gt;<br /><br /><br />//definicje i deklaracje zmiennych globalnych<br /><br />extern volatile uint8_t CR;<br />extern volatile uint8_t LF;<br />extern volatile uint8_t nodata;<br />volatile char *wsk_znak;<br />char znak[18], bufor[18];<br />uint8_t d1,d2,d3,d4,d5,d6,przecinek;<br /><br />int main(void) {<br /><br />//******* Inicjacja ********<br /><br />USART_Init( __UBRR );// inicjacja USART<br />sei();// Włączenie globalnej obsługi przerywań<br />d_led_init();// inicjacja wyświetlacza LED multiplekserowego<br />lcd_init();// inicjacja wyświetlacza LCD Tylko celem testów RSa<br />wsk_znak=&amp;znak[0];// Ustawienie wskaźnika na pierwszy element tablicy<br /><br />//test();<br /><br />//*****************  pętla główna<br />/*while(!(uart_getc())){<br />no_data();<br />}<br />*/<br /><br />while(1)<br />{<br /><br /><br />lcd_home();<br /><br />if(LF)<br />                    {<br />                         while((*wsk_znak=uart_getc()) != 0x0d)<br />                        {<br />                         if(*wsk_znak == 0x0d &amp;&amp; *(wsk_znak+1) == 0x34) break;<br />                         uart_putc(*wsk_znak); // wysyłaj na wyjscie to co na wejsciu<br />                        wsk_znak++;<br />                        lcd_char(*wsk_znak);<br />                        }<br /><br />                        uart_puts(&quot;\r\n&quot;); // dozuc do wyjscia znak nowej lini i powrot karetki<br />                        LF--;<br />                     }<br />wsk_znak=&amp;znak[0];<br /><br />if (znak[5] == 'O' &amp;&amp; znak[6] == 'F'){<br />cy1=11;cy2=11;cy2=11;cy3=11;cy4=11;<br />d5=19;d6=14;<br />cy5=d5;<br />cy6=d6;<br />}<br />if (znak[5] == 'U' &amp;&amp; znak[6] == 'F'){<br />cy1=11;cy2=11;cy2=11;cy3=11;cy4=11;<br />d5=16;d6=14;<br />cy5=d5;<br />cy6=d6;<br />}<br />// czwarty element tablicy czyli znak[3] jest przecinkiem albo kropką dla 00,000<br />if ((znak[3] == 0x2c) || (znak[3] == 0x2e)){<br />d1=znak[0];<br />d2=znak[1];<br />d3=znak[2];<br />d3+=0x14;// dodaj kropke do znaku CY3<br />d4=znak[4];<br />d5=znak[5];<br />d6=znak[6];<br /><br />if(znak[0] == '-')//osługa znaku '-'<br />cy1=d1-0x0f;<br />else if(znak[0] == '0')// wyłączanie zbędnego zera<br />cy1=11;// jeżeli '0' wyłącz wyswietlacz<br />if(znak[1] == '0')<br />cy2=11;<br />else cy2=d2-0x30;<br />cy3=d3-0x30;// -0x30 offset dla róznicy miedzy tablica ascii a tablica<br />// definicji znakow dla LED<br />cy4=d4-0x30;<br />cy5=d5-0x30;<br />cy6=d6-0x30;<br />}<br />// piąty element tablicy czyli znak[4] jest przecinkiem albo kropką dla 000,00<br />if ((znak[4] == 0x2c) || (znak[4] == 0x2e)){<br />d1=znak[0];<br />d2=znak[1];<br />d3=znak[2];<br />d4=znak[3]+0x14;//cy4=znak[3]-0x1c;  co to wogóle jest;)<br />d5=znak[5];<br />d6=znak[6];<br />if(znak[0] == '-')//osługa znaku '-'<br />cy1=d1-0x0f;<br />else if(znak[0] == '0')<br />cy1=11;<br />if(znak[1] == '0')<br />cy2=11;<br />else cy2=d2-0x30;<br />if(znak[2] == '0' &amp;&amp; znak[1] == '0')<br />cy3=11;<br />else cy3=d3-0x30;<br /><br />cy4=d4-0x30;<br />cy5=d5-0x30;<br />cy6=d6-0x30;<br />}<br />// szósty element tablicy czyli znak[5] jest przecinkiem albo kropką dla 0000,0<br />if ((znak[5] == 0x2c) || (znak[5] == 0x2e)){<br />d1=znak[0];<br />d2=znak[1];<br />d3=znak[2];<br />d4=znak[3];<br />d5=znak[4]+0x14;// przecineczek<br />d6=znak[6];<br />if(znak[0] == '-')//osługa znaku '-'<br />cy1=d1-0x0f;<br />else if(znak[0] == '0')<br />cy1=11;<br />if(znak[1] == '0')<br />cy2=11;<br />else cy2=d2-0x30;<br />if(znak[2] == '0' &amp;&amp; znak[1] == '0')<br />cy3=11;<br />else cy3=d3-0x30;<br />if (znak[3] == '0' &amp;&amp; znak[2] == '0' &amp;&amp; znak[1] == '0')<br />cy4=11;<br />else cy4=d4-0x30;<br />cy5=d5-0x30;<br />cy6=d6-0x30;<br />}<br />if( !((znak[3] == '.' || znak[3] == ',') || (znak[4] == '.' || znak[4] == ',') || (znak[5] == '.' || znak[5] == ',')<br />|| (znak[5] == 'O' &amp;&amp; znak[6] == 'F') || (znak[5] == 'U' &amp;&amp; znak[6] == 'F'))){<br />d1=znak[0];<br />d2=znak[2];<br />d3=znak[3];<br />d4=znak[4];<br />d5=znak[5];<br />d6=znak[6];<br />if(znak[0] == '-')//osługa znaku '-'<br />cy1=d1-0x0f;<br />else if(znak[0] == '0')<br />cy1=11;<br />if(znak[2] == '0')<br />cy2=11;<br />else cy2=d2-0x30;<br />if(znak[3] == '0' &amp;&amp; znak[2] == '0' &amp;&amp; znak[1] == '0')<br />cy3=11;<br />else cy3=d3-0x30;<br />if (znak[4] == '0' &amp;&amp; znak[3] == '0' &amp;&amp; znak[2] == '0' &amp;&amp; znak[1] == '0')<br />cy4=11;<br />else cy4=d4-0x30;<br />if (znak[5] == '0' &amp;&amp; znak[4] == '0' &amp;&amp; znak[3] == '0' &amp;&amp; znak[2] == '0')<br />cy5=11;<br />else cy5=d5-0x30;<br />cy6=d6-0x30;<br />}<br />} // koniec pętli głównej programu<br /><br />} // koniec main<br />[/syntax] Może łatwiej będzie zrozumieć zamysł.  Działająca wersja, jest sprzężona z &quot;starymi&quot; bibliotekami obsługi rs-a, z niewielką zmianą, dołożone są dwie flagi LF i CR. Zapalane jak przychodzą dane.<p>Statystyki: Napisane przez Gość — 6 lip 2012, o 09:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-05T15:10:52+01:00</updated>
<published>2012-07-05T15:10:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9127#p9127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9127#p9127"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9127#p9127"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Spróbuję coś dziś wieczorem sklecić, na razie z zdarzeń jestem totalnie zielony, a i z samego C nie błyszczę mądrością.<br />Wielkie dzięki za wytłumaczenie, mam jeszcze problem z zrozumieniem wielu rzeczy.<br /></div><br /><br />Z jednej strony jestem twoim dłużnikiem za tą minifalę, z drugiej strony jesteś na właściwym forum, więc jak coś nieteges - to molestuj mnie programistycznie na maxa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> z chęcią podpowiem<br /><br />a dodam, że bardzo mi zależy na tym, żeby przybliżyć wszystkim te callbacki<br /><br />więc jeśli się wywiąże jakiś fajny temat na forum z pytaniami i odpowiedziami to wielu ludzi skorzysta <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 lip 2012, o 15:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-05T14:32:45+01:00</updated>
<published>2012-07-05T14:32:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9125#p9125</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9125#p9125"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9125#p9125"><![CDATA[
Spróbuję coś dziś wieczorem sklecić, na razie z zdarzeń jestem totalnie zielony, a i z samego C nie błyszczę mądrością.<br />Wielkie dzięki za wytłumaczenie, mam jeszcze problem z zrozumieniem wielu rzeczy.<p>Statystyki: Napisane przez Gość — 5 lip 2012, o 14:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-05T14:08:10+01:00</updated>
<published>2012-07-05T14:08:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9124#p9124</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9124#p9124"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9124#p9124"><![CDATA[
No ale tak - sama funkcja uart_get_str() działa tak, że :<br /><br />1. wywołujesz ją z argumentem, w którym podajesz wskaźnik do buforka do którego chcesz wczytać odebraną linię przez RS232<br /><br />2. jako rezultat funkcji dostajesz ten sam wskaźnik - czyli na początek bufora i już siedzi w nim cała linijka<br /><br />czyli odpal sobie terminal w windows<br /><br />napisz jakiś tekst np: testuje sobie rs232 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />i kliknij KLAWISZ - ENTER<br /><br />w tym momencie możesz w pętli głównej wciąż wywoływać tą funkcję - ona przecież sprawdza czy pojawiła się nowa linia w buforze <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... więc jeśli nie to przelatuje jak woda przez maszynkę do mięsa ..... a jeśli się pojawiła linia, bo klepnąłeś ENTER w terminalu to od razu masz tekścik w buforze<br /><br />no dobra ale pewnie zapytasz - a jak sprawdzać czy coś w końcu przyszło czy nie?<br /><br />[syntax=c]if( strlen( uart_get_str( buf ) ) {<br />  // i tu już możemy być pewni i szczęśliwi że złapaliśmy odebraną linię<br />}[/syntax]<br /><br />tak mi się zdaje .... bo hmmm aż szkoda nie wykorzystywać zdarzenia <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />przecież aby wykorzystać zdarzenie wystarczy tylko:<br /><br />1. napisać jakąś własną funkcyjkę która będzie obrabiać to co przyleci, linia po linii np:<br /><br />[syntax=c]void czytaj_dane_z_rs232( char * mybuf ) {<br /><br />}[/syntax]<br /><br />sam ją sobie piszesz i nikt ci nie narzuca co w niej ma być - czy to nie wygodne ?<br /><br />2. no tak tylko teraz musisz powiedzieć tej bibliotece: hej - dzieńdobry pani biblioteko, czy mogę zarejestrować u ciebie moją własną funkcję, i jak przyjdzie do mnie jakaś przesyłka to proszę ją wywołać OK ? będę wdzięczny. A pani biblioteka mówi - nie ma sprawy, wypełnij pan tylko kartę rejestracyjną - bo przecież mogę mieć kilku takich natrętnych klientów jak pan, poniżej karta rejestacyjna do biblioteki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> czyli funkcja:<br /><br />[syntax=c]// rejestracja własnej funkcji do analizowania danych odebranych przez UART<br />register_uart_str_rx_event_callback( czytaj_dane_z_rs232 );<br />[/syntax]<br /><br />czy to trudne narazie albo niezrozumiałe ? jak coś to pytaj <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />3. ty sobie idziesz dalej i piszesz swój program jak ci się żywnie podoba, tylko dostajesz od pani bibliotekarki ZDARZENIE, oraz prostą instrukcję obsługi. Oto ona:<br /><br />- wstaw pan sobie do swojej pętli głównej nasze narzędzie o tak:<br /><br />[syntax=c]<br />while(1) {<br />    UART_RX_STR_EVENT(bufor);// zdarzenie odbiorcze UART<br />    // tutaj dalsza część twojego programu w pętli głównej <br />}<br />[/syntax]<br /><br />- i teraz - jak tylko pani bibliotekarka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> dzięki temu narzędziu ZDARZENIU zobaczy że jest dla ciebie przesyłka, to sama WYWOŁA funkcję, którą wcześniej zarejestrowałeś w bibliotece <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />4. czyli program w pętli głównej sobie lata jak wariat - ty masz tylko raz na obieg pętli wywoływać EVENT, a jak coś to przepięknie wywołana zostanie &quot;do tablicy&quot; twoja funkcja, a w niej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... już masz pewność, że w zmiennej przekazanej jako argument siedzi tekst który nadleciał w linijce <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />czyż to nie piękne ???? i teraz możesz go bach np na lcd<br /><br />[syntax=c]lcd_locate(0,0);<br />lcd_str( mybuf );[/syntax]<br /><br />- czy teraz chociaż troszkę się rozjaśniło ? popróbuj tego - a jak coś to dopytaj bo to na prawdę super mechanizmy. Jak raz użyjesz to potem nie puścisz - ja ci mówię - to trochę tak jak ja miałem z tym grotem &quot;minifala&quot; - tak własnie jest z callbackami i zdarzeniami w C <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 lip 2012, o 14:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-07-05T13:31:20+01:00</updated>
<published>2012-07-05T13:31:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9123#p9123</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9123#p9123"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=9123#p9123"><![CDATA[
Problemów ciąg dalszy.<br />Próbowałem, a przynajmniej tak mi się wydaje skorzystać z funkcji mirka <br />char * uart_get_str(char * buf)<br /><br />Ale przyznaje się bez bicia, za cholerę nie wiem jak się do tego dobrać<br />Z tekstu w książce zrozumiałem, że ona powinna pobrać całą &quot;ramkę&quot; aż do znaku LF, czyli trzeba by to wrzucić do jakiejś tablicy tak?<br />Tylko albo z winy wrodzonej głupoty, albo 31C u mnie w warsztacie, nie potrafię za bardzo wymyśleć jak to zrobić.<br />Próbowałem rozgryźć to przeglądając obsługę eventów w ostatnim programie UART ascii AT, ale nie potrafię dojść do jakichkolwiek wniosków <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<br /><br />Niestety wykorzystania callback w ogóle nie biorę pod uwagę, bo tego to już całkiem nie rozumiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 5 lip 2012, o 13:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-04-30T22:18:29+01:00</updated>
<published>2012-04-30T22:18:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=977&amp;p=6036#p6036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=6036#p6036"/>
<title type="html"><![CDATA[Re: Problem z RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=977&amp;p=6036#p6036"><![CDATA[
Niestety zmiana ramki, jest ograniczona, wysyła je gotowe urządzenie i za wielu modyfikacji samej ramki nie można zrobić.<br />Teoretycznie sprzętowe CRC, oraz kontrola czy faktycznie napłynęło 17bajtów z 0x0d, 0x0a na końcu może być jakimś rozwiązaniem sprawdzania poprawności nadchodzących danych.<p>Statystyki: Napisane przez Gość — 30 kwi 2012, o 22:18</p><hr />
]]></content>
</entry>
</feed>