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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-01-17T19:40:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20005&amp;mode</id>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-01-17T19:40:19+01:00</updated>
<published>2018-01-17T19:40:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202208#p202208</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202208#p202208"/>
<title type="html"><![CDATA[Re: UART-wskazniki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202208#p202208"><![CDATA[
Dziękuję za odpowiedz! Przeanalizowałem to co napisałeś i swoje podejście. Faktycznie chcąc ustawić wskaznik _last_dir na wartość w pamięci Flash wystarczy zrobić to w taki sposób jaki napisałeś. Powodem błędnego podejścia była zła interpretacja funkcji odczytu z pamięci Flash. Teraz wiem, że tworząc w taki sposób wskaznik w jaki stworzyłem przypisuje do niego wartości dwóch pierwszych elementów z tablicy, co tworzy nam oczywiście błędny wskaznik. <br /><br />Poczytam kiedyś w wolnej chwili o funkcji realizującej wysyłanie poprzez UART stringów z pamięci Flash przy pomocy funckji uart_puts_P(). Na ten moment poradziłem sobie poprzez powołanie zmiennej  statycznej tablicowej, do której po spełnieniu warunków będzie kopiowany string z parametru funkcji.<br /><br />[syntax=c]int8_t at_dir_service(uint8_t inout, char *params )<br />{<br />int8_t (*_dir_srv)(void);<br />uint8_t i;<br />static char _last_dir&#91;DIR_LEN&#93;;<br /><br />    if(0==inout)<br />    {<br />    uart_puts(_last_dir);<br />    return 1;<br />    }else if(inout==1){<br />    for(i=0;i&lt;DIR_NO;i++)<br />        {<br />        if(0==strncasecmp_P(params, dir_id&#91;i&#93;.dir_id, strlen(params)))<br />        {<br />    if(dir_id&#91;i&#93;.dir_id)<br />    {<br />    _dir_srv=(void*)pgm_read_word(&amp;dir_id&#91;i&#93;.change_dir);<br />    if(_dir_srv)<br />    {<br />    _dir_srv();<br />    strcpy(_last_dir, params);<br />    return 1;<br />    }<br />    return -1;<br />    }<br />    }<br />    }<br />    }else if(2==inout){<br />    uart_puts(&quot;AT+DIR=(UP,DOWN,RIGHT,LEFT)\r\n&quot;);<br />    return 1;<br />    }<br /><br />return -1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 17 sty 2018, o 19:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-01-17T06:47:43+01:00</updated>
<published>2018-01-17T06:47:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202178#p202178</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202178#p202178"/>
<title type="html"><![CDATA[Re: UART-wskazniki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202178#p202178"><![CDATA[
Przedstawiłeś zbyt mało kodu, więc mogę się tylko domyślać, jakiego typu są elementy struktury (a raczej tablicy struktur) <strong><em>dir_id</em></strong>. Domyślam się więc, że <strong><em>dir_id[i].dir_id</em></strong> to wskaźnik na ciąg znaków w pamięci FLASH, tak samo jak <strong><em>_last_dir</em></strong> (cytuję: <em>&quot;chcę ustawić wskaznik _last_dir na adres w pamięci FLASH tożsamy z tym parametrem&quot;)</em>. W takim przypadku wystarczy przypisać wartość <strong><em>dir_id[i].dir_id</em></strong> do zmiennej <strong><em>_last_dir</em></strong>:[syntax=c]_last_dir = dir_id&#91;i&#93;.dir_id;[/syntax]<br />ponieważ to co zrobiłeś:<div class="quotetitle">BarGai napisał(a):</div><div class="quotecontent"><br />[syntax=c]_last_dir=(void*)pgm_read_word(dir_id&#91;i&#93;.dir_id);[/syntax]<br /></div><br />to odczyt z pamięci FLASH dwóch pierwszych znaków ciągu, na który wskazuje <strong><em>dir_id[i].dir_id</em></strong> i utworzenie z nich (błędnego) wskaźnika.<br /><br />Druga sprawa - nie mam GB, więc nie czytałem i nie znam kodu &quot;biblioteki&quot; od UART, ale jeśli <strong><em>_last_dir</em></strong> jest wskaźnikiem na ciąg znaków we FLASH, najprawdopodobniej ta linia kodu nie zadziała:<div class="quotetitle">BarGai napisał(a):</div><div class="quotecontent"><br />[syntax=c]uart_puts(_last_dir);[/syntax]<br /></div> Do wysyłania przez UART ciągu znaków zapisanego w pamięci FLASH powinna być dostępna inna funkcja (zwykle z przyrostkiem &quot;_P&quot;, czyli np. <strong><em>uart_puts_P()</em></strong> ), która odpowiednio interpretuje przekazywany do niej wskaźnik.<br /><br />Na razie tyle zauważyłem (co jest związane z przedstawionym przez Ciebie problemem), ale nie wykluczone, że masz tam jeszcze inne błędy. Trudno to wywnioskować na podstawie tak skromnych fragmentów kodu. Przydałyby się jeszcze przynajmniej deklaracje i definicje zmiennych, którymi operujesz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 17 sty 2018, o 06:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-01-16T00:31:17+01:00</updated>
<published>2018-01-16T00:31:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202111#p202111</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202111#p202111"/>
<title type="html"><![CDATA[UART-wskazniki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20005&amp;p=202111#p202111"><![CDATA[
Witam wszystkich,<br /><br />mam pewien problem. Stworzyłem bibliotekę w oparciu o GB i transmisja działa poprawnie. Pojawił się pewien problem podczas odczytywania komendy.<br /><br />Chciałem osiągnąć taki efekt: Przy komendzie zapis(przykładowo AT+DIR=UP), chcę zapamiętać ostatni parametr (w tym przypadku UP), abym mógł go wywołać podczas odczytu (AT+DIR?). <br /><br />Zrealizowałem to w ten sposób, że zdefiniowałem sobie globalny wskaznik typu char (char *_last_dir). Gdy parametr przekazany do funkcji jest mówiąc w skrócie poprawny chcę ustawić wskaznik _last_dir na adres w pamięci FLASH tożsamy z tym parametrem. Następnie, gdy przyjdzie odczytać zapamiętany wcześniej kierunek (_last_dir) wywołuję funkcję uart_puts(_last_dir) w celu uzyskania w terminalu tej informacji(UP). Tutaj pojawia się problem, ponieważ takiej informacji nie uzyskuję. Dla testów przesyłam do terminala TEST1 i TEST2 i działa to zgodnie z oczekiwaniami. Pytanie moje brzmi, w czym zatem robię błąd? Spędziłem nad tym trochę czasu i postanowiłem poprosić o radę. Poniżej kod.  <br /><br />[syntax=c]int8_t at_dir_service(uint8_t inout, char *params )<br />{<br />int8_t (*_dir_srv)(void);<br />uint8_t i;<br />    if(0==inout)<br />    {<br />    if(_last_dir)<br />    {<br />    uart_puts(&quot;TEST2\r\n&quot;);<br />    uart_puts(_last_dir);<br />    return 1;<br />    }<br />    return -1;<br />    }else if(1==inout){<br />    for(i=0;i&lt;DIR_NO;i++)<br />        {<br />        if(0==strncasecmp_P(params, dir_id&#91;i&#93;.dir_id, strlen(params)))<br />        {<br />    if(dir_id&#91;i&#93;.dir_id)<br />    {<br />    _dir_srv=(void*)pgm_read_word(&amp;dir_id&#91;i&#93;.change_dir);<br />    if(_dir_srv)<br />    {<br />    _dir_srv();<br />    _last_dir=(void*)pgm_read_word(dir_id&#91;i&#93;.dir_id);<br />    if(_last_dir)<br />    {<br />    uart_puts(&quot;TEST1\r\n&quot;);<br />    uart_puts(_last_dir);<br />    }<br />    return 1;<br />    }<br />    }<br />    }<br />    }<br />    }else if(2==inout){<br />    uart_puts(&quot;AT+DIR=(UP,DOWN,RIGHT,LEFT)\r\n&quot;);<br />    return 1;<br />    }<br /><br />return -1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 16 sty 2018, o 00:31</p><hr />
]]></content>
</entry>
</feed>