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

📄 pro2004.lst

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 LST
📖 第 1 页 / 共 3 页
字号:
                  LoginU.LoginS.DT2       = 0x00;               //DT2=0
                  LoginU.LoginS.CS        = GetCheckSum(&LoginU.bytes[6],12);
                  LoginU.LoginS.EndBit    = 0x16;  
              
                      //对调长度高低字节 //1,2,3,4,
                      High = LoginU.bytes[1];
                      Low  = LoginU.bytes[2];
                  LoginU.bytes[1] = Low;
                  LoginU.bytes[2] = High;
              
                      High = LoginU.bytes[3];
                      Low  = LoginU.bytes[4];
                  LoginU.bytes[3] = Low;
                  LoginU.bytes[4] = High;
               
                  Push2Resent(LoginU.bytes,20);
              
              }
              
              
              /*
              *****************************************************************************************************
              *Func:   发送心跳包
C51 COMPILER V7.06   PRO2004                                                               09/26/2008 13:36:24 PAGE 5   

              *Note: 
              *****************************************************************************************************
              */
              void SendHeart2004(void)
              {
                      LoginUnion xdata LoginU;
                      unsigned char High,Low;
                  
                  LoginU.LoginS.StartBit1 = 0x68;
                      LoginU.LoginS.L_High    = 12;                 // L1 = 用户数据  + 8字节的头部数据 = 20字节
                  LoginU.LoginS.L_High    <<= 2;                // D15-D2 
                      LoginU.LoginS.L_High    += 1; 
                  LoginU.LoginS.L_Low     = LoginU.LoginS.L_High;
                  LoginU.LoginS.StartBit2 = 0x68;
                  LoginU.LoginS.Control   = 0 | DIR | PRM | FUNCCODE_R_A;     //控制域
                  LoginU.LoginS.Add[0]    = AddBytes[1];        //0X20
                      LoginU.LoginS.Add[1]    = AddBytes[0];        //0X90
                  LoginU.LoginS.Add[2]    = AddBytes[3];        //0X34
                      LoginU.LoginS.Add[3]    = AddBytes[2];        //0X12
                  LoginU.LoginS.Add[4]    = 0;
                  LoginU.LoginS.AFN       = 0X02;               //AFN
                  LoginU.LoginS.SEQ       = 0 | FIR | FIN | CON | (PFC & 0x0f);     //侦序列域,计数器的低四位
              
                  LoginU.LoginS.DA1       = 0x0;                //DA1=0  P0
                  LoginU.LoginS.DA2       = 0x0;                //DA2=0
                  LoginU.LoginS.DT1       = 0x04;               //DT1=1  F1
                  LoginU.LoginS.DT2       = 0x00;               //DT2=0
              
                  LoginU.LoginS.CS        = GetCheckSum(&LoginU.bytes[6],12);
              
                  LoginU.LoginS.EndBit    = 0x16;  
              
                      //对调长度高低字节 //1,2,3,4,
                      High = LoginU.bytes[1];
                      Low  = LoginU.bytes[2];
                  LoginU.bytes[1] = Low;
                  LoginU.bytes[2] = High;
              
                      High = LoginU.bytes[3];
                      Low  = LoginU.bytes[4];
                  LoginU.bytes[3] = Low;
                  LoginU.bytes[4] = High;
              
                  Push2Resent(LoginU.bytes,20); 
              
                      if (SendHeartFlag == FALSE) {
                          SendHeartFlag = TRUE;                       // 置已发标志
                          TimerSec[T_SOCKET_TTL] = SOCKET_TTL_SEC;    // 时间初始化2分钟
                      }
              }
              
              
              /*
              *****************************************************************************************************
              *FUNC:  根据DA1 DA2 取得 PN
              *NOTE:  
              *****************************************************************************************************
              */
              #define UNKONW_FN  0
              #define UNKONW_PN  255
              
              unsigned char GetPn(unsigned char DA1, unsigned char DA2)
