⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmodem_8c-source.html

📁 avr cpu 库源代码 对avr单片机编程很有帮助
💻 HTML
📖 第 1 页 / 共 2 页
字号:
00124         {00125             <span class="comment">// is this the packet we were waiting for?</span>00126             <span class="keywordflow">if</span>(xmbuf[1] == seqnum)00127             {00128                 <span class="comment">// write/deliver data</span>00129                 write(&amp;xmbuf[3], pktsize);00130                 <span class="comment">//spiflashWrite(flashaddr, pktsize, &amp;xmbuf[3]);</span>00131                 totalbytes += pktsize;00132                 <span class="comment">// next sequence number</span>00133                 seqnum++;00134                 <span class="comment">// reset retries</span>00135                 retry = XMODEM_RETRY_LIMIT;00136                 <span class="comment">// reply with ACK</span>00137                 response = ACK;00138                 <span class="keywordflow">continue</span>;00139             }00140             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(xmbuf[1] == (<span class="keywordtype">unsigned</span> char)(seqnum-1))00141             {00142                 <span class="comment">// this is a retransmission of the last packet</span>00143                 <span class="comment">// ACK and move on</span>00144                 response = ACK;00145                 <span class="keywordflow">continue</span>;00146             }00147             <span class="keywordflow">else</span>00148             {00149                 <span class="comment">// we are completely out of sync</span>00150                 <span class="comment">// cancel transmission</span>00151                 <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>();00152                 xmodemOut(CAN);00153                 xmodemOut(CAN);00154                 xmodemOut(CAN);00155                 <span class="keywordflow">return</span> XMODEM_ERROR_OUTOFSYNC;00156             }00157         }00158         <span class="keywordflow">else</span>00159         {00160             <span class="comment">// packet was corrupt</span>00161             <span class="comment">// NAK it and try again</span>00162             retry--;00163             <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>();00164             response = NAK;00165             <span class="keywordflow">continue</span>;00166         }00167     }00168 00169     <span class="comment">// exceeded retry count</span>00170     <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>();00171     xmodemOut(CAN);00172     xmodemOut(CAN);00173     xmodemOut(CAN);00174     <span class="keywordflow">return</span> XMODEM_ERROR_RETRYEXCEED;00175 }00176 00177 <a name="l00178"></a><a class="code" href="group__xmodem.html#ga2">00178</a> <span class="keywordtype">long</span> <a class="code" href="group__xmodem.html#ga2">xmodemTransmit</a>( <span class="keywordtype">int</span> (*read)(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">int</span> size) )00179 {00180     <span class="comment">// still to be written</span>00181     <span class="keywordflow">return</span> 0;00182 }00183 00184 uint16_t crc_xmodem_update(uint16_t crc, uint8_t data)00185 {00186     <span class="keywordtype">int</span> i;00187 00188     crc = crc ^ ((uint16_t)data &lt;&lt; 8);00189     <span class="keywordflow">for</span> (i=0; i&lt;8; i++)00190     {00191         <span class="keywordflow">if</span>(crc &amp; 0x8000)00192             crc = (crc &lt;&lt; 1) ^ 0x1021;00193         <span class="keywordflow">else</span>00194             crc &lt;&lt;= 1;00195     }00196 00197     <span class="keywordflow">return</span> crc;00198 }00199 <a name="l00200"></a><a class="code" href="group__xmodem.html#ga3">00200</a> <span class="keywordtype">int</span> <a class="code" href="group__xmodem.html#ga3">xmodemCrcCheck</a>(<span class="keywordtype">int</span> crcflag, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> size)00201 {00202     <span class="comment">// crcflag=0 - do regular checksum</span>00203     <span class="comment">// crcflag=1 - do CRC checksum</span>00204 00205     <span class="keywordflow">if</span>(crcflag)00206     {00207         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> crc=0;00208         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> pktcrc = (buffer[size]&lt;&lt;8)+buffer[size+1];00209         <span class="comment">// do CRC checksum</span>00210         <span class="keywordflow">while</span>(size--)00211             crc = crc_xmodem_update(crc, *buffer++);00212         <span class="comment">// check checksum against packet</span>00213         <span class="keywordflow">if</span>(crc == pktcrc)00214             <span class="keywordflow">return</span> 1;00215     }00216     <span class="keywordflow">else</span>00217     {00218         <span class="keywordtype">int</span> i;00219         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cksum = 0;00220         <span class="comment">// do regular checksum</span>00221         <span class="keywordflow">for</span>(i=0; i&lt;size; ++i)00222         {00223             cksum += buffer[i];00224         }00225         <span class="comment">// check checksum against packet</span>00226         <span class="keywordflow">if</span>(cksum == buffer[size])00227             <span class="keywordflow">return</span> 1;00228     }00229 00230     <span class="keywordflow">return</span> 0;00231 }00232 00233 <a name="l00234"></a><a class="code" href="group__xmodem.html#ga4">00234</a> <span class="keywordtype">int</span> <a class="code" href="group__xmodem.html#ga4">xmodemInTime</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> timeout)00235 {00236     <span class="keywordtype">int</span> c=-1;00237 00238     <span class="keywordflow">while</span>( (timeout--) &amp;&amp; ((c=xmodemIn()) &lt; 0) )00239         <a class="code" href="group__timer.html#ga10">timerPause</a>(1);00240 00241     <span class="keywordflow">return</span> c;00242 }00243 <a name="l00244"></a><a class="code" href="group__xmodem.html#ga5">00244</a> <span class="keywordtype">void</span> <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>(<span class="keywordtype">void</span>)00245 {00246     <span class="keywordflow">while</span>(<a class="code" href="group__xmodem.html#ga4">xmodemInTime</a>(XMODEM_TIMEOUT_DELAY) &gt;= 0);00247 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:08 2006 for Procyon AVRlib by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -