📄 pro2004.lst
字号:
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 + -