C51 COMPILER V7.06   PRO2004                                                               09/26/2008 13:36:24 PAGE 6   

              {
                  unsigned char i,j;
                      unsigned char DA2_Bit1=0;
                      unsigned char DA1_Bit1=0;
              
                  if ((DA1 == 0) && (DA2 == 0)) {
                      return 0; 
                      } 
                  
                  for (i=0; i<8; i++) {
                      if (DA2 == (1 << i)) {
                                  DA2_Bit1 = i;
                          for (j=0; j<8; j++) {
                              if (DA1 == (1 << j)) { 
                                  DA1_Bit1 = j+1;
                                  return(DA2_Bit1*8 + DA1_Bit1);
                                              }
                                      }
                          return UNKONW_PN;
                              } 
                      }
                      return UNKONW_PN;
              }
              
              
              /*
              *****************************************************************************************************
              *FUNC:  根据DT1 DT2 取得 FN
              *NOTE:  
              *****************************************************************************************************
              */
              unsigned char GetFn(unsigned char DT1, unsigned char DT2)
              {
                  unsigned char i;
                      unsigned char DT1_Bit1=0;
              
                  if ((DT1 == 0) && (DT2 == 0)) {
                      return UNKONW_FN; 
                      }
              
                      if (DT2 > 30) {
                      return UNKONW_FN; 
                      }
              
                  for (i=0; i<8; i++) {
                      if (DT1 == (1 << i)) {
                                  DT1_Bit1 = i+1;
                          return (DT2*8 + DT1_Bit1); 
                              } 
                      }
                  return UNKONW_FN;   
              }
              
              
              /*
              *****************************************************************************************************
              *FUNC:  收到响应侦后,先判断是否有数据在等待响应以及他们的SEQ PFC 是否相等,如果相等说明是确认侦
              *NOTE: 
              *****************************************************************************************************
              */
              unsigned char QueryPfc(unsigned char PFC)
              {
C51 COMPILER V7.06   PRO2004                                                               09/26/2008 13:36:24 PAGE 7   

                  unsigned char i;
              
                      for (i=0; i<RESENT_BUF_NUM; i++) {
                      if ((ResentBufS[i].Statu == WAIT_CONFIRM) && (ResentBufS[i].PFC == PFC) 
                                 && (ResentBufS[i].Checked == RESENT_UNCHECKED)) {                   //正等待确认
                          ResentBufS[i].Checked = RESENT_CHECKED;  
                                      return 1;
                              }
                      }
                      return 0;
              }
              
              /*
              *****************************************************************************************************
              *FUNC:  GPRS 收到数据指示
              *NOTE:  //FramePush2(buf,size); 清心跳包,清已发送心跳包命令
              *****************************************************************************************************
              */
              #if 0   //GPRS
              void OnReceiveData2004(unsigned char xdata *buf ,unsigned int len)
              {
                  LoginUnion  xdata LoginU;
              
                      unsigned int  xdata i;
                      unsigned int  xdata L1;     //除去8字节后的用户数据长度
                      unsigned char xdata AFN;    //解析出的AFN
                      unsigned char xdata Pn;     //解析出的Pn
                      unsigned char xdata Fn;     //解析出的Fn
                      unsigned char xdata CS_Old; //解析出的  CS_Old
                  unsigned char xdata CS_New; //接收算出的CS_New
                      unsigned char xdata PFC_Old;
              
                      /*
                      unsigned char xdata TestBuf[20] = {0x68,0x31,0x00,0x31,0x00,0x68,0xE9,0x33,0x44,0x10,
                                                         0x27,0x00,0x02,0x60,0x00,0x00,0x01,0x00,0xFA,0x16};
              
                      //unsigned char xdata TestBuf[28] = {0x68,0x51,0x00,0x51,0x00,0x68,0x00,0x33,0x44,0x10,0x27,0x00,0x00,0xE
             -0,
                      //                                   0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x48,0x07,0x15,0x16,0x01,0x0A,0x1
             -6};
                  buf = TestBuf;
                      len = 20;
                      */
              
                  TimerSec[T_SEND_HEART] = HeartTimeOutBak;    //心跳包时间初始化
                      SendHeartFlag = FALSE;                       //清已发心跳包
                      
                  if ((buf[0] == 0x68) && (buf[5] == 0x68)) {  //68H L L 68H   //L: LOW HIGH
                      L1 = buf[2];   //L-HIGH
                      L1 <<= 8;
                      L1 |= buf[1];  //L-LOW
                      L1 >>= 2;
              
                              if (((L1 + 8) == len) && (buf[len-1] == 0x16)) {      //是不是2004规约包
                                  CS_Old = buf[len-2];                              //原来的CS
                                      CS_New = GetCheckSum(&buf[6], L1);
              
                                      if (CS_Old == CS_New) {
                                          DebugMsg(31,NULL);
                              for (i=0; i<18; i++ ) {                       //是2004,拷到共用型由于前18字节是固定
                                  LoginU.bytes[i] = buf[i];
                                          }
C51 COMPILER V7.06   PRO2004                                                               09/26/2008 13:36:24 PAGE 8   

                              AFN = LoginU.LoginS.AFN;
                              Pn  = GetPn(LoginU.LoginS.DA1, LoginU.LoginS.DA2);
                                          Fn  = GetFn(LoginU.LoginS.DT1, LoginU.LoginS.DT2);
                                              PFC_Old = LoginU.LoginS.SEQ & 0x0f;           //取SEQ的低四位PFC
                              if ((AFN == 0x00) && (Pn == 0) && (Fn = 1)) { //AFN=0; PN=0; FN=1:全部确认
                                                  DebugMsg(33,NULL);
                                                      if (QueryPfc(PFC_Old)) {                  //是猫的确认包,直接返回,否转发
                                                          DebugMsg(29,NULL);
                                      return;
                                                      }
                                          }
                          }
                              }
                      } 
              
                      //MC55 这里要先发读数据命令 

⌨️ 快捷键说明

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