com_prc.lst

来自「楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的」· LST 代码 · 共 1,318 行 · 第 1/5 页

LST
1,318
字号
 247   2                        case 0x80:    //PC单发
 248   2                                if(((rx_prc_buff[1]&0x1e)>>1) == rx_screen_cnt)   //同样只有二者相等时才能继续处理
 249   2                                        {
 250   3                                  if((rx_prc_buff[3] == local_adr2)&&(rx_prc_buff[4] == local_adr3)
 251   3                                              &&(rx_prc_buff[5] == local_adr4))          //如果接收地址符合本机地址
 252   3                             {
 253   4                                                      Htx_prc();                             //先发送接收正常信息给PC机
 254   4                                      if(rx_screen_cnt == 0)
 255   4                                                                 mes_data_p = mes_data;
 256   4                                                          mes_data_p = Store_to_mesdata(&rx_prc_buff[6],mes_data_p,32);
 257   4                                                              rx_screen_cnt++;           
 258   4                                                      if((rx_prc_buff[1]&0x01)== 1 )
 259   4                                                          {
 260   5                                                         received_mes_F = 1;
 261   5                                                                 rx_screen_cnt = 0;
 262   5                                                                 *mes_data_p = '\0';
 263   5                                                          }
 264   4                             }
 265   3                                        }
 266   2                                        else if(((rx_prc_buff[1]&0x1e)>>1) == (rx_screen_cnt-1) ) //接收正常,但可能是我的确认信息对方没收到
             -而重发
 267   2                                        {
 268   3                                           if((rx_prc_buff[3] == local_adr2)&&(rx_prc_buff[4] == local_adr3)
 269   3                                              &&(rx_prc_buff[5] == local_adr4))      //如果接收地址符合本机地址
 270   3                                               
 271   3                               Htx_prc();
 272   3                                        }
 273   2                                        else 
 274   2                                             rx_screen_cnt = 0 ;
 275   2                                             
 276   2      
 277   2                                        break;
 278   2                 case 0xc0:                              //PC机向话机发送地址
 279   2                             if(work_F == 1)             //只有处于设置本机地址状态才能继续处理
 280   2                                         {
 281   3                                              local_adr1 = rx_prc_buff[2];
 282   3                                                      local_adr2 = rx_prc_buff[3];
 283   3                                                      local_adr3 = rx_prc_buff[4];
 284   3                                                      local_adr4 = rx_prc_buff[5];
 285   3                                                      Htx_prc();
 286   3      //                                          work_F = 0;
 287   3                                                      //以下函数用于保存刚才收到的地址
 288   3                                                      Write_sector((unsigned char xdata*)(0x1000),(unsigned char xdata*)0x00);
 289   3                                         }
 290   2                                         
 291   2                                         break;                                      
 292   2                 default:
 293   2                            break;
 294   2              }
 295   1       
 296   1      }
 297          
 298          /*********************************************************************/
 299          /* 功能:将收到的信息贮存到mes_data[]中                               */
 300          /*num 表示要存贮多少个字节,*src_p表示源信息的地址,*dst_p表示目的地址*/
 301          /*********************************************************************/ 
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 6   

 302          
 303          unsigned char xdata* Store_to_mesdata( register unsigned char xdata *src_p, register unsigned char xdata *
             -dst_p,unsigned char num)
 304           {
 305   1      //    while((num--)&&(dst_p <= (&mes_data[0]+510)))
 306   1        while(num--)
 307   1              {
 308   2                 *dst_p = *src_p ;
 309   2                 dst_p++;
 310   2                 src_p++;
 311   2              }
 312   1              return(dst_p);
 313   1       }
 314               
 315          /****************************************************************/
 316          /*          10ms执行一次                                        */            
 317          /****************************************************************/  
 318          void    Trm_hd(void)
 319          {
 320   1              unsigned char  c;
 321   1              if((COMERR_F == 0)&&(one_frame_F == 1))   
 322   1              {
 323   2                  one_frame_F = 0 ;
 324   2                      c = Tget_data();                                                        
 325   2                      if(c == NORMAL_END)                         /*NORMAL_END define 0*/
 326   2                      {
 327   3                              Command_hd();                   
 328   3                      }
 329   2              }
 330   1              if(COMERR_F == 1)                              /* if communication is err */
 331   1              {                
 332   2                      Err_prc();
 333   2                      COMERR_F = 0;
 334   2              }
 335   1      
 336   1      }              
 337          /***********************************************************************/
 338          /* rx_screen_cnt 表示现在接收到的是信息中的第几屏,它要和信息发送过来  
 339             的屏数相比较,只有一条信息的每帧全部相等时才能把信息存贮            */                                  
             -                     
 340          /***********************************************************************/
 341          
 342          
 343          void Err_prc(void)
 344          {
 345   1         rx_screen_cnt = 0;              //由于出错,所以重新将接收屏数清0
 346   1         mes_data_p = mes_data ;        //重新指向mes_data的起始位置
 347   1      }
 348          /***********************************************************************/
 349          /***********************************************************************/
 350          
 351          unsigned char  Tget_data(void)
 352          {
 353   1               
 354   1              register unsigned char parity,rx_data;
 355   1              register unsigned char  i;
 356   1              while(((rx_data = Hget()) != -1 ) && ( rx_byte_cnt < 39 ))
 357   1              {
 358   2                      if((rx_byte_cnt == 0) && (rx_data != CD_STX))   
 359   2                      {
 360   3                          continue ;
 361   3                      }
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 7   

 362   2                      else
 363   2                      {                                                             
 364   3                                      if( rx_byte_cnt == 0)               
 365   3                                      {                                  
 366   4                                              if(rx_data == CD_STX )
 367   4                                              {
 368   5                                                      rx_prc_buff[0] = CD_STX;
 369   5                                                      rx_byte_cnt++;
 370   5                                              }
 371   4                                      }
 372   3                                      else
 373   3                                      {
 374   4                                              rx_prc_buff[rx_byte_cnt] = rx_data;
 375   4                                              rx_byte_cnt++;
 376   4                                      }
 377   3                      }
 378   2              }
 379   1      
 380   1              if( rx_byte_cnt == 39)
 381   1              {
 382   2                      rx_byte_cnt = 0;
 383   2                      parity = 0xff;
 384   2                      for(i = 0 ; i < 38 ; i++)
 385   2                      {
 386   3                              parity ^= rx_prc_buff[i];
 387   3                      }
 388   2                      if(parity == rx_prc_buff[38])
 389   2                      {
 390   3                              com_cnt = 3          ;          //有效的通信次数为3次
 391   3                              return((int)NORMAL_END);    //define NORMAL_END 0
 392   3                      }
 393   2                      else
 394   2                          com_cnt--;          
 395   2              }
 396   1              if(com_cnt == 0)   
 397   1              {                                       
 398   2                      rx_byte_cnt = 0;
 399   2                      COMERR_F = 1 ;
 400   2                      return((int)COM_ERROR);       //define COM_ERROR -1
 401   2              }
 402   1              return((int)NOW_COMMUNI);    
 403   1      }
 404          
 405          /*********************************************/
 406          /*********************************************/
 407          unsigned char xdata     *Hrxst_adr( void )
 408          {
 409   1          register unsigned char  xdata *next ;
 410   1              next = hrx_str + 1 ;
 411   1      //      if((unsigned int)next == ((unsigned int)&hrx_buff[0] + HRX_SIZE) )
 412   1              if(next == (unsigned char xdata*)((unsigned int)hrx_buff + HRX_SIZE) )
 413   1                      next = (unsigned  char xdata*)hrx_buff ;                    
 414   1              if( next == hrx_rd )
 415   1                      return( (unsigned char xdata*)FULL );
 416   1              else
 417   1                      return( next ) ;
 418   1      }
 419          
 420          
 421          /*********************************************/
 422          /*********************************************/
 423          unsigned char  Hget( void )
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 8   

 424          {
 425   1      
 426   1              register unsigned char xdata *next ;
 427   1              register unsigned char rx_data ;
 428   1      
 429   1              if( (int)(next = Hrxrd_adr()) != EMPTY )
 430   1              {
 431   2                      EA = 0 ;
 432   2              rx_data = *hrx_rd;
 433   2                      hrx_rd = next ;
 434   2                      EA = 1 ;        
 435   2                      return( rx_data ) ;
 436   2              }
 437   1          else
 438   1                  return( (char)EMPTY ) ;
 439   1      }
 440          
 441          /*********************************************/
 442          /*********************************************/ 
 443          
 444          unsigned char xdata *Hrxrd_adr( void )
 445          {
 446   1          ES = 0;
 447   1              if( hrx_rd == hrx_str )
 448   1              {
 449   2                 ES = 1;
 450   2                 return( (unsigned char xdata *)EMPTY );
 451   2              }
 452   1              
 453   1              if( (unsigned int)hrx_rd == (unsigned int)((unsigned int)&hrx_buff[0] + HRX_SIZE - 1) )
 454   1              {
 455   2                 ES = 1;
 456   2                return( (unsigned char xdata *)hrx_buff ) ;
 457   2               }
 458   1              else
 459   1              {
 460   2                  ES = 1;
 461   2                      return(hrx_rd + 1) ;
 462   2              }
 463   1      }
 464            
 465          
 466          /*********************************************/
 467          /*********************************************/ 
 468          
 469          void Htx_st(void)
 470          {
 471   1         DE = ENABLE_TX;
 472   1         _nop_();
 473   1         _nop_();
 474   1         htx_cnt=0;
 475   1         TI = 0;
 476   1         SBUF = htx_buff[0];    //启动发送
 477   1      }
 478          
 479          /*********************************************/
 480          /*********************************************/ 
 481          void Htx_prc(void)
 482          {
 483   1          register unsigned char xdata *htx_p = htx_buff;
 484   1          *htx_p = CD_STX_P;
 485   1              *(htx_p+1)= CD_RECEIVE_OK ;        //功能特征码
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 9   

 486   1              *(htx_p+2) = local_adr1;
 487   1              *(htx_p+3) = local_adr2;
 488   1          *(htx_p+4) = local_adr3;
 489   1              *(htx_p+5) = local_adr4;
 490   1              *(htx_p+6) = CD_STX_P^CD_RECEIVE_OK^local_adr1^local_adr2^local_adr3^local_adr4;
 491   1              Htx_st();
 492   1      }
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 10  

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION _Hsio_init (BEGIN)
                                           ; SOURCE LINE # 95

⌨️ 快捷键说明

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