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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-03T09:58:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10895&amp;mode</id>
<entry>
<author><name><![CDATA[n326]]></name></author>
<updated>2015-03-03T09:58:06+01:00</updated>
<published>2015-03-03T09:58:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10895&amp;p=121725#p121725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10895&amp;p=121725#p121725"/>
<title type="html"><![CDATA[Przygotowanie danych UART, obliczanie CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10895&amp;p=121725#p121725"><![CDATA[
Witam,<br />W programie istnieje zmienna globalna <span style="text-decoration: underline">wejscia1</span>, chciałbym tą zmienną &quot;ładnie ubrać&quot; tak aby mogła zostać wysłana przez UART, oraz na końcu dodać sumę kontrolną ModbusCRC.<br /><br />Sumę kontrolną obliczam za pomocą takiej funkcji:<br />[syntax=c]// ==== OBLICZANIE CRC<br />uint16_t ModbusCRC(char * buf, uint8_t size){<br />   uint16_t crc = 0xffff;<br />   int i;<br /><br />   while(size--){<br />      crc ^= *buf;<br />      buf++;<br />      for(i=0; i&lt;8; i++){<br />         if(crc &amp; 1){<br />            crc &gt;&gt;= 1;<br />            crc ^= 0xA001;<br />         }<br />         else{<br />            crc &gt;&gt;= 1;<br />         }<br />      }<br />   }<br />   return crc;<br />}[/syntax]<br /><br />Natomiast funkcja przygotowująca ramkę wygląda tak:<br />Adres jest to również zmienna typu char przechowująca dwu znakowy adres modułu.<br /><br />[syntax=c]//funkcja zwraca status wszystkich wejsc<br />void get_in_all(void){<br />char status&#91;20&#93;=&quot;+&quot;;<br />char bufor&#91;2&#93;;<br />const char *znak=&quot;^&quot;;<br /><br />strcat(status,adres);<br />strcat(status,&quot;^3^&quot;);<br />itoa(wejscia1,bufor,2);<br />strcat(status,bufor);<br />strcat(status,znak);<br /><br /><br />// == CRC<br /><br />uint16_t crc;<br />char *b;<br />//obliczanie sumy kontrolnej, dodawanie na koniec ramki<br />crc = ModbusCRC(status, sizeof(status));<br />b = itoa(crc,bufor,2);<br />strcat(status,b);<br />crc &gt;&gt;= 8;<br />b = itoa(crc,bufor,2);<br />strcat(status,b);<br /><br /><br />       //wyslanie ramki danych<br />uart_puts(status);<br />}[/syntax]<br /><br />Docelowo wysłany łańcuch ma wyglądać tak:<br /><br /><span style="color: #0000FF"><strong>+</strong></span><em>ADRES</em><span style="color: #0000FF"><strong>^3^</strong></span><em>TUTAJ ZMIENNA WYJSCIA1</em><span style="color: #0000FF"><strong>^</strong></span><em>CRC</em><br /><br />Domyślam się, że robię coś źle przy próbie zamiany zwracanej sumy kontrolnej jako uint16_t do dwóch char. Może ktoś ma pomysł jak powinno to wyglądać prawidłowo, bardziej zoptymalizowane (bo pewnie coś da się uprościć)? <br /><br />Pozdrawiam.<br /><br />EDIT:<br /><span style="color: #0080FF">Chyba już sobie poradziłem - troszkę źle podchodziłem do tego - za bardzo zainspirowałem się funkcją porównującą CRC. Poniżej podaję kod funkcji zwracającej wersję firmware sterownika gdzie obliczanie CRC i przygotowanie ramki działa poprawnie:</span><br />[syntax=c]//wersja firmware<br />void get_fw(void){<br />char status&#91;100&#93;=&quot;A&quot;;<br />strcat(status,adres);<br />strcat(status,&quot;^5^IOC_REV1_FW0011_20150302^&quot;);<br /><br />uint16_t crc;<br />char *b;<br />char bufor&#91;2&#93;;<br />crc = ModbusCRC(status, strlen(status));<br />b = itoa(crc,bufor,16);<br />strcat(status,b);<br /><br />uart_puts(status);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1751">n326</a> — 3 mar 2015, o 09:58</p><hr />
]]></content>
</entry>
</feed>