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

📄 uart.lst

📁 门禁控制器源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 378   4                                      else
 379   4                                              temp=recv_buf[i];
 380   4      
 381   4                                      checksum+=temp;
 382   4                                      if(temp!=laddr)
 383   4                                              wrongaddr=TRUE;                         // 地址不正确
 384   4      
 385   4                                      i++;                                                    // 数据指针下移
 386   4                              }
 387   3                              nextstate=STATE_MSG_NUM;                        // 检查信息号
 388   3                              break;
 389   3                      case STATE_MSG_NUM:
 390   3                              if(maxtrans)
 391   3                                      temp=SPIbuf[i];
 392   3                              else
 393   3                                      temp=recv_buf[i];
 394   3      
 395   3                              if(temp<'0'||temp>'9')
 396   3                                      errordect=TRUE;                                 // 通信错误
 397   3      
 398   3                              checksum+=temp;
 399   3                              i++;                                                            // 数据指针下移
 400   3                              nextstate=STATE_STX;                            // 检查STX
 401   3                              break;
 402   3                      case STATE_STX:
 403   3                              if(maxtrans)
 404   3                                      temp=SPIbuf[i];
 405   3                              else
 406   3                                      temp=recv_buf[i];
 407   3      
 408   3                              if(temp==STX)
 409   3                              {
 410   4                                      checksum+=STX;
 411   4                                      nextstate=STATE_MSG_STRING;
 412   4                              }
 413   3                              else
 414   3                                      errordect=TRUE;                                 // 数据包不正确
 415   3      
 416   3                              i++;                                                            // 数据指针下移
 417   3                              break;
 418   3                      case STATE_MSG_STRING:
 419   3                              strindex=0;
 420   3                              while(TRUE)
 421   3                              {
 422   4                                      if(maxtrans)
 423   4                                              temp=SPIbuf[i];
 424   4                                      else
 425   4                                              temp=recv_buf[i];
 426   4      
 427   4                                      if(temp==ETX)
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 8   

 428   4                                      {
 429   5                                              checksum+=ETX;
 430   5                                              break;
 431   5                                      }
 432   4                                      checksum+=temp;
 433   4      
 434   4                                      i++;                                            // 数据指针下移
 435   4                                      strindex++;
 436   4                                      if(strindex>MAX_COMMAND_LENGTH)
 437   4                                      {
 438   5                                              errordect=TRUE;                 // 命令超长
 439   5                                              break;
 440   5                                      }
 441   4                              }
 442   3      
 443   3                              i++;                                            // 数据指针下移
 444   3                              nextstate=STATE_CHECKSUM;       // 检查校验和
 445   3                              break;
 446   3                      case STATE_CHECKSUM:
 447   3                              if(maxtrans)
 448   3                                      temp=SPIbuf[i];
 449   3                              else
 450   3                                      temp=recv_buf[i];
 451   3      
 452   3                              testchecksum=Asc_hex(temp);
 453   3                              i++;
 454   3      
 455   3                              if(maxtrans)
 456   3                                      temp=SPIbuf[i];
 457   3                              else
 458   3                                      temp=recv_buf[i];
 459   3      
 460   3                              testchecksum=testchecksum<<4;
 461   3                              testchecksum+=Asc_hex(temp);
 462   3                              temp=(testchecksum+checksum)&0xFF;
 463   3                              if(temp!=0)
 464   3                                      errordect=TRUE;         // 校验和错
 465   3      
 466   3                              i++;
 467   3                              nextstate=STATE_EOT;            // 检查结束
 468   3                              break;
 469   3                      case STATE_EOT:
 470   3                              if(maxtrans)
 471   3                                      temp=SPIbuf[i];
 472   3                              else
 473   3                                      temp=recv_buf[i];
 474   3      
 475   3                              if(temp!=EOT)
 476   3                                      errordect=TRUE;                 // 没有结束错误
 477   3                              else
 478   3                                      endofmessage=TRUE;              // 信息包完整
 479   3                              break;
 480   3                      }
 481   2      
 482   2                  if(errordect||endofmessage||wrongaddr)
 483   2                      break;
 484   2              }
 485   1      
 486   1              if(wrongaddr)
 487   1              {
 488   2                      ClearRcvBuf();          // 清接收缓冲区
 489   2                      return FALSE;           // 地址错误直接返回,不进行任何操作
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 9   

 490   2              }
 491   1      
 492   1              if(errordect)
 493   1              {
 494   2                      ClearRcvBuf();          // 清接收缓冲区
 495   2                      sendmessage(NAK);
 496   2                      return FALSE;           // 接收错误             
 497   2              }
 498   1              
 499   1              if(endofmessage)
 500   1              {       
 501   2                  return TRUE;                // 接收正确
 502   2              }
 503   1      }
 504          
 505          ///////////////////////////////////////////////////////////////////////////////
 506          // 上位机命令处理过程
 507          ///////////////////////////////////////////////////////////////////////////////
 508          void host_proc()
 509          {
 510   1              idata uint  i;
 511   1              idata uchar temp;
 512   1      
 513   1              if(checkmessage()==TRUE)
 514   1              {
 515   2                      if(readbuf()==TRUE)                                     // 处理具体的上位机命令
 516   2                      {
 517   3                              if(maxtrans)                            // 大数据量传输模式
 518   3                              {
 519   4                                      if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
 520   4                                              &&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='S'))
 521   4                                      {
 522   5                                              sendmessage(ACK);               // 发送ACK,告诉主机正常执行
 523   5      
 524   5                                              if(comm_ok)                             // 通信正常修改参数
 525   5                                                      maxtrans=FALSE;         // 切换为小数据量传输模式
 526   5                                      }
 527   4                                      else if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
 528   4                                              &&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='L'))
 529   4                                      {
 530   5                                              sendmessage(ACK);               // 发送ACK,告诉主机正常执行
 531   5      
 532   5                                              if(comm_ok)                             // 通信正常修改参数
 533   5                                                      maxtrans=FALSE;         // 切换为小数据量传输模式
 534   5                                      }
 535   4                                      else
 536   4                                      {
 537   5                                              SPIbuf[1]='0';                  // 修改地址向DSP发送
 538   5                                              SPIbuf[2]='1';
 539   5                                              SPIbuf[3]='0';
 540   5                                              SPIbuf[4]='2';
 541   5      
 542   5                                              // 重新计算校验和
 543   5                                              i=0;
 544   5                                              checksum=0;
 545   5                                              while(SPIbuf[i]!=ETX)
 546   5                                              {
 547   6                                                      checksum+=SPIbuf[i];
 548   6                                                      i++;
 549   6                                              }
 550   5                                              checksum+=SPIbuf[i];    // ETX
 551   5      
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 10  

 552   5                                              checksum=~checksum+1;
 553   5                      
 554   5                                              temp=(checksum&0xF0)>>4;
 555   5                                              i++;
 556   5                                              SPIbuf[i]=Hex_ascii(temp);
 557   5                      
 558   5                                              temp=checksum&0x0F;
 559   5                                              i++;
 560   5                                              SPIbuf[i]=Hex_ascii(temp);
 561   5      
 562   5                                              if(Send_spi())                  // 直接向DSP发送
 563   5                                              {
 564   6                                                      SPIbuf[1]=haddr;        // 修改地址向上位机发送
 565   6                                                      SPIbuf[2]=laddr;
 566   6                                                      SPIbuf[3]='0';
 567   6                                                      SPIbuf[4]='0';
 568   6              
 569   6                                                      // 重新计算校验和
 570   6                                                      i=0;

⌨️ 快捷键说明

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