<?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=6432&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-03-21T17:41:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6432&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-21T17:41:49+01:00</updated>
<published>2014-03-21T17:41:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75156#p75156</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75156#p75156"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75156#p75156"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Ok, już zauważyłem swój błąd. Powinno być:<br />data = (char *)(&amp;(buf[UDP_DATA_P]));<br /><br />Niby drobiazg, a mocno skomplikował życie<br /></div><br /><br />No dokładnie - dlatego podglądanie bufora doprowadza po sznureczku gdzie w końcu leży błąd <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> — 21 mar 2014, o 17:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-03-21T16:25:20+01:00</updated>
<published>2014-03-21T16:25:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75144#p75144</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75144#p75144"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75144#p75144"><![CDATA[
Ok, muszę tylko poszukać przelotki RS232 &lt;--&gt; UART, bo nie pamiętam w którym pudełku leży. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />W międzyczasie ponumerowałem jeszcze wystąpienia samego ciągu \r\n i okazuje się, że za każdym razem, bez względu na to co wyślę (może to być zarówno dowolna komenda, jak i nonsensowny ciąg znaków) odzywa się ta linijka:<br /><br />[syntax=c]if( 0 == pBuf&#91;0&#93; )  strcpy_P(pAnswer, PSTR(&quot;\r\n&quot;))[/syntax]<br /><br />Wygląda na to, że masz rację i faktycznie funkcja otrzymuje złe dane do parsowania. Zupełnie jakby za każdym razem otrzymywała adres pamięci, pod którym zawsze znajduje się zero. Dzieje się tak nawet wtedy, gdy wyślę ciąg z komendą zawierającą znak '?' albo '='.<br /><br />Dlatego jeszcze przed podłączeniem kabelka chciałbym zapytać, czy faktycznie przekazuję właściwy adres do początku danych UDP:<br /><br />[syntax=c]data = (char *)UDP_DATA_P;[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 11 minutach ]</span></strong><br /><br />Ok, już zauważyłem swój błąd. Powinno być:<br />data = (char *)(&amp;(buf[UDP_DATA_P]));<br /><br />Niby drobiazg, a mocno skomplikował życie. <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=2174">Atlantis</a> — 21 mar 2014, o 16:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-21T15:52:42+01:00</updated>
<published>2014-03-21T15:52:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75138#p75138</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75138#p75138"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75138#p75138"><![CDATA[
A ok ... to ja w takim razie jak coś czekam na info co masz w buforze gdy zaczynasz parsowanie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... gdy ja testuję sobie parsowanie czegokolwiek a na początku takie dziwne rzeczy mi się dzieją - to dla mnie jest podstawą zobaczyć na własne oczy co wpada do parsowania. Co tu dużo mówić - od razu widać czy np coś nie jest źle przekazywane wcześniej ... No trzeba to niestety takimi etapami sobie sprawdzać. Tzn tak mi się wydaje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 mar 2014, o 15:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-03-21T15:48:57+01:00</updated>
<published>2014-03-21T15:48:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75137#p75137</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75137#p75137"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75137#p75137"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />i piszesz, że tu jest zero dodane na końcu ? gdzie ? ... wg ciebie &quot;\0&quot; to jest zero czy jak ? ... pytam bo być może przylatują ci po prostu dwa kody ASCII, jeden znaku ukośnika a drugi zera - rozumiesz ? bo gdzieś tam w smartfonie wcale ci się to nie zamieniło na 0 .....<br /></div><br /><br />Tak, oczywiście rozumiem różnicę. Nie, nie wysyłam dwóch znaków ASCII, ale jeden znak końca łańcucha. Packet Sender daje zresztą podgląd hex tego, co się wysyła i na końcu leci 0x00, odpowiadające temu \0. To samo widzę w WireSharku. Packet Sendera w wersji pod Windowsa też zdążyłem już wypróbować. <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=2174">Atlantis</a> — 21 mar 2014, o 15:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-21T15:37:43+01:00</updated>
<published>2014-03-21T15:37:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75136#p75136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75136#p75136"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75136#p75136"><![CDATA[
<div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />To pewnie zrobię w następnej kolejności.<br /></div><br /><br />A ja bym od tego zaczął bo to od razu dałoby mi odpowiedź - dlaczego nie dochodzi do porównania nadsyłanej komendy.<br /><br />I tu uściślę .... bo napisałeś:<br /><br /><div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />&quot;ATI\0&quot; to treść wysyłana pakietem UDP<br /></div><br /><br />i piszesz, że tu jest zero dodane na końcu ? gdzie ? ... wg ciebie &quot;\0&quot; to jest zero czy jak ? ... pytam bo być może przylatują ci po prostu dwa kody ASCII, jeden znaku ukośnika a drugi zera - rozumiesz ? bo gdzieś tam w smartfonie wcale ci się to nie zamieniło na 0 .....<br /><br />Zresztą taki zapis &quot;AT&quot; w C oznacza że mamy do czynienia z C-Stringiem czyli łańcuchem w tym przypadku trzy-elementowym, gdzie dwa pierwsze elementy to AT a ostatni to zero ...<br /><br />Reasumując - jeszcze raz powtórzę - to prosta czynność jeśli masz jakiś LCD pod ręką - zastawić sobie pułapkę programową i dać wprost<br /><br />[syntax=c]lcd_cls();<br />lcd_str( bufor );<br />while(1);[/syntax]<br />i masz od razu pozamiatane - tzn widzisz co przyszło - a jeśli nie masz LCD to wysyłasz na UART do terminala .... i masz sprawę jak na dłoni co? gdzie? i jak leci<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 mar 2014, o 15:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-03-21T15:11:49+01:00</updated>
<published>2014-03-21T15:11:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75134#p75134</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75134#p75134"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75134#p75134"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />No i dowiedzieliśmy się o rzekomym błędzie w książce a tymczasem po jego poprawieniu kod ci nie działa a ten z książki działa ... Nie sądzisz jednak że coś jest nie tak ? Nie mówię tego złośliwie broń Boże, ale z kolei może warto czasem zapytać ? dopytać ? zamiast stwierdzać ?<br /></div><br /><br />Racja. Użyłem zbyt mocnego słowa, przepraszam. To nie błąd, ale jednak może nieco mylić. Dlatego zmieniłem.<br />Nie zmienia to faktu, że moja zmiana nie ma nic wspólnego z opisywanym problemem. Wcześniej też nie działało.<br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Co to za stringi &quot;AT\0&quot; albo &quot;ATI\0&quot; ? to na pewno nie są te stringi:<br /></div><br /><br />&quot;ATI\0&quot; to treść wysyłana pakietem UDP. Zero dodane na wszelki wypadek, nie powinno robić tutaj żadnej różnicy, bo przecież jest to symbol oznaczający koniec łańcucha tekstowego. Próbowałem też wysyłać bez niego. Nie ma żadnej różnicy.<br />Skontrolowałem też WireSharkiem co dokładnie jest wysyłane i odbierane. Wygląda na to, że wszystko się zgadza. Nic nie zostaje poszatkowane na kilka pakietów, w części pakietu &quot;data&quot; znajduje się ciąg o odpowiedniej treści i długości, zakończony znakiem \0.<br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Poza tym skoro wciąż wyskakuje ERROR to co za problem wyświetlić sobie na LCD albo przesłać na terminal zawartość odebranego bufora żeby prześledzić (ręcznie zdebugować) co dotarło do procka ? Myślę że po tej operacji szybko by kolega doszedł dlaczego nie ma reakcji na jakiś tam string &quot;AT\0&quot;<br /></div><br /><br />To pewnie zrobię w następnej kolejności. W tej chwili ponumerowałem jeszcze poszczególne &quot;ERROR-y&quot; występujące w kodzie, żeby dowiedzieć się, który z nich zostaje wywołany. Wychodzi na to, że za każdym razem odzywa się ostatni:<br /><br />[syntax=c]if( AT_CNT == i )  strcpy_P(pAnswer, PSTR(&quot;ERROR3\r\n&quot;));[/syntax]<br /><br />Tak, jakby kod nie rozpoznawał komendy i po przejściu do końca tabeli zgłaszał błąd.<br />Przychodzi mi do głowy jeszcze taka możliwość, że może do funkcji parsującej wysyłany jest nieprawidłowy adres początku danych w przetwarzanym pakiecie UDP.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 24 minutach ]</span></strong><br /><br />Wygląda na to, że chyba faktycznie przepisując kod przez pomyłkę wpisałem złą stałą określającą początek danych. Teraz poprawiłem i jest zmiana, ale nie do końca wszystko działa jak powinno. Za każdym razem otrzymuję ciąg &quot;\r\n&quot;. Muszę jeszcze poszukać przyczyny...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 21 mar 2014, o 15:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-21T14:42:51+01:00</updated>
<published>2014-03-21T14:42:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75127#p75127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75127#p75127"/>
<title type="html"><![CDATA[Re: Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75127#p75127"><![CDATA[
<div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />Przy okazji zauważyłem także drobny błąd w bibliotece - oryginalnie deklaracja tabeli w pliku &quot;komendy_at.h&quot; wyglądała następująco:<br />....<br />Nazwa &quot;at_service&quot; dublowała się z nazwą funkcji obsługującej komendę &quot;AT&quot;, poprawiłem to przez zmianę na &quot;at_function&quot;.<br /></div><br /><br />No i dowiedzieliśmy się o rzekomym błędzie w książce a tymczasem po jego poprawieniu kod ci nie działa a ten z książki działa ... Nie sądzisz jednak że coś jest nie tak ? Nie mówię tego złośliwie broń Boże, ale z kolei może warto czasem zapytać ? dopytać ? zamiast stwierdzać ?<br /><br />Nazwy te z punktu widzenia kompilacji nie są żadnym błędem ... bo to tak jakbyś chciał udowadniać że np nazwy argumentów formalnych i aktualnych funkcji MUSZĄ być różne, a nie muszą. Owszem dla kogoś może to stanowić jakiś problem odnośnie wizji całości - wtedy można sobie zmienić - przykłady w książce to TYLKO przykłady - przykłady dydaktyczne. <br /><br /><div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />To tyle gadania. Przechodzę do rzeczy.<br /></div><br />racja ...<br /><br /><div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />ale przecież coś takiego jak &quot;AT\0&quot; albo &quot;ATI\0&quot; powinno dać odpowiedź<br /></div><br /><br />a skąd taki pomysł ? Może jednak nie do końca kolega zrozumiał albo przeczytał jednak ten rozdział ?<br /><br />Co to za stringi &quot;AT\0&quot; albo &quot;ATI\0&quot; ? to na pewno nie są te stringi:<br /><br />[syntax=c]{&quot;AT&quot;,                  at_service},<br />                {&quot;ATI&quot;,                 ati_service},[/syntax]<br /><br />Poza tym skoro wciąż wyskakuje ERROR to co za problem wyświetlić sobie na LCD albo przesłać na terminal zawartość odebranego bufora żeby prześledzić (ręcznie zdebugować) co dotarło do procka ? Myślę że po tej operacji szybko by kolega doszedł dlaczego nie ma reakcji na jakiś tam string &quot;AT\0&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 mar 2014, o 14:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-03-21T14:05:28+01:00</updated>
<published>2014-03-21T14:05:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75123#p75123</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75123#p75123"/>
<title type="html"><![CDATA[Parsowanie komend AT z pakietów UDP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6432&amp;p=75123#p75123"><![CDATA[
Pracuję obecnie nad prostym systemem automatyki domowej (zapalanie i gaszenie świateł za pośrednictwem sieci LAN).<br />Do testów wykorzystuję autorską płytkę z ATmegą328 i układem ENC28J60. Obsługą stosu TCP/IP zajmuje się biblioteka z tuxgraphics.org. Do prasowania komend AT wykorzystuję zmodyfikowaną na swoje potrzeby bibliotekę z płytki dołączonej do zielonej książki. Kod poniżej:<br /><br /><br />komendy_at.h<br />[syntax=c]#ifndef KOMENDY_AT_H_<br />#define KOMENDY_AT_H_<br /><br />//Definicje wyjść i wejść<br />#define LED1 0<br />#define PORTLED1 PORTB<br />#define DDRLED1 DDRB<br /><br />// definicja typu strukturalnego<br />typedef struct {<br />char polecenie_at&#91;8&#93;;<br />int8_t (* at_function)(uint8_t inout, char * params, char * pAnswer);<br />} TATCMD;<br /><br /><br />// deklaracje zmiennych zewnętrznych<br />extern const TATCMD polecenia_at&#91;&#93; PROGMEM;<br /><br /><br />// deklaracje funkcji<br />void parse_data( char * pBuf, char * pAnswer );<br /><br />int8_t at_service(uint8_t inout, char * params, char * pAnswer);<br />int8_t ati_service(uint8_t inout, char * params, char * pAnswer);<br />int8_t at_lamp_service(uint8_t inout, char * params, char * pAnswer);<br /><br />#endif /* KOMENDY_AT_H_ */[/syntax]<br /><br />komendy_at.c<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;komendy_at.h&quot;<br /><br />#define AT_CNT 3// iloć poleceń AT<br /><br />//----------- tablica z poleceniami AT i wskaźnikami funkcji do ich obsługi --------------------<br />const TATCMD polecenia_at&#91;AT_CNT&#93; PROGMEM = {<br /> // { at_cmd } ,{ wskaźnik do funkcji obsługi at },<br />{&quot;AT&quot;, at_service},<br />{&quot;ATI&quot;, ati_service},<br />{&quot;AT+LAMP&quot;, at_lamp_service},<br />};<br /><br /><br /><br />//----------------- funkcja do analizowania danych odebranych z UART ------------------------------<br />void parse_data( char * pBuf, char * pAnswer ) {<br /><br />int8_t (*_at_srv)(uint8_t inout, char * data, char * pAnswer);<br /><br />char * cmd_wsk;<br />char * reszta;<br />uint8_t i=0, len;<br /><br />if ( strpbrk(pBuf, &quot;=?&quot;)){<br />// obsługa poleceń AT we/wy + parametry<br /><br />if ( strpbrk(pBuf, &quot;?&quot;)){<br />// zapytania do układu w postaci: AT+CMD?<br /><br />cmd_wsk = strtok_r(pBuf, &quot;?&quot;, &amp;reszta);<br />len = strlen(cmd_wsk);<br />for(i=0;i&lt;AT_CNT;i++) {<br />if ( len &amp;&amp; 0 == strncasecmp_P(cmd_wsk, polecenia_at&#91;i&#93;.polecenie_at, len) ) {<br />if( pgm_read_word(polecenia_at&#91;i&#93;.polecenie_at) ) { // &lt;--- UWAGA! w tekście książki zabrakło pgm_read_word()<br />_at_srv = (void *)pgm_read_word( &amp;polecenia_at&#91;i&#93;.at_function );<br />if( _at_srv) {<br />if( _at_srv( 0, reszta, pAnswer ) &lt; 0 ) strcpy_P(pAnswer, PSTR(&quot;ERROR\r\n&quot;));<br />}<br />}<br /> strcpy_P(pAnswer, PSTR(&quot;\r\n&quot;));<br />break;<br />}<br />}<br /><br />} else {<br />// ustawienia układu w postaci: AT+CMD=parametry<br /><br />cmd_wsk = strtok_r(pBuf, &quot;=&quot;, &amp;reszta);<br />len = strlen(cmd_wsk);<br />for(i=0;i&lt;AT_CNT;i++) {<br />if ( len &amp;&amp; 0 == strncasecmp_P(cmd_wsk, polecenia_at&#91;i&#93;.polecenie_at, len) ) {<br />if( pgm_read_word(polecenia_at&#91;i&#93;.polecenie_at) ) { // &lt;--- UWAGA! w tekście książki zabrakło pgm_read_word()<br />_at_srv = (void *)pgm_read_word( &amp;polecenia_at&#91;i&#93;.at_function );<br />if( _at_srv &amp;&amp; ! _at_srv( 1, reszta, pAnswer ) ) strcpy_P(pAnswer, PSTR(&quot;OK\r\n&quot;));<br />else  strcpy_P(pAnswer, PSTR(&quot;ERROR\r\n&quot;));<br />}<br />break;<br />}<br />}<br />}<br /><br />} else {<br />// obsługa poleceń AT bez parametrów<br /><br />if( 0 == pBuf&#91;0&#93; )  strcpy_P(pAnswer, PSTR(&quot;\r\n&quot;));// reakcja na znak CR lub CRLF z terminala<br />else {<br />for(i=0;i&lt;AT_CNT;i++) {<br />if ( 0 == strncasecmp_P(pBuf, polecenia_at&#91;i&#93;.polecenie_at, strlen(pBuf)) ) {<br />if( pgm_read_word(polecenia_at&#91;i&#93;.polecenie_at) ) { // &lt;--- UWAGA! w tekście książki zabrakło pgm_read_word()<br />_at_srv = (void *)pgm_read_word( &amp;polecenia_at&#91;i&#93;.at_function );<br />if( _at_srv) _at_srv(2,0, pAnswer);<br />}<br />break;<br />}<br />}<br />}<br />}<br /><br />if( AT_CNT == i )  strcpy_P(pAnswer, PSTR(&quot;ERROR\r\n&quot;));<br />}<br /><br /><br /><br />//----------------- obsługa poszczególnych komend AT ----------------------------------<br />int8_t at_service(uint8_t inout, char * params, char * pAnswer) {<br />strcpy_P(pAnswer, PSTR(&quot;OK\r\n&quot;));<br />return 0;<br />}<br /><br />int8_t ati_service(uint8_t inout, char * params, char * pAnswer) {<br />strcpy_P(pAnswer, PSTR(&quot;Sterownik oswietlenia v0.1\r\n&quot;));<br />return 0;<br />}<br /><br /><br />int8_t at_lamp_service(uint8_t inout, char * params, char * pAnswer) {<br /><br />/*if( inout &lt; 2 ) {<br />if( 1 == inout ) {<br />if( params&#91;0&#93; &lt; '0' || params&#91;0&#93; &gt; '1' ) return -1;<br />if( '1' == params&#91;0&#93; ) LED_ON;<br />else LED_OFF;<br />}<br />uart_puts(&quot;+LED: &quot;);<br />if( LED_PIN &amp; LED ) uart_putint(1,10);<br />else uart_putint(0,10);<br />uart_puts(&quot;\r\n&quot;);<br />} else if( 2 == inout ) {<br />uart_puts(&quot;AT+LED = (0-1)\r\n&quot;);<br />}<br />*/<br />PORTLED1 ^= (1&lt;&lt;LED1);<br />return 0;<br />}[/syntax]<br /><br />Główna zmiana polega na dodaniu dodatkowego bufora char * answer, do którego zapisywane są odpowiedzi zwracane przez komendy. Dzięki temu wywołanie funkcji w programie wygląda następująco:<br /><br />[syntax=c]parse_data(data, answer);<br />if (answer&#91;0&#93;) {<br />make_udp_reply_from_request(buf, answer, strlen(answer), myudpport&#91;0&#93;);<br />answer&#91;0&#93; = '\0';[/syntax]<br /><br />Dzięki temu mogę wielokrotnie stosować tę samą funkcję w różnych miejscach programu, do parsowania komend przychodzących z różnych interfejsów i do wysyłania odpowiedzi na odpowiedni interfejs.<br /><br />Przy okazji zauważyłem także drobny błąd w bibliotece - oryginalnie deklaracja tabeli w pliku &quot;komendy_at.h&quot; wyglądała następująco:<br /><br />[syntax=c]typedef struct {<br />char polecenie_at&#91;8&#93;;<br />int8_t (* at_service)(uint8_t inout, char * params, char * pAnswer);<br />} TATCMD;[/syntax]<br /><br />Nazwa &quot;at_service&quot; dublowała się z nazwą funkcji obsługującej komendę &quot;AT&quot;, poprawiłem to przez zmianę na &quot;at_function&quot;.<br /><br />To tyle gadania. Przechodzę do rzeczy. Skompilowałem program, wgrałem go do ATmegi, podłączyłem wszystko do sieci.<br />Do wysyłania pakietów UDP używam androidowego &quot;Packet Sendera&quot;. Pakiety dochodzą, ale za każdym razem, co bym nie wysłał otrzymuję odpowiedź &quot;ERROR\r\n&quot;. Czyli komunikacja działa, ale coś z parsowaniem jest nie tak.<br /><br />W pakiecie próbowałem wysyłać już różne rzeczy, ale przecież coś takiego jak &quot;AT\0&quot; albo &quot;ATI\0&quot; powinno dać odpowiedź, tymczasem ja uzyskuję ten nieszczęsny &quot;ERROR\r\n&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 21 mar 2014, o 14:05</p><hr />
]]></content>
</entry>
</feed>