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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-04-30T07:49:20+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22194&amp;mode</id>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2019-04-30T07:49:20+01:00</updated>
<published>2019-04-30T07:49:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218577#p218577</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218577#p218577"/>
<title type="html"><![CDATA[Re: Odbiór stringa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218577#p218577"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Kompilator utworzy zmienną poprzez zarezerwowanie w pamięci RAM dwóch bajtów i umieszczenie w nich przypisanych im wartości. Na podstawie prefiksu <strong><em>0x</em></strong> zidentyfikuje format heksadecymalny i wartości obliczy poprzez:<br />0x28 = <strong>2</strong>*16+<strong>8</strong> = 40  (00101000 binarnie)<br />0x86 = <strong>8</strong>*16+<strong>6</strong> = 134 (10000110 binarnie)<br /></div><br /><br />Nie wiedziałem jak traktuje to kompilator. Dziękuje Ci <strong>andrews</strong> za cierpliwość i szczegółowe wytłumaczenie, teraz na podstawie nowej wiedzy postaram się napisać funkcję konwertującą. Jak będę miał jeszcze pytania to się odezwę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 30 kwi 2019, o 07:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2019-04-29T20:03:11+01:00</updated>
<published>2019-04-29T20:03:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218568#p218568</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218568#p218568"/>
<title type="html"><![CDATA[Re: Odbiór stringa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218568#p218568"><![CDATA[
<div class="quotetitle">Tom92 napisał(a):</div><div class="quotecontent"><br />następnie odczytane liczby do separatorów ',' wpisywać kolejno do zmiennych a,b,c,d,e,f,g,h. Oczywiście musiałbym jeszcze dodać do tych zmiennych dodatkowo na początku prefiks 0x i na końcu przecinek.<br /></div><br /><br />Widzę, że chyba coś Ci się pomieszało. Nie musisz niczego dodawać. Mam wrażenie, że nie rozumiesz różnicy pomiędzy wartością liczbową a ciągiem znaków.<br />Dla uproszczenia tablica dwuelementowa:<br /><br />[syntax=c]// można utworzyć<br />    uint8_t adres1&#91;2&#93; = {0x28,0x86};<br />// alternatywnie można też utworzyć tablicę tak:<br />    uint8_t adres1&#91;2&#93;;<br />// i później przypisać wartości do jej elementów:<br />    adres1&#91;0&#93; = 0x28;<br />    adres1&#91;1&#93; = 0x86;[/syntax]<br />Ten zapis tworzy dwuelementową tablicę wartości. Kompilator utworzy zmienną poprzez zarezerwowanie w pamięci RAM dwóch bajtów i umieszczenie w nich przypisanych im wartości. Na podstawie prefiksu <strong><em>0x</em></strong> zidentyfikuje format heksadecymalny i wartości obliczy poprzez:<br />0x28 = <strong>2</strong>*16+<strong>8</strong> = 40  (00101000 binarnie)<br />0x86 = <strong>8</strong>*16+<strong>6</strong> = 134 (10000110 binarnie)<br /><br />Natomiast to, co Ty próbujesz zrobić, to chyba w efekcie coś w stylu:<br />[syntax=c]//<br />    uint8_t adres1&#91;2&#93;;<br />    adres1&#91;0&#93; = &quot;0x28&quot;;[/syntax]<br />a to Ci się nie uda, ponieważ wyrażenie w cudzysłowie to tak naprawdę tablica znaków (kodów ASCII):<br />&quot;0x28&quot; to to samo co {'0', 'x', '2', '8', '\0'} lub {0x30, 0x78, 0x32, 0x38}<br />i tak traktuje to kompilator, a nie jako wartość 0x28.<br />Rozumiesz chyba, że nie da się wpisać całego ciągu do pojedynczej zmiennej jednobajtowej.<br /><br />Dlatego też, kiedy już wydobędziesz sobie z komendy AT jakiś dwucyfrowy ciąg znaków (np. za pomocą funkcji <em>strtok()</em> ) musisz użyć funkcji, która skonwertuje go na jednobajtową wartość.<br />Biorąc przykładowo ciąg znaków &quot;4C&quot;, Twoja funkcja powinna:<br /><ol style="list-style-type: decimal"><li>odczytać kod ASCII pierwszego znaku - tutaj będzie to 0x34 ('4')</li><li>na podstawie tej wartości znaku ASCII obliczyć wartość pierwszej cyfry - tutaj będzie to 4</li><li>odczytać kod ASCII drugiego znaku - tutaj będzie to 0x43 ('C')</li><li>na podstawie tej wartości znaku ASCII obliczyć wartość drugiej cyfry - tutaj będzie to 12</li><li>obliczyć wartość na podstawie wzoru<br />wynik = (wartość pierwszej cyfry)*16+(wartość drugiej cyfry)<br />czyli w naszym wypadku 4*16+12=76</li><li>zwrócić wynik</li></ol><br />I tak po kolei wszystkie dwucyfrowe ciągi znaków, przetworzyć na wartości jednobajtowe i przypisać do odpowiednich elementów Twojej tablicy <em>adres1[]</em>.<br /><br />Można byłoby też ewentualnie użyć do konwersji funkcji <strong><em>strtoul()</em></strong> z biblioteki standardowej, ale to trochę przerost formy nad treścią.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 29 kwi 2019, o 20:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2019-04-29T11:02:09+01:00</updated>
<published>2019-04-29T11:02:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218548#p218548</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218548#p218548"/>
<title type="html"><![CDATA[Re: Odbiór stringa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218548#p218548"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Nie wiem, gdzie to wyczytałeś, ale funkcja <strong><em>memcpy()</em></strong> niczego nie konwertuje, ona tylko kopiuje dane z jednego miejsca pamięci RAM do innego.<br /></div><br /><br />Przepraszam, źle zrozumiałem to co czytałem.<br /><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Nie jestem pewien, czy na końcu ciągu wysyłasz znak '\0' (Null), czy raczej '\r' (Carriage Return).<br /></div><br /><br />Wysyłam '\r'.<br /><br />Czyli odbiorę komendę AT w zaproponowanej przez Ciebie formie, następnie pierwszą część (do separatora '|') wpiszę do zmiennej char * adres1, a drugą do zmiennej char * adres2. Później nie wiem właśnie co z tym zrobić?<br /><br />==========<br />Na szybko mi jeszcze przyszło do głowy, żeby utworzyć dodatkową zmienną tablicową, która w warunku if przed pętlą while() będzie brana pod uwagę jeśli będzie miała zapisany jakiś adres zamiast zmiennej temp_in[8] np.:<br />[syntax=c]char a,b,c,d,e,f,g,h;<br />unsigned char adres1&#91;8&#93; = {a,b,c,d,e,f,g,h};[/syntax]<br /><br />następnie odczytane liczby do separatorów ',' wpisywać kolejno do zmiennych a,b,c,d,e,f,g,h. Oczywiście musiałbym jeszcze dodać do tych zmiennych dodatkowo na początku prefiks 0x i na końcu przecinek.<br /><br />Czy nie tędy droga?<br />==========<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 29 kwi 2019, o 11:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2019-04-28T19:12:10+01:00</updated>
<published>2019-04-28T19:12:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218523#p218523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218523#p218523"/>
<title type="html"><![CDATA[Re: Odbiór stringa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218523#p218523"><![CDATA[
<div class="quotetitle">Tom92 napisał(a):</div><div class="quotecontent"><br />Wyczytałem gdzieś, że muszę zrobić konwersję z char na unsigned char za pomocą funkcji memcpy...<br /></div><br />Nie wiem, gdzie to wyczytałeś, ale funkcja <strong><em>memcpy()</em></strong> niczego nie konwertuje, ona tylko kopiuje dane z jednego miejsca pamięci RAM do innego. Obawiam się, że nie znajdziesz funkcji standardowej języka C, która przetworzy ciąg znaków w użytym przez Ciebie formacie <em>&quot;{0x28, 0x86, 0x6f, 0xcb, 0x08, 0x00, 0x00, 0xb0}&quot;</em> na wartości binarne i umieści w tablicy docelowej. Będziesz musiał sobie napisać taką funkcję sam.<br /><br />Moim zdaniem lepiej byłoby pominąć te nawiasy klamrowe, prefiksy <strong>0x</strong> oraz jeden ze znaków separatora (spację lub przecinek), aby ułatwić sobie zadanie. Te rzeczy potrzebne są w przypadku definiowania tablic stałych liczbowych i są potrzebne kompilatorowi do prawidłowej interpretacji wartości. W Twoim przypadku (zakładając, że ta komenda AT będzie zawsze zawierała 2x8 wartości w formacie heksadecymalnym) są to rzeczy zbędne, które tylko skomplikują Ci konwersję.<br /><br />Przykładowy format mógłby wyglądać:<br /><br /><strong>&quot;AT+CZUJ=28,86,6f,cb,08,00,00,b0|28,0e,73,f5,05,00,00,eb&quot;</strong><br /><br />W łatwiejszy sposób będzie można wyłowić dwucyfrowe podciągi znaków i przetworzyć je na odpowiadające im wartości liczbowe.<br /><br /><div class="quotetitle">Tom92 napisał(a):</div><div class="quotecontent"><br />49 - ilość znaków w stringu + znak 0<br /></div><br />Nie jestem pewien, czy na końcu ciągu wysyłasz znak '\0' (Null), czy raczej '\r' (Carriage Return). Chyba, że funkcja odbierająca to w jakiś sposób zmienia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 28 kwi 2019, o 19:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2019-04-28T14:03:42+01:00</updated>
<published>2019-04-28T14:03:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218516#p218516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218516#p218516"/>
<title type="html"><![CDATA[Re: Odbiór stringa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218516#p218516"><![CDATA[
Odczytuję tak bo wziąłem przykład z YellowBooka, tam właśnie tak są odbierane komendy AT.<br /><br />Wydaje mi się, że tutaj mam problem z typami zmiennych. <br /><br />Mam zmienną tablicową typu unsigned char[8], która przechowuje adres czujnika DS18B20. Ja odbieram po UDP stringa (w postaci dwóch adresów) np.: <br />AT+CZUJ={0x28, 0x86, 0x6f, 0xcb, 0x08, 0x00, 0x00, 0xb0};{0x28, 0xe, 0x73, 0xf5, 0x05, 0x00, 0x00, 0xeb}<br /><br />Teraz prawdopodobnie jest problem z zapisem odebranego po UDP stringa do zmiennej tablicowej typu unsigned char[8]. Wyczytałem gdzieś, że muszę zrobić konwersję z char na unsigned char za pomocą funkcji memcpy czyli w moim przypadku chyba powinno być:<br /><br />[syntax=c]memcpy( ram_cfg.temp_in, adres1, 49 );[/syntax]<br /><br />temp_in - zmienna tablicowa unsigned char temp_in[8]<br />adres1 - zmienna przechowująca odebrany string<br />49 - ilość znaków w stringu + znak 0<br /><br />jeszcze nie sprawdzałem tego bo nie jestem u siebie i nie mam tej możliwości, ale czy dobrze w ogóle myślę?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 28 kwi 2019, o 14:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2019-04-26T16:38:35+01:00</updated>
<published>2019-04-26T16:38:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218479#p218479</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218479#p218479"/>
<title type="html"><![CDATA[Odbiór stringa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22194&amp;p=218479#p218479"><![CDATA[
Cześć,<br /><br />Mam problem, którego nie umiem na tą chwilę rozwiązać.<br /><br />Jaki mam cel?<br />Mam w projekcie czujniki temperatury DS18B20 i żeby było wiadomo, który jest od czego to są odpytywane po adresie ID. Chcę teraz mieć możliwość zmianę tego adresu (w przypadku wymiany uszkodzonego czujnika) bez wgrywania nowego wsadu z nowym adresem ID (np. z aplikacji w telefonie).<br /><br />Co już mam?<br />Narazie dwa czujniki - standardowe adresy czujników zapisane są w pamięci flash oraz zdefiniowałem sobie pamięci ram, eeprom<br /><br /><strong>w pliku *.h</strong><br />[syntax=c]#define CZUJIN{0x28, 0x86, 0x6f, 0xcb, 0x08, 0x00, 0x00, 0xb0}<br />#define CZUJOUT{0x28, 0xe, 0x73, 0xf5, 0x05, 0x00, 0x00, 0xeb}<br /><br />typedef struct {<br />unsigned char temp_in&#91;8&#93;;<br />unsigned char temp_out&#91;8&#93;;<br />} TCFG;<br /><br />extern const TCFG pgm_cfg PROGMEM;<br />extern TCFG eem_cfg EEMEM;<br />extern TCFG ram_cfg;[/syntax]<br /><br /><strong>w pliku *.c</strong><br />[syntax=c]const TCFG pgm_cfg PROGMEM = {<br />CZUJIN,<br />CZUJOUT,<br />};<br /><br />TCFG eem_cfg EEMEM;<br />TCFG ram_cfg;[/syntax]<br /><br />W programie wywołuję prze pętlą while mam z poradników Pana Mirka funkcję:<br />[syntax=c]check_and_load_defaults();[/syntax]<br /><br />DO TEJ PORY WSZYSTKO DZIAŁA<br /><br />Problem mam z wpisaniem do pamięci EEPROM odebranego innego adresu, a w zasadzie to mam problem z odebraniem nowego adresu...<br /><br />Wysyłam adres z aplikacji w telefonie tak:<br />[syntax=vb]Sub btn1CzujPage3_Click<br />mkwifi.send_udp( matip, matport, &quot;AT+CZUJ={&quot; &amp; ed1CzujPAge3.Text &amp; &quot;};{&quot; &amp; ed2CzujPage3.Text &amp; &quot;}&quot; &amp; Chr(13) )<br />End Sub[/syntax]<br /><br />W jednym polu tekstowym w aplikacji wpisuję np.: 0x28, 0xe, 0x53, 0xf6, 0x15, 0x00, 0x00, 0xce<br />a w drugim, np to samo niech będzie.<br /><br />Chcę wysłać stringa w postaci: AT+CZUJ={0x28, 0xe, 0x53, 0xf6, 0x15, 0x00, 0x00, 0xce};{0x28, 0xe, 0x53, 0xf6, 0x15, 0x00, 0x00, 0xce} czyli powinienem uzyskać taką samą temperaturę w &quot;z dwóch czujników w projekcie&quot;<br /><br />Jak odebrać takiego stringa?<br />ja to robię w ten sposób:<br /><br />[syntax=c]if( strstr_P( buf, PSTR(&quot;AT+CZUJ=&quot;) ) ) {<br />// string: AT+CZUJ=&lt;adres1;adres2&gt;<br />// np:AT+CZUJ={0x28, 0x86, 0x6f, 0xcb, 0x08, 0x00, 0x00, 0xb0};{0x28, 0xe, 0x73, 0xf5, 0x05, 0x00, 0x00, 0xeb}<br />strtok( buf, &quot;=&quot; );<br />char * adres1 = strtok( NULL, &quot;;&quot; );<br />char * adres2 = strtok( NULL, &quot;~&quot; );<br /><br />strcpy((char*)ram_cfg.temp_in, adres1);<br />strcpy((char*)ram_cfg.temp_out, adres2);<br /><br />copy_ram_to_eem();<br /><br />beep(10);<br />}[/syntax]<br /><br />No i teraz nie mam żadnych odczytów temperatury. Przedstawiłem wszystko, żeby było wiadomo o co mi chodzi. Wydaje mi się, że jest problem z odebraniem tego stringa, czy dobrze w ogóle to robię?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 26 kwi 2019, o 16:38</p><hr />
]]></content>
</entry>
</feed>