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

📄 uart.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 185   2                      SPIbuf[7]=EOT;          // 结束
 186   2      
 187   2                      COMENABLE;                      // 允许串口中断
 188   2                      Dir=1;                          // 485发送
 189   2                      time_out=10;            // 100ms完成发送
 190   2                      trans_ctr=0;
 191   2                      trans_size=8;
 192   2                      SBUF=SPIbuf[0];         // 发送
 193   2                      comm_ok=TRUE;           // 串口通信正常
 194   2                      while(trans_size)
 195   2                      {
 196   3                              if(time_out==0)
 197   3                              {
 198   4                                      comm_ok=FALSE;  // 串口通信失败
 199   4                                      break;
 200   4                              }
 201   3                      }                                       // 直到数据传输完毕
 202   2                      Dir=0;                          // 关闭485发送
 203   2              }
 204   1              else
 205   1              {
 206   2                      trans_ctr=0;
 207   2                      checksum=0;
 208   2                      trans_buf[trans_ctr]=SOH;
 209   2                      checksum+=trans_buf[trans_ctr];
 210   2                      trans_ctr++;
 211   2                      trans_buf[trans_ctr]=haddr;                     // 源地址
 212   2                      checksum+=trans_buf[trans_ctr];
 213   2                      trans_ctr++;
 214   2                      trans_buf[trans_ctr]=laddr;
 215   2                      checksum+=trans_buf[trans_ctr];
 216   2                      trans_ctr++;
 217   2                      trans_buf[trans_ctr]='0';                       // 目标地址
 218   2                      checksum+=trans_buf[trans_ctr];
 219   2                      trans_ctr++;
 220   2                      trans_buf[trans_ctr]='0';
 221   2                      checksum+=trans_buf[trans_ctr];
 222   2                      trans_ctr++;
 223   2                      trans_buf[trans_ctr]='0';                       // 信息号
 224   2                      checksum+=trans_buf[trans_ctr];
 225   2                      trans_ctr++;
 226   2      
 227   2                      switch(message)
 228   2                      {
 229   3                      case ACK:
 230   3                              trans_buf[trans_ctr++]=ACK;
 231   3                              break;
 232   3                      case NAK:
 233   3                              trans_buf[trans_ctr++]=NAK;
 234   3                              break;
 235   3                      case RTL:
 236   3                              trans_buf[trans_ctr]=STX;
 237   3                              checksum+=trans_buf[trans_ctr];
 238   3                              trans_ctr++;
 239   3      
 240   3                              for(i=0; i<MAX_REALREC_SIZE;i++)        // 发送实时记录
 241   3                              {
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 5   

 242   4                                      trans_buf[trans_ctr]=RTrecord[i];
 243   4                                      checksum+=trans_buf[trans_ctr];
 244   4                                      trans_ctr++;
 245   4                              }
 246   3      
 247   3                              trans_buf[trans_ctr]=ETX;                       
 248   3                              checksum+=trans_buf[trans_ctr];
 249   3                              trans_ctr++;
 250   3      
 251   3                              checksum=~checksum+1;                   // 计算校验和
 252   3      
 253   3                              temp=(checksum&0xF0)>>4;
 254   3                              trans_buf[trans_ctr]=Hex_ascii(temp);
 255   3                              trans_ctr++;
 256   3      
 257   3                              temp=checksum&0x0F;
 258   3                              trans_buf[trans_ctr]=Hex_ascii(temp);
 259   3                              trans_ctr++;
 260   3                              break;
 261   3                      default:
 262   3                              break;
 263   3                      }
 264   2      
 265   2                      trans_buf[trans_ctr++]=EOT;
 266   2      
 267   2                      COMENABLE;                      // 允许串口中断
 268   2                      Dir=1;                          // 485发送
 269   2                      trans_size=trans_ctr;
 270   2                      trans_ctr=0;
 271   2                      SBUF=trans_buf[0];
 272   2                      time_out=200;           // 200ms发送完毕
 273   2                      comm_ok=TRUE;           // 通信正常
 274   2                      while(trans_size)
 275   2                      {
 276   3                              if(time_out==0)
 277   3                              {
 278   4                                      comm_ok=FALSE;  // 通信失败
 279   4                                      break;
 280   4                              }
 281   3                      }                                       // 直到数据传输完毕
 282   2                      Dir=0;                          // 关闭485发送
 283   2              }
 284   1      
 285   1              ClearRcvBuf();                  // 清接收缓冲区
 286   1      }
 287          
 288          ///////////////////////////////////////////////////////////////////////////////
 289          // 读取并分析接收缓冲区数据
 290          ///////////////////////////////////////////////////////////////////////////////
 291          uchar readbuf()
 292          {
 293   1              idata uchar curstate;           // 当前信息类别
 294   1              idata uchar nextstate;          // 下一个信息类别
 295   1              idata uchar temp;
 296   1              idata uint  i;
 297   1              idata uint  strindex;
 298   1              bdata bit   endofmessage;       // 数据包是否结束
 299   1              bdata bit   errordect;          // 是否有错误检测到
 300   1              bdata bit   wrongaddr;          // 地址是否错误
 301   1      
 302   1              curstate=STATE_SOH;                     // 当前信息状态
 303   1              nextstate=STATE_SOH;            // 下一个信息状态
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 6   

 304   1      
 305   1              i=SOH_crt;                                      // 数据指针索引
 306   1              strindex=0;                                     // 命令体数据指针索引
 307   1              errordect=FALSE;
 308   1              wrongaddr=FALSE;
 309   1              endofmessage=FALSE;
 310   1      
 311   1              checksum=0;                                     // 校验和
 312   1              testchecksum=0;
 313   1      
 314   1              while (TRUE)
 315   1              {
 316   2                      curstate=nextstate;             // 当前状态从SOH开始
 317   2      
 318   2                      switch(curstate)
 319   2                      {
 320   3                      case STATE_SOH:
 321   3                              if(maxtrans)
 322   3                                      temp=SPIbuf[i];
 323   3                              else
 324   3                                      temp=recv_buf[i];
 325   3      
 326   3                              if(temp!=SOH)
 327   3                              {
 328   4                                      errordect=TRUE;                                 // 有错误检测到
 329   4                              }
 330   3                              else
 331   3                              {
 332   4                                      checksum+=SOH;
 333   4                                      nextstate=STATE_SRC_ADDR;               // 检查源地址
 334   4      
 335   4                                      i++;                                                    // 数据指针下移
 336   4                              }
 337   3                              break;
 338   3                      case STATE_SRC_ADDR:
 339   3                              if(maxtrans)
 340   3                                      temp=SPIbuf[i];
 341   3                              else
 342   3                                      temp=recv_buf[i];
 343   3      
 344   3                              checksum+=temp;                                         // 源地址为00
 345   3                              if(temp!='0')
 346   3                                      wrongaddr=TRUE;                                 // 源地址错误
 347   3                              else
 348   3                              {
 349   4                                      i++;                                                    // 数据指针下移
 350   4      
 351   4                                      if(maxtrans)
 352   4                                              temp=SPIbuf[i];
 353   4                                      else
 354   4                                              temp=recv_buf[i];
 355   4                                      checksum+=temp;
 356   4      
 357   4                                      if(temp!='0')
 358   4                                              wrongaddr=TRUE;                         // 源地址错误
 359   4      
 360   4                                      i++;                                                    // 数据指针下移
 361   4                              }
 362   3                              nextstate=STATE_DST_ADDR;                       // 检查目标地址
 363   3                              break;
 364   3                      case STATE_DST_ADDR:
 365   3                              if(maxtrans)
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 7   

 366   3                                      temp=SPIbuf[i];
 367   3                              else
 368   3                                      temp=recv_buf[i];
 369   3                              checksum+=temp;
 370   3      
 371   3                              if(temp!=haddr)                                         // 地址高位
 372   3                                      wrongaddr=TRUE;                                 // 地址错误
 373   3                              else
 374   3                              {
 375   4                                      i++;                                                    // 数据指针下移
 376   4                                      if(maxtrans)
 377   4                                              temp=SPIbuf[i];

⌨️ 快捷键说明

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