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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-19T15:57:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6141&amp;mode</id>
<entry>
<author><name><![CDATA[...kuba...]]></name></author>
<updated>2014-12-19T15:57:06+01:00</updated>
<published>2014-12-19T15:57:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109517#p109517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109517#p109517"/>
<title type="html"><![CDATA[Re: Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109517#p109517"><![CDATA[
Odnośnie ascii_line sygnalizuje obecność kolejnej linii w buforze cyklicznym - do którego trafiają dane odebrane z bufora sprzętowego, czyli jej wartość zwiększana jest po odbraniu znaku \r (dziesiętnie = 13) który kończy przesłaną ramkę, korzystam z biblioteki MKUART autorstwa <em>mirekk36</em> i raczej nie mogę publikować jej na forum.<br />[syntax=c]// definiujemy procedurę obsługi przerwania odbiorczego, zapisującą dane do bufora cyklicznego<br />ISR( USART_RXC_vect ) {<br />...<br />    switch( data ) {<br />    case 13: ascii_line++;<br />    }<br />...<br />    }[/syntax]<br />a jej wartość zmniejszana jest po pobraniu danych w funkcji służącej do odbierania danych, :<br /><br />[syntax=c]char * uart_get_str(char * buf) {<br />...<br />char * wsk = buf;<br />if( ascii_line ) {<br />       //pobiera dane z bufora cyklicznego zapisując je w *buf aż do napotkania znaki \r<br />}<br />*buf=0;<br />ascii_line--;<br />}<br />return wsk;<br />}[/syntax]<br /><br /><div class="quotetitle">xor napisał(a):</div><div class="quotecontent"><br />(Na marginesie: funkcja itoa pożarła tu ostatni argument strncmp).<br /></div> Faktycznie tu wyskoczył mi błąd podczas kompilacji, ale zapominałem poprawić go na forum.<br /><br />A separatora w funkcji nie ma;/ Użyłem go tylko na forum przedstawiając ramkę danych w celu wydzielenia pól.<br /><br />A mogę np. w funkcji Transmit korzystać z bufora buf[] jak z tablicy? czyli sprawdzić jej pierwszy element, czy zawiera się w nim interesujący mnie adres? Chodzi mi o to, czy po pobraniu danych funkcją uart_get_str(buf), będą one trafiać na początek tablicy buf? czyli czy na zerowej pozycji tablicy znajduje się początek pierwszy element ramki danych jakim jest adres?<br />[syntax=c]Transmit(uint8_t slave_adres, char action, char *command, uint16_t data ) {<br /><br />char buf&#91;20&#93;;  /** bo już nie potrzebnystring_adr **/<br />...<br />        uart_get_str(buf)<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=408">...kuba...</a> — 19 gru 2014, o 15:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-12-19T15:00:04+01:00</updated>
<published>2014-12-19T15:00:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109503#p109503</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109503#p109503"/>
<title type="html"><![CDATA[Re: Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109503#p109503"><![CDATA[
W funkcji nie stąd ni zowąd pojawia się <em>ascii_line</em>. Co to właściwie za zmienna?<br />W linii 23:<br />                [syntax=c]if      ( (ascii_line) &amp;&amp; strncmp(uart_get_str(buf),  itoa(adres, string_adr, 10, 2)==0){[/syntax]<br />Nie wiem co właściwie zwraca funkcja <em>uart_get_str</em> w razie braku znaków do wczytania? Jeżeli wskaźnik na bufor (który nb. zawiera pewnie śmieci) to jeszcze pół biedy (w tym wypadku), ale jeżeli NULL to <em>strncmp </em>raczej niezbyt dobrze to przyjmie. (Na marginesie: funkcja <em>itoa </em>pożarła tu ostatni argument <em>strncmp</em>).<br />We wzorcu ciągu pomiędzy polami ciągu pokazujesz separator (znak '|'), w funkcji jego nie ma, w końcu separator jest czy nie? (Na marginesie: w opisach formalnych zwykło się używać znaku '|' jako oznaczenie alternatywy dla pola, podobnie w regexpach). Jeżeli nie ma separatora, to rozważ jego użycie bo ułatwi to parsowanie stringa (jest taka fajna funkcja pt. <em>strtok</em>). <br />Alternatywą do parsowania stringów funkcjami z biblioteki <em>string.h</em> jest użycie <em>sscanf</em>. Z tą funkcją to są już niemal nieograniczone możliwości parsowania i (jednoczesnej) konwersji, ale za to kod puchnie <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=1774">xor</a> — 19 gru 2014, o 15:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[...kuba...]]></name></author>
<updated>2014-12-19T13:44:45+01:00</updated>
<published>2014-12-19T13:44:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109482#p109482</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109482#p109482"/>
<title type="html"><![CDATA[Re: Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109482#p109482"><![CDATA[
No to jeden problem z głowy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Co do reszty stworzyłem taką pętlę która na początku programu &quot;skanuje&quot; magistralę RS485 w poszukiwaniu ilości podłączonych odbiorników (Innych Atmeg) i kolejno zapisuje ich adresy (wartości od 1 do 16) do tablicy slave_adres.<br />[syntax=c]for ( unsigned char i = 1; i &lt; 16; ++i){<br />if((adres=Transmit( i, 'r', &quot;pp&quot;, 0))){ slave_adres&#91;cnt_slave++&#93;=adres; adres=0; testbeep();}<br />testbeep();<br />}[/syntax]<br /><br />Zastanawiam się czy to dobre rozwiązanie, żeby sprawdzać odpowiedzi odbiorników (odbierać dane z UART) w funkcji [syntax=c]uint16_t Transmit(uint8_t slave_adres, char action, char *command, uint16_t data )[/syntax] a nie w programie głównym. Robiąc to w ten sposób chciałem, żeby funkcja zwracała mi już gotową odebraną wartość. dane wysyłane są w postaci:<br /><br />[Adres|action|command/data|\r\n]<br /><br />Adres - liczba od 1 do 16<br />action - rozkaz w postaci znaku  'r'-czytaj dane z odbiornika, 'w' - zapisz dane do odbiornika<br />command/data - jest to ciąg dwóch znaków ( &quot;pp&quot;- czytaj adres, &quot;pt&quot; - odczyt temperatury, ) lub wartość wypełnienia PWM (od 1000 do 3000);<br />\r\n - znaki końca danych<br />zastanawiałem się nad zrobieniem sumy kontrolnej, ale najpierw chciałem uporać się z tymi problemami. <br /><br />Kolejne wywołania wyglądają w ten sposób, ale jak wyświetlę sobie temp_slave i PWM_slave na wyświetlaczu, to wartości zamieniają się miejscami, czyli w miejscu temp raz jest temp, a raz wartość PWM i na odwrót, więc stąd moje wątpliwości co do poprawnego działania.<br />[syntax=c]temp_slave = Transmit( slave_adres&#91;0&#93;, 'r', &quot;tp&quot;, 0 );<br />PWM_slave = Transmit( slave_adres&#91;0&#93;, 'w', &quot;value&quot;, 1100 );[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=408">...kuba...</a> — 19 gru 2014, o 13:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-12-19T10:39:28+01:00</updated>
<published>2014-12-19T10:39:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109452#p109452</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109452#p109452"/>
<title type="html"><![CDATA[Re: Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109452#p109452"><![CDATA[
<div class="quotetitle">...kuba... napisał(a):</div><div class="quotecontent"><br />czy będzie działać to poprawne, chociaż nie wydaje mi się, bo command to wskaźnik do string-a<br /></div><br />A dlaczego nie miało by działać poprawnie? Bardzo dobrze, że wskaźnik, nic innego tam nie może być: <a href="http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga46f3cbd2de457c0fb340a1f379fc33ba"  class="postlink">http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga46f3cbd2de457c0fb340a1f379fc33ba</a><br /><br />Co do dalszej części: pokaż jaki konkretnie ma być string wejściowy a coś się może wymyśli. Pokaż wszystkie możliwe warianty pod względem dlugości, części skladowych i separatorów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 19 gru 2014, o 10:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[...kuba...]]></name></author>
<updated>2014-12-19T03:51:10+01:00</updated>
<published>2014-12-19T03:51:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109429#p109429</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109429#p109429"/>
<title type="html"><![CDATA[Re: Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=109429#p109429"><![CDATA[
Witam ponownie. Przepraszam za odgrzebywanie tematu, ale mam podobny problem. Jestem w trakcie tworzenia funkcji do obsługi transmisji w której potrzebuję sprawdzić czy argument przekazywany do funkcji to wyraz &quot;value&quot;. Przeglądając tematy natknąłem się na pomysł:<br />[syntax=c]if(strcmp(command, &quot;value&quot;) == 0){[/syntax]  <br />i mam pytanie, czy będzie działać to poprawne, chociaż nie wydaje mi się, bo command to wskaźnik do string-a, jak na razie zrealizowałem to w ten sposób:<br />[syntax=c]if (*command=='v')[/syntax]<br />ale chciałbym, sprawdzać czy wystąpił cały ciąg znaków.<br /><br />Mam jeszcze pytanie odnośnie funkcji strcnmp ponieważ działa podobnie jak funkcja strcmp, jednak można podać ilość znaków do porównania. W warunku [syntax=c]if( (ascii_line) &amp;&amp; strncmp(uart_get_str(buf),  itoa(adres, string_adr, 10, 2)==0){[/syntax] chciałbym sprawdzić czy na pierwszym miejscu odebranego ciągu znaków znajduje się adres (liczba od 1 do 16) jednak używając tej funkcji muszę podać liczbę znaków do porównania,  w przypadku liczb od 1 do 9 jest to jeden znak a dla liczb od 10 do 16 są to dwa znaki. Przyszedł mi do głowy pomysł, żeby sprawdzić czy w danym momencie adres jest liczbą &lt;10 i odpowiednio do tego podawać odpowiednią ilość znaków do porównania. Tylko co w przypadku kiedy np. liczba 9 nie będzie na pierwszym miejscu a gdzieś dalej w ciągu znaków? Zastanawiam się czy nie wykorzystać buf jako tablicy i nie sprawdzać jej pierwszych elementów? i jeszcze jedno pytanie, czy ta pętla ma sens? Zrealizowałem ją z myślą o tym, żeby odczekać chwilę, aby zdążyć odebrać odpowiedź przed wysłanie kolejnej prośby [syntax=c]//while((!ascii_line) &amp;&amp; (i++&lt;10))[/syntax]<br /> lub <br />[syntax=c]while(i++&lt;5)<br />{<br />_delay_ms(100);<br />//if((ascii_line)&amp;&amp; strncmp(uart_get_str(buf),  itoa(adres, string_adr, 10, 2)==0)[/syntax]<br /><br />Wywołanie funkcji:<br />[syntax=c]PWM_slave=Transmit( slave_adres&#91;0&#93;, 'w', &quot;value&quot;, 1100 );[/syntax]<br /><br />Ciało funkcji:<br /><br /> [syntax=c]uint16_t Transmit(uint8_t slave_adres, char action, char *command, uint16_t data ) {<br /><br />char buf&#91;20&#93;, string_adr&#91;6&#93;;  // bufor do odczytu danych<br />register char c;<br />uint8_t i=0;<br /><br />/* wysłanie prośby o odpowiedź podłączonych odbiorników */<br />uart_putint(slave_adres,10);// adres odbiornika1..16<br />uart_putc(action);// rozkaz r/w<br />if (*command=='v') uart_putint(data, 10);// wartość do wysłania<br />else{<br />while ((c = *command++)) uart_putc(c);//rozkaz do wysłania<br />}<br />uart_puts(&quot;\r\n&quot;);// wyślij znaki CR (enter) oray LF (nowa linia)<br /><br /><br />/* sprawdzenie czy odbiornik odpowiada */<br />//while((!ascii_line) &amp;&amp; (i++&lt;10))<br />while(i++&lt;5)<br />{<br />_delay_ms(100);<br />//if((ascii_line) &amp;&amp; strpbrk(uart_get_str(buf), itoa(adres, string_adr, 10))){  /** warunek działał niepoprawnie zacinał się **/<br />if( (ascii_line) &amp;&amp; strncmp(uart_get_str(buf),  itoa(adres, string_adr, 10, 2)==0){<br />if ( strpbrk (buf,&quot;w&quot;) )<br />{<br />char * wsk = strchr(buf,'w');<br />wsk++;<br />return (uint16_t)atoi(wsk);<br />}<br />}<br />}<br />return 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=408">...kuba...</a> — 19 gru 2014, o 03:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nixie]]></name></author>
<updated>2014-02-25T12:51:13+01:00</updated>
<published>2014-02-25T12:51:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=71966#p71966</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=71966#p71966"/>
<title type="html"><![CDATA[Re: Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=71966#p71966"><![CDATA[
Może tak:<br /><br />[syntax=c]char * wsk;<br />wsk = strchr(buf, 'w');<br />wsk++;<br />lcd_str(wsk);<br />lcd_int(atoi(wsk));[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=358">nixie</a> — 25 lut 2014, o 12:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[...kuba...]]></name></author>
<updated>2014-02-25T11:47:51+01:00</updated>
<published>2014-02-25T11:47:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=71956#p71956</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=71956#p71956"/>
<title type="html"><![CDATA[Konwersja odebranego z UART stringa do int]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6141&amp;p=71956#p71956"><![CDATA[
Witam, chcę stworzyć sobie funkcję, która będzie sprawdzała, ile odbiorników i z jakimi adresami jest podłączonych do magistrali RS485. Wszystko jako tako działa, jednak mam problem z zapisaniem adresów i ilości podłączonych odbiorników np. do tablicy. Nie wiem jak wyciągnąć przesłany adres, z odebranego stringa, tzn. gdzie zaczyna się ciąg znaków odpowiadających adresowi w postaci int, wiem tyle, że następuje po znaku w, ale nie wiem jak to wykorzystać <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />Poniżej fragment programu &quot;Master-a&quot; sprawdzającego podłączone urządzenia: <br /><br />[syntax=c]char buf&#91;20&#93;, string_adr&#91;3&#93;, slave_adres&#91;16&#93;;<br /><br />//************** sprawdzenie ilości i adresów podłączonych odbiorników ***************<br />for ( unsigned char i = 1; i &lt; 16; ++i){<br />/* wysłanie prośby o odpowiedź podłączonych odbiorników */<br />// ramka= &#91;adres odbiornika, r, p, p&#93;<br />uart_putint(i,10);// adres odbiornika<br />uart_putc('r');<br />uart_puts(&quot;pp&quot;);<br />uart_puts(&quot;\r\n&quot;);<br />_delay_ms(500);<br /><br />/* sprawdzenie czy odbiornik odpowiada */<br />// ramka = &#91;adres mastera=32, w, adres obecnego odbiornika&#93;<br />if(strpbrk(uart_get_str(buf), itoa(32, string_adr, 10))){<br />if ( strpbrk (bufor,&quot;w&quot;) ){<br />lcd_locate(1,0);<br />lcd_str(buf);<br />slave_adres&#91;j++&#93;=atoi(buf)??????  // tutaj pojawia się problem<br />}<br />}<br />testbeep();<br />}[/syntax]<br /><br />A tu fragment programu zgłaszających odpowiedź odbiorników<br /><br />[syntax=c]//************** zgłosze obecnosci ***************<br /><br />if ( strpbrk(uart_get_str(bufor), itoa(adres, string_adr, 10))){<br />if ( strpbrk (bufor,&quot;rpp&quot;) ){<br />uart_putint(32, 10);<br />uart_putc('w');<br />uart_putint(adres, 10);<br />uart_puts(&quot;\r\n&quot;);<br />lcd_str(&quot;zgloszenie&quot;);<br />}<br />}[/syntax]<br /><br />Prosiłbym o pomoc, w wyciągnięciu i zapisaniu adresów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=408">...kuba...</a> — 25 lut 2014, o 11:47</p><hr />
]]></content>
</entry>
</feed>