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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-11-11T23:22:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=13554&amp;mode</id>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-11-11T23:22:23+01:00</updated>
<published>2015-11-11T23:22:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13554&amp;p=145139#p145139</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13554&amp;p=145139#p145139"/>
<title type="html"><![CDATA[Re: Paroswanie łańcucha, RS485, STM32F103RBT6]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13554&amp;p=145139#p145139"><![CDATA[
Witam,<br /><br />nie widzę deklaracji struktury TWS, ale z tego:[syntax=c]const TWS whitesigns = { 0x01, 0x1E, 0x04};    // SOH | RS | EOT[/syntax] podejrzewam, że tu popełniasz błąd, no bo deklaracja  funkcji jest postaci:[syntax=c]char * strpbrk( const char * str1, const char * str2 );[/syntax].<br />Inaczej mówiąc: [syntax=c]whitesigns.SOH[/syntax] powinien być wskaźnikiem na łańcuch, a czy u Ciebie aby na pewno jest ?<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 11 lis 2015, o 23:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[simoon87]]></name></author>
<updated>2015-11-11T21:25:52+01:00</updated>
<published>2015-11-11T21:25:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13554&amp;p=145127#p145127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13554&amp;p=145127#p145127"/>
<title type="html"><![CDATA[Paroswanie łańcucha, RS485, STM32F103RBT6]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13554&amp;p=145127#p145127"><![CDATA[
Potrzebuję skomunikować się z pewnym urządzeniem po RS485. Ramki danych jakie wysyła to ustrojstwo to coś takiego:<br />[SOH][adress][RS][cmd][RS][data][RS][data_crc8][EOT]<br /><br />przykładowa ramka: <br />[SOH]<strong>10</strong>[RS]<strong>THO</strong>[RS]<strong>124F80</strong>[RS]<strong>42</strong>[EOT]<br /><br />Wiec, napisałem sobie takie 2 funkcję:<br /><br /><strong>1. Funkcja parsujaca odebrane dane:</strong><br />[syntax=c]volatile TASK ask;<br />volatile TANS ans;<br />const TWS whitesigns = { 0x01, 0x1E, 0x04};    // SOH | RS | EOT<br /><br />int8_t ParseUsartData( char * buf )<br />{<br />char * cmd_ptr;//wswkaźnik komendy<br />char * rest;<br />uint8_t i=0, len;<br /><br />if( strpbrk(buf, whitesigns.SOH) )//wyszukanie w buforze &#91;SOH&#93; StartOfHeader<br />{<br />cmd_ptr=strtok_r(buf, whitesigns.RS, &amp;rest); //Wyluskanie lancucha z adresem<br />if( strlen(cmd_ptr) ) return 2;//Sprawdzanie czy lancuch nie jest pusty<br />ask.adress=atoi(cmd_ptr);//Konwersja cmd_ptr na int i zapis wartosci int do struktury ASK<br />if( DEVICE_ADDR != ask.adress )//Sprawdzenie czy &quot;moj adres&quot; jesli nie przerwij<br />{<br />ask.adress=0;//wyzerowanie odebranego adresu<br />return 0;//zgloszenie innego adresu<br />}<br /><br />cmd_ptr=strtok_r(buf, whitesigns.RS, &amp;rest);//Wyluskanie lancucha z komenda przed &#91;RS&#93;<br />len = strlen(cmd_ptr);//Wyluskanie dlugosci odebranej komendy<br /><br />for(i=0; i&lt;NO_CMD; i++)//Porownaie odebranej komendy z komendami w pamięci<br />{<br />if( len &amp;&amp; 0==strncasecmp(cmd_ptr, tcmd&#91;i&#93;.cmd, len) )<br />{<br />ask.cmd_id=tcmd&#91;i&#93;.id;//Wypełnienie pola cmd struktury ASK<br />}<br />}<br /><br />cmd_ptr=strtok_r(NULL, whitesigns.RS, &amp;rest); //Wyluskanie lancucha z danymi przed &#91;RS&#93;<br />if( strlen(cmd_ptr) ) return 3;//Sprawdzanie czy lancuch nie jest pusty<br />ask.data=atoi(cmd_ptr);//Konwersja cmd_ptr na int i zapis wartosci int do struktury ASK<br /><br />cmd_ptr=strtok_r(NULL, whitesigns.EOT, &amp;rest);//Wyluskanie lancucha z CRC8 dla danych przed &#91;EOT&#93;<br />if( strlen(cmd_ptr) ) return 4;//Sprawdzanie czy lancuch nie jest pusty<br />ask.data_crc8=atoi(cmd_ptr);//Konwersja cmd_ptr na int i zapis wartosci int do struktury ASK<br /><br />return 1; //Potwierdzenie odbioru danych<br />}<br />else<br />{<br />return -1;//Wyslanie ERR<br />}<br />}[/syntax]<br /><br /><strong>2. Funkcja &quot;analizująca&quot;:</strong><br />[syntax=c]void Make485Cmd( char * ptrbuf )<br />{<br />char tmp&#91;10&#93;;<br />int8_t state = ParseUsartData( ptrbuf );<br /><br />if( 0 == state )<br />{<br />SendMode(TRUE);//zalaczenia nadajnika<br />rs485_delay();<br /><br />USART_Puts( USART1, itoa(state, tmp, 10) );//DEBUG<br />USART_Puts( USART1, &quot;ErrAdr\r&quot; );//DEBUG<br />USART_Puts( USART1, ParseBuf );//DEBUG<br />}<br />if( 1 == state )<br />{<br />switch( ask.cmd_id )<br />{<br />case 0x01:nfo_service(&amp;ask);break;<br />case 0x02:break;<br />case 0x03:break;<br />case 0x04:break;<br />case 0x05:break;<br />}<br />}<br />if( 2 == state )<br />{<br />SendMode(TRUE);//zalaczenia nadajnika<br />rs485_delay();<br /><br />USART_Puts( USART1, itoa(state, tmp, 10) );//DEBUG<br />USART_Puts( USART1, &quot;StrEmpty\r&quot; );//DEBUG<br />USART_Puts( USART1, ParseBuf );//DEBUG<br /><br /><br />}<br />if( -1 == state )<br />{<br />SendMode(TRUE);//zalaczenia nadajnika<br />rs485_delay();<br /><br />USART_Puts( USART1, itoa(state, tmp, 10) );//DEBUG<br />USART_Puts( USART1, &quot;FrameError\r&quot; );//DEBUG<br />USART_Puts( USART1, ParseBuf );//DEBUG<br />}<br />}[/syntax]<br /><br />Problem polega na tym, że jak wysyłam z terminala jakąś przykładowa ramkę funkcja <strong><em>ParseUsartData</em></strong> zwraca mi wartość -1 , tzn. że niby w buforze nie ma znaku SOH (Pierwszy if w funkcji <strong><em>ParseUsartData</em></strong>). Natomiast jak odeślę ten bufor z powrotem do kompa (wewnątrz funkcji <strong><em>Make485Cmd</em></strong>)to niby wszystko w nim jest. Zaznaczony fragment na screenie. Chciałbym prosić kogoś o podpowiedz co robię źle? bo już pomysły mi się skończyły...<br /><br /><strong>screen z terminala:</strong><br /><a href="https://obrazkiforum.atnel.pl/335/39e8561da714479b142fa0977992e696.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/335/39e8561da714479b142fa0977992e696.jpg" alt="Obrazek" /></a><br /><br /><em>P.S.<br />w polu Send wpisane są takie kocie rzeczy jak $01. Bray Terminal rozumie to jako 0x01 itd.</em><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=335">simoon87</a> — 11 lis 2015, o 21:25</p><hr />
]]></content>
</entry>
</feed>