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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-05T20:24:26+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=6929&amp;mode</id>
<entry>
<author><name><![CDATA[EmCom5]]></name></author>
<updated>2014-05-05T20:24:26+01:00</updated>
<published>2014-05-05T20:24:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=80226#p80226</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=80226#p80226"/>
<title type="html"><![CDATA[Re: L21_UART_ASCII_AT problemy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=80226#p80226"><![CDATA[
Dokonałem modyfikacji procedury Mirka36 (mirekk36), żeby nie łapała skróconych nazw rozkazów wysyłanych przez uarta.<br /><br />Główna zmiana to dodanie kodu<br />[syntax=&quot;c&quot;]len_cmd = strlen_P(polecenia_at[i].polecenie_at);<br />if ( len_buf == len_cmd ){[/syntax]<br />którego zadanie jest porównanie wprowadzonej komendy z wzorcem co do długości.<br />Nawet jeśli komendy są bardzo podobne<br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />i dobrze ale też może być kłopot jeśli będą np dwa takie polecenia<br /><br />AT+LED<br />AT+LEM<br /></div><br /> to i tak wybierze właściwą to którą wprowadzimy.<br /><br />Tutaj kod całej procedury z moimi modyfikacjami,<br />[syntax=&quot;c&quot;]void parse_uart_data( char * pBuf ) {<br /><br />int8_t (*_at_srv)(uint8_t inout, char * data);<br /><br />char * cmd_wsk;<br />char * reszta;<br />uint8_t i=0, len_buf, len_cmd;<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 /><br />// przypisanie dłogości<br />len_buf = strlen(cmd_wsk);<br />for(i=0;i&lt;AT_CNT;i++) {<br />len_cmd = strlen_P(polecenia_at[i].polecenie_at);<br /><br />// porównanie długości buforu z komędą<br />if ( len_buf == len_cmd ){<br />if ( len_buf &amp;&amp; 0 == strncasecmp_P(cmd_wsk, polecenia_at[i].polecenie_at, len_cmd) ) {<br />if( pgm_read_word(polecenia_at[i].polecenie_at) ) { // &lt;--- UWAGA! w tekście książki zabrakło pgm_read_word()<br />_at_srv = (void *)pgm_read_word( &amp;polecenia_at[i].at_service );<br />if( _at_srv) {<br />if( _at_srv( 0, reszta ) &lt; 0 ) {<br /><br />// wyświetla błąd<br />parse_error ( pBuf );<br />}<br />}<br />}<br />uart_puts(&quot;\r\n&quot;);<br />break;<br />}<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_buf = strlen(cmd_wsk);<br />for(i=0;i&lt;AT_CNT;i++) {<br />len_cmd = strlen_P(polecenia_at[i].polecenie_at);<br />if ( len_buf == len_cmd ){<br />if ( len_buf &amp;&amp; 0 == strncasecmp_P(cmd_wsk, polecenia_at[i].polecenie_at, len_cmd) ) {<br />if( pgm_read_word(polecenia_at[i].polecenie_at) ) { // &lt;--- UWAGA! w tekście książki zabrakło pgm_read_word()<br />_at_srv = (void *)pgm_read_word( &amp;polecenia_at[i].at_service );<br />if( _at_srv &amp;&amp; ! _at_srv( 1, reszta ) ) uart_puts(&quot;OK\r\n&quot;);<br />else {<br />parse_error ( pBuf );<br />}<br />}<br />uart_puts(&quot;\r\n&quot;);<br />break;<br />}<br />}<br />}<br />}<br /><br />} else {<br />// obsługa poleceń AT bez parametrów<br /><br />if( 0 == pBuf[0] ) uart_puts(&quot;\r\n&quot;);// reakcja na znak CR lub CRLF z terminala<br />else {<br />len_buf = strlen(pBuf);<br />for(i=0;i&lt;AT_CNT;i++) {<br />len_cmd = strlen_P(polecenia_at[i].polecenie_at);<br />if ( len_buf == len_cmd ){<br />if ( 0 == strncasecmp_P(pBuf, polecenia_at[i].polecenie_at, len_cmd) ) {<br />if( pgm_read_word(polecenia_at[i].polecenie_at) ) { // &lt;--- UWAGA! w tekście książki zabrakło pgm_read_word()<br />_at_srv = (void *)pgm_read_word( &amp;polecenia_at[i].at_service );<br />if( _at_srv) _at_srv(2,0);<br />}<br />break;<br />}<br />}<br />}<br />}<br />}<br /><br />if( AT_CNT == i ){<br />parse_error( pBuf );<br />uart_puts(&quot;\r\n&quot;);<br />}<br />}[/syntax]<br /><br />Z drugiej strony jeśli chodzi o optymalizację w przypadku różne długości komendy to procedura nie będzie spowalniać, lecz nawet będzie szybciej wykonywana. Gdyż na początku sprawdzamy długość komendy i wzorca.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2018">EmCom5</a> — 5 maja 2014, o 20:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[EmCom5]]></name></author>
<updated>2014-04-30T08:31:57+01:00</updated>
<published>2014-04-30T08:31:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79683#p79683</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79683#p79683"/>
<title type="html"><![CDATA[Re: L21_UART_ASCII_AT problemy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79683#p79683"><![CDATA[
Przepraszam kod pochodzi Green Book-a, a nie z Blue Book-a.<br /><br />Chyba troszeczkę już przysypiałem.<br /><br />Jeszcze nie testowałem w przypadku komend z parametrami, ale na to przyjdzie czas po &quot;krótkim&quot; weekendzie majowym.<br /><br />Tak po za tym życzę słonecznego weekendy wszystkim forumowiczom. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2018">EmCom5</a> — 30 kwi 2014, o 08:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-04-29T21:32:58+01:00</updated>
<published>2014-04-29T21:32:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79669#p79669</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79669#p79669"/>
<title type="html"><![CDATA[Re: L21_UART_ASCII_AT problemy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79669#p79669"><![CDATA[
No dokładnie trzeba to już sobie jakoś dopracować - ja chciałem przede wszystkim pokazać ideę jak parsować a nie wnikać w super mega szczegóły nie wiadomo jak optymalnego kodu i sprawdzającego WSZYSTKIE możliwe sytuacje ... jak widać akurat nie sprawdziłem tego że zareaguje na nie pełne komendy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />ty na szybko wymyśliłeś to:<br /><br />[syntax=c]if ( strlen(pBuf) == strlen(polecenia_at&#91;i&#93;.polecenie_at) )[/syntax]<br /><br />i dobrze ale też może być kłopot jeśli będą np dwa takie polecenia<br /><br />AT+LED<br />AT+LEM<br /><br />prawda ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... bo w obydwu przypadkach zareaguje na AT+L ale tylko jedno z nich się wykona - to pierwsze .... trzeba nieco inaczej rozwiązać samo porównanie stringów i będzie po zawodach - a super optymalnością się nie przejmować bo to nie jakaś czasówka gdzie każda nanosekunda się liczy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ważne aby działało<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 kwi 2014, o 21:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[EmCom5]]></name></author>
<updated>2014-04-29T21:26:50+01:00</updated>
<published>2014-04-29T21:26:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79668#p79668</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79668#p79668"/>
<title type="html"><![CDATA[L21_UART_ASCII_AT problemy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6929&amp;p=79668#p79668"><![CDATA[
Witam,<br /><br />Zająłem się obsługą uart-a z lekcji biblioteki od Mirka z zielonego Booka.<br /><br />Mam mały problem nie chodzi o komunikacje po RS nie  ma żadnego problemu.<br /><br />Problem który minie nurtuje to to że gdy wysyłam komendę AT do układu:<br />wysłany ciąg znaków &gt;&gt;  otrzymana odpowiedź<br />AT &gt;&gt; OK<br />A &gt;&gt; OK<br />AT+L &gt;&gt; AT+LED = (0-1)<br />AT+LED &gt;&gt; AT+LED = (0-1)<br />itd.<br /><br />Jak widać mimo podania nie pełnej komendy otrzymujemy poprawną odpowiedź. Co zauważyłem w przypadku nie pełnej komendy to to że wybierana jest pierwsza z zgodnym ciągiem znaków. I nie ma losowości, jeśli podamy tylko A to odpowie jako AT, a jeśli podamy AT+ to zostanie zrestartowane urządzenie. Zgodnie z poniższą tablicą<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">      {&quot;AT&quot;,       at_service},<br />      {&quot;ATI&quot;,    ati_service},<br />      {&quot;AT+RST&quot;,    at_rst_service},<br />      {&quot;AT+IR&quot;,    at_ir_service},<br />      {&quot;AT+LED&quot;,    at_led_service},<br />      {&quot;AT+LCD&quot;,    at_lcd_service},</div><br /><br />Jeśli pozmieniamy kolejność pozycji to wybierze pierwszą komendę pokrywając się.<br /><br />Rozwiązanie jakie znalazłem żeby rozpoznawał pełne nazwy a nie po części.<br /><br />Oryginalna część kodu z Blue Booka<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">      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_service );<br />                  if( _at_srv) _at_srv(2,0);<br />               }<br />               break;<br />            }<br />         }<br />      }<br /></div><br /><br />Po moich zmianach<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">      else {<br />         for(i=0;i&lt;AT_CNT;i++) {<br />            if ( strlen(pBuf) == strlen(polecenia_at&#91;i&#93;.polecenie_at) ){<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_service );<br />                     if( _at_srv) _at_srv(2,0);<br />                  }<br />                  break;<br />               }<br />            }<br />         }<br />      }</div><br /><br />Po pętli for wstawiłem dodatkowego if-a takie obejście robocze.<br /><br />Ma ktoś pomysł jak to rozwiązać bardziej efektywniej.<br /><br />Nie podaje pełnego kody gdyż nie jestem jej autorem. Autorem kodu jest Mirosław Kardaś.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2018">EmCom5</a> — 29 kwi 2014, o 21:26</p><hr />
]]></content>
</entry>
</feed>