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

📄 zb.lst

📁 基于电力载波芯片3106开发的,在载波和485之间互相转换
💻 LST
📖 第 1 页 / 共 2 页
字号:
 192              函数名  :    ZB_Rx
 193              功能    :    载波接收数据
 194              输入    :    无
 195              输出    :    无
 196          ===============================================*/
 197          {
 198   1          if (1 == ZB_GetSyncFlag){      /*接收头标志*/
 199   2      
 200   2              ZB_HeadDat <<= 1;
 201   2              if (1 == ZB_RS){           /*判断P3.7,载波数据收发位*/
 202   3                  ZB_HeadDat |= 1;
 203   3              }
 204   2      
 205   2              if (0x09af == ZB_HeadDat){ /*同步头接收成功*/
 206   3      
 207   3                  LED_ZB = 0;            /*开载波接收指示灯*/
 208   3      
 209   3                  ZB_GetSyncFlag = 0;
 210   3                  ZB_GetDatFlag  = 1;     
 211   3              }
 212   2          }else if (1 == ZB_GetDatFlag){ /*开始接收数据部分*/
 213   2              ZB_RcvByte <<= 1;
 214   2      
 215   2              if (1 == ZB_RS){
 216   3                  ZB_RcvByte |= 1;
 217   3              }
 218   2      
 219   2              ZB_BitCnt ++;
 220   2              if (ZB_BitCnt == 8){
 221   3                  ZB_BitCnt = 0;
 222   3                  ZB_GetSuccessFlag = 1;
 223   3              }
 224   2          }
 225   1      
 226   1          if (ZB_GetSuccessFlag){        /*接收一个字节成功*/
 227   2              ZB_GetSuccessFlag = 0;
 228   2      
 229   2              switch (ZB_Com.RxPhase){
 230   3      
 231   3                  case 0:/*第一起始符*/
 232   3                      if (0xfe == ZB_RcvByte){
 233   4                          ZB_Com.RxPhase = 0;
 234   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 235   4                      }else if (0x68 == ZB_RcvByte){
 236   4                          ZB_Com.RxPhase           = 2;
 237   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 238   4                      }else if ((0x14 == ZB_RcvByte)||(0x24 == ZB_RcvByte)||(0x16 == ZB_RcvByte)||(0x10 == ZB_Rc
             -vByte)){
 239   4                          ZB_Com.RxPhase           = 1;
 240   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
C51 COMPILER V8.08   ZB                                                                    02/17/2009 12:58:31 PAGE 5   

 241   4                      }else{
 242   4                          ZB_Com.RxErr             = 1;
 243   4                      }
 244   3                      break;
 245   3      
 246   3                  case 1:/*浩迪规约第二起始符*/
 247   3                      if ((0x11 == ZB_RcvByte)||(0xee == ZB_RcvByte)){
 248   4                          ZB_Com.RxPhase           = 2;
 249   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 250   4                      }else{
 251   4                          ZB_Com.RxErr             = 1;
 252   4                      }
 253   3                      break;
 254   3      
 255   3                  case 2:/*地址域*/
 256   3                      COM_DatBuf[ZB_MaxLen ++]     = ZB_RcvByte;
 257   3                      ZB_Com.AdrLenCnt ++;
 258   3                      if (6 == ZB_Com.AdrLenCnt){
 259   4                          ZB_Com.AdrLenCnt         = 0;
 260   4                          ZB_Com.RxPhase           = 3;
 261   4                      }else if (ZB_Com.AdrLenCnt > 6){/*为了防止不可预知的错误*/
 262   4                          ZB_Com.RxErr             = 1;
 263   4                      }
 264   3                      break;
 265   3      
 266   3                  case 3:/*数据起始符*/
 267   3                      if (0x68 == ZB_RcvByte){
 268   4                          ZB_Com.RxPhase           = 4;
 269   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 270   4                      }else if (0xaa == ZB_RcvByte){
 271   4                          ZB_Com.RxPhase           = 4;
 272   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 273   4                      }else{
 274   4                          ZB_Com.RxErr             = 1;
 275   4                      }
 276   3                      break;
 277   3      
 278   3                  case 4:/*控制码*/
 279   3                      COM_DatBuf[ZB_MaxLen ++]     = ZB_RcvByte;
 280   3                      ZB_Com.RxPhase               = 5;
 281   3                      break;
 282   3      
 283   3                  case 5:/*数据长度*/
 284   3                      if (30 > ZB_RcvByte){/*最长数据为20个字节*/
 285   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 286   4                          ZB_Com.RxDatLen          = ZB_RcvByte;
 287   4                          ZB_Com.RxPhase           = 6;
 288   4                      }else{
 289   4                          ZB_Com.RxErr             = 1;
 290   4                      }
 291   3                      break;
 292   3      
 293   3                  case 6:/*数据域*/
 294   3                      COM_DatBuf[ZB_MaxLen ++]     = ZB_RcvByte;
 295   3                      ZB_Com.DatLenCnt ++;
 296   3                      if (ZB_Com.DatLenCnt == ZB_Com.RxDatLen){
 297   4                          ZB_Com.RxPhase           = 7;
 298   4                          ZB_Com.DatLenCnt         = 0;
 299   4                          ZB_Com.RxDatLen          = 0;
 300   4                      }else if (ZB_Com.DatLenCnt > ZB_Com.RxDatLen){/*为了防止不可预知的错误*/
 301   4                          ZB_Com.RxErr             = 1;
 302   4                      }
C51 COMPILER V8.08   ZB                                                                    02/17/2009 12:58:31 PAGE 6   

 303   3                      break;
 304   3      
 305   3                  case 7:/*校验码*/
 306   3                      COM_DatBuf[ZB_MaxLen ++]     = ZB_RcvByte;
 307   3                      ZB_Com.RxPhase               = 8;
 308   3                      break;
 309   3      
 310   3                  case 8:/*结束符*/
 311   3                      if (0x16 == ZB_RcvByte){
 312   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 313   4                          ZB_Com.RxPhase           = 0;
 314   4      
 315   4                          UART0_SendFlag           = 1;
 316   4                          UART0_MaxLen             = ZB_MaxLen;
 317   4                          ZB_MaxLen                = 0;
 318   4      
 319   4                          ZB_GetSyncFlag           = 1;
 320   4                          ZB_GetDatFlag            = 0;
 321   4      
 322   4                          LED_ZB                   = 1;
 323   4                              }else if (0xff == ZB_RcvByte){
 324   4                          COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
 325   4                          ZB_Com.RxPhase           = 9;
 326   4                      }else{
 327   4                          ZB_Com.RxErr             = 1;
 328   4                      }
 329   3                      break;
 330   3      
 331   3                  case 9:/*浩迪CRC校验*/
 332   3                      COM_DatBuf[ZB_MaxLen ++]     = ZB_RcvByte;
 333   3                      ZB_Com.CrcLenCnt ++;
 334   3                      if (ZB_Com.CrcLenCnt == 2){
 335   4                          ZB_Com.RxPhase           = 0;
 336   4                          ZB_Com.CrcLenCnt         = 0;
 337   4      
 338   4                          UART0_SendFlag           = 1;
 339   4                          UART0_MaxLen             = ZB_MaxLen;
 340   4                          ZB_MaxLen                = 0;
 341   4      
 342   4                          ZB_GetSyncFlag           = 1;
 343   4                          ZB_GetDatFlag            = 0;
 344   4      
 345   4                          LED_ZB                   = 1;
 346   4                      }else if (ZB_Com.CrcLenCnt > 2){/*为了防止不可预知的错误*/
 347   4                          ZB_Com.RxErr             = 1;
 348   4                      }
 349   3                      break;
 350   3      
 351   3                  default:
 352   3                      break;
 353   3              }
 354   2      
 355   2              if (ZB_Com.RxErr){/*如果帧接收有错误*/
 356   3                  ZB_Com.RxErr      = 0;
 357   3                  ZB_Com.RxPhase    = 0;
 358   3                  ZB_Com.RxDatLen   = 0;
 359   3                  ZB_Com.DatLenCnt  = 0;
 360   3                  ZB_Com.CrcLenCnt  = 0;
 361   3                  ZB_Com.AdrLenCnt  = 0;
 362   3      
 363   3                  ZB_GetSyncFlag    = 1;
 364   3                  ZB_GetDatFlag     = 0;
C51 COMPILER V8.08   ZB                                                                    02/17/2009 12:58:31 PAGE 7   

 365   3      
 366   3                  ZB_MaxLen         = 0;
 367   3      
 368   3                  LED_ZB            = 1;
 369   3              }
 370   2          }
 371   1      }
 372          
 373          
 374          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    741    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     20    ----
   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 + -