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

📄 xmodem.lst

📁 c8051f310xmodembootloader.rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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:        // 请求重发
 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); // 重发
 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          // 接收数据帧
 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协议接收文件
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:                     // 请求传送
 259   3                                      serial_put_char('C');   // 发送请求符
 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);    // 回送应答符
 281   4                                              return (1);                                             // 结束
 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();           // 收帧计数
 292   3                                      if (nextChar != pack_counter)           // 帧计数是否正确
 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)) //收数据
 301   3                                      {
 302   4                                              fwrite(frame_data, XMODEM_DATA_SIZE);   // 写入flash
 303   4                                              ++pack_counter;                                                 // 计数加1
C51 COMPILER V8.16   XMODEM                                                                12/09/2009 15:02:55 PAGE 6   

 304   4                                              ntry = 0;                               
 305   4                                              state = WAIT_SOH;                                               // 等下一个帧
 306   4                                              serial_put_char(XMODEM_ACK);                    // 发送应答
 307   4                                      }
 308   3                                      else    // 收数据错误
 309   3                                      {
 310   4                                              if (++ntry >9)  // 错误次数超出限制
 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);    // 请求重传
 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)

⌨️ 快捷键说明

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