?? xmodem.lst
字號(hào):
169 4 ack_id = XMODEM_EOT;
170 4 complete = 1;
171 4 while(ack_id != XMODEM_ACK) //Waiting for complete ACK
172 4 {
173 5 serial_put_char(XMODEM_EOT);
174 5 ack_id = serial_get_char();
175 5 }
176 4 break;
177 4 }
178 3 break;
179 3
C51 COMPILER V8.16 XMODEM 12/09/2009 15:02:55 PAGE 4
180 3 case XMODEM_NAK: // 請(qǐng)求重發(fā)
181 3 if( retry_num++ > 10) //Retry too many times
182 3 {
183 4 complete = 1;
184 4 serial_put_char(XMODEM_CAN);
185 4 serial_put_char(XMODEM_CAN);
186 4 serial_put_char(XMODEM_CAN);
187 4 serial_put_char(XMODEM_CAN);
188 4 }
189 3 else
190 3 {
191 4 SendRecord(frame_data); // 重發(fā)
192 4 ack_id = serial_get_char();
193 4 }
194 3 break;
195 3
196 3 default:
197 3 complete = 1;
198 3 serial_put_char(XMODEM_CAN);
199 3 serial_put_char(XMODEM_CAN);
200 3 serial_put_char(XMODEM_CAN);
201 3 serial_put_char(XMODEM_CAN);
202 3 break;
203 3 }
204 2 }
205 1 return 0;
206 1 }
207
208 // 接收數(shù)據(jù)幀
209 int GetRecord(unsigned char blocknum, unsigned char *dest)
210 {
211 1 unsigned char nextChar;
212 1 int size;
213 1 unsigned int chk;
214 1
215 1 nextChar = serial_get_char();
216 1 if (nextChar != (255-blocknum))
217 1 {
218 2 return 0;
219 2 }
220 1 chk = 0;
221 1 for (size = 0; size < XMODEM_DATA_SIZE; ++size)
222 1 {
223 2 nextChar = serial_get_char();
224 2 chk = crc16_tab[((chk>>8) ^ nextChar) & 0xFF] ^ (chk << 8);
225 2 dest[size] = nextChar;
226 2 }
227 1 nextChar = serial_get_char();
228 1 if (nextChar != ((chk >> 8) & 0xFF)) return 0;
229 1 nextChar = serial_get_char();
230 1 if (nextChar != (chk& 0xFF)) return 0;
231 1 return 1;
232 1 }
233
234 #define INVALID_STATE 0
235 #define WAITING_START 1
236 #define WAIT_SOH 2
237 #define RX_PACKET 3
238 #define RX_EOT 4
239 #define SEND_NAK 5
240
241 // xmodem協(xié)議接收文件
C51 COMPILER V8.16 XMODEM 12/09/2009 15:02:55 PAGE 5
242 int xmodem_rx(void)
243 {
244 1 char ntry;
245 1 char state;
246 1 unsigned char nextChar;
247 1
248 1 fopen();
249 1
250 1 ntry = 0;
251 1 pack_counter = 1;
252 1 state = WAITING_START;
253 1
254 1 while(1)
255 1 {
256 2 switch(state)
257 2 {
258 3 case WAITING_START: // 請(qǐng)求傳送
259 3 serial_put_char('C'); // 發(fā)送請(qǐng)求符
260 3 if (WaitChar(3))
261 3 {
262 4 nextChar = serial_get_char(); // 接收幀頭
263 4 if (nextChar == XMODEM_HEAD)
264 4 {
265 5 state = RX_PACKET; // 收到幀頭
266 5 }
267 4 }
268 3 break;
269 3
270 3 case WAIT_SOH: // 等幀頭
271 3 nextChar = serial_get_char(); // 收幀頭
272 3 if (nextChar == XMODEM_HEAD)
273 3 {
274 4 state = RX_PACKET;
275 4 }
276 3
277 3 else if (nextChar == XMODEM_EOT) // 收到終止符
278 3 {
279 4 state = RX_EOT;
280 4 serial_put_char(XMODEM_ACK); // 回送應(yīng)答符
281 4 return (1); // 結(jié)束
282 4 }
283 3
284 3 else if (nextChar == XMODEM_CAN) // 取消
285 3 {
286 4 return (1);
287 4 }
288 3 break;
289 3
290 3 case RX_PACKET: // 收幀
291 3 nextChar = serial_get_char(); // 收幀計(jì)數(shù)
292 3 if (nextChar != pack_counter) // 幀計(jì)數(shù)是否正確
293 3 {
294 4 serial_put_char(XMODEM_CAN); // 不正確,取消傳送
295 4 serial_put_char(XMODEM_CAN);
296 4 serial_put_char(XMODEM_CAN);
297 4 serial_put_char(XMODEM_CAN);
298 4 return (-1);
299 4 }
300 3 if (GetRecord(pack_counter, frame_data)) //收數(shù)據(jù)
301 3 {
302 4 fwrite(frame_data, XMODEM_DATA_SIZE); // 寫(xiě)入flash
303 4 ++pack_counter; // 計(jì)數(shù)加1
C51 COMPILER V8.16 XMODEM 12/09/2009 15:02:55 PAGE 6
304 4 ntry = 0;
305 4 state = WAIT_SOH; // 等下一個(gè)幀
306 4 serial_put_char(XMODEM_ACK); // 發(fā)送應(yīng)答
307 4 }
308 3 else // 收數(shù)據(jù)錯(cuò)誤
309 3 {
310 4 if (++ntry >9) // 錯(cuò)誤次數(shù)超出限制
311 4 {
312 5 serial_put_char(XMODEM_CAN); // 取消傳送
313 5 serial_put_char(XMODEM_CAN);
314 5 serial_put_char(XMODEM_CAN);
315 5 serial_put_char(XMODEM_CAN);
316 5 return (-1);
317 5 }
318 4 state = WAIT_SOH;
319 4 serial_put_char(XMODEM_NAK); // 請(qǐng)求重傳
320 4 }
321 3 break;
322 3
323 3 default:
324 3 break;
325 3 }
326 2 }
327 1 return 0;
328 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 693 ----
CONSTANT SIZE = 512 ----
XDATA SIZE = 128 ----
PDATA SIZE = ---- ----
DATA SIZE = 1 25
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -