?? 紅外.txt
字號:
uchar data i,time,x_data,ma;
uchar data j,s,len,h,RD;
uchar xdata *pm;
uint data c,cj,n,cc;
if(int3==0)
{int3=0;int2=0;} // 設置為紅外接收狀態
else return;
ledst(0xf7);
P1=0xf1;
buf_ptr=(HBUF xdata *)BUF_ADD;
i=0;j=0;
ysrxd=240;time=0;x_data=0;
while(1)
{
P1=0xf4;P1=0xf1; // 清狗
ledst(0xf7);
if(ysrxd==0){ysrxd=240;time++;}
if(time>=5)break; // 1分鐘退出
if(x_data>180)break;
if(RI==0)continue;
RI=0;RD=SBUF;
if(RD!='R'){x_data++; continue;}
x_data=0;
buf_ptr->buf0[0]=buf_ptr->buf0[1]=buf_ptr->buf0[2]=0xff;
ysrxd=40;
while(ysrxd)
{
if(RI==1) // 接收長度
{
RI=0;RD=SBUF;
buf_ptr->buf0[0]=RD;len=RD;break;
}
else if(ysrxd==0) break;
P1=0xf4; P1=0xff;
}
if(!ysrxd) continue; // 延時到 退出
if(len==0){ysrxd=240;time=0;continue;} // 長度為0 繼續等待接收
if(len>=0x60){ysrxd=240;time=0;continue;} // 長度超界 繼續等待接收
ledst(0xe7);
len--;
for(i=1;i<=len;i++)
{
for(ysrxd=20;ysrxd;)
{
if(RI==1)
{
RI=0;RD=SBUF;
buf_ptr->buf0[i]=RD; // 接收數據
ysrxd=10; break;
}
P1=0xf4; P1=0xf1; // 清狗
if(ysrxd==0) break;
}
if(!ysrxd){i=0;goto RETFORL;}
}
P1=0xf4;P1=0xff;s=0;
for(i=0;i<len;i++)
{s=s+buf_ptr->buf0[i];} // 判校驗和
if(s==buf_ptr->buf0[i])
{ysrxd=240;i=1;}
else i=0;
RETFORL:
ledst(0xf7);
ysrxd=240;
if(i==0){i=0;continue;}
buf_ptr=(HBUF xdata *)BUF_ADD;
if(buf_ptr->buf0[1]==3) break;
if(buf_ptr->buf0[1]==1) // 協議配置請求(Code=1)
{
ledst(0xd7);
P1=0xf1;
buf_ptr=(HBUF xdata *)BUF_ADD;
len=buf_ptr->buf0[0]-3;s=0;
for(i=0;i<len;i++)
{
h=0;
for(j=1;j<0x0e;j++)
if(buf_ptr->buf0[i+2]==j){h=1;break;}
if(h==0){buf_ptr->buf0[s]=buf_ptr->buf0[i+2];s++;}
}
j=0;
if(s!=0)
{
txdbyte('A'); txdbyte(s+3); txdbyte(0);
for(i=0;i<s;i++)
{txdbyte(buf_ptr->buf0[i]);j=j+buf_ptr->buf0[i];}
txdbyte(j);
}
else
{
txdbyte('A'); txdbyte(13); // 長度
txdbyte(2);
txdbyte(4); txdbyte(5); txdbyte(6); txdbyte(7);
txdbyte(8); txdbyte(9); txdbyte(0x0a); txdbyte(0x0b);
txdbyte(0x0c); txdbyte(0x0d);
txdbyte(11+2+4+5+6+7+8+9+0x0a+0x0b+0x0c+0x0d); // 累加和
}
ysrxd=240; time=0; continue;
}
if(buf_ptr->buf0[1]>0x0d) // 本次通訊未定義(code>0x0D)
{
txdbyte('A'); txdbyte(4); txdbyte(0);
txdbyte(buf_ptr->buf0[1]);
P1=0xf1;
s=buf_ptr->buf0[1]+4;
txdbyte(s);
P1=0xff;
ysrxd=240; time=0; continue;
}
if(buf_ptr->buf0[1]==0x0d) // 確認集中器密碼(code=0x0D)
{
ledst(0xd7);
for(i=0;i<9;i++)
if(buf_ptr->buf0[i+6]!=mima[i]) goto mimaerpd1;
ma=1;
txdbyte('A');txdbyte(0);
ysrxd=240; time=0; continue;
mimaerpd1:
for(i=0;i<9;i++)
if(buf_ptr->buf0[i+6]!=buf_ptr->buf3[i]) goto mimaerpd2;
ma=1;
for(i=0;i<9;i++)
{mima[i]=buf_ptr->buf0[i+6];}
txdbyte('A');txdbyte(0);
ysrxd=240;time=0;continue;
mimaerpd2:
for(i=0;i<9;i++)
if(buf_ptr->buf0[i+6]!=buf_ptr->buf3[i+100]) goto mimaerpd;
ma=1;
for(i=0;i<9;i++)
{
mima[i]=buf_ptr->buf0[i+6];
buf_ptr->buf3[i]=buf_ptr->buf0[i+6];
}
txdbyte('A'); txdbyte(0);
ysrxd=240; time=0; continue;
mimaerpd:
ma=0;
txdbyte('A');
for(i=0;i<16;i++)
txdbyte(buf_ptr->buf0[i]); // 實用時加上
ysrxd=240; time=0; continue;
}
if(buf_ptr->buf0[1]==0x0c) // 設置集中器密碼(code=0x0C)
{
// 52 10 0C 00 00 00 02 30 30 30 30 30 30 30 30 30 CE
ledst(0xd7);
if(ma==1)
{
for(i=0;i<9;i++)
{
mima[i]=buf_ptr->buf0[i+6];
buf_ptr->buf3[i]=buf_ptr->buf0[i+6];
buf_ptr->buf3[i+100]=buf_ptr->buf0[i+6];
}
miyao[0]='M';miyao[1]='I';miyao[2]='Y';
miyao[3]='A';miyao[4]='O';
txdbyte('A');txdbyte(0);
ysrxd=240;time=0;continue;
}
txdbyte('E');txdbyte(0);
ysrxd=240;time=0;continue;
}
if(ma==1) goto mimastpd;
else
{
if(buf_ptr->buf0[1]==5) goto mimastpd;
if(buf_ptr->buf0[1]==7)
if(buf_ptr->buf0[0]==3) goto mimastpd;
ma=0;
ysrxd=240; time=0; continue; // 實用時加上
}
mimastpd:
if(buf_ptr->buf0[1]==4) // 數據庫下載(code=4)
{
ledst(0xd7);
P1=0xf1;buf_ptr = (HBUF xdata *)BUF_ADD;
c=256*(unsigned)buf_ptr->buf0[2]+(unsigned)buf_ptr->buf0[3]; //取地址
if((c>=0)&&(c<=447)){P1=0xf1; h=0; goto XXXL4;}
if((c>447)&&(c<895)){P1=0xf9; h=1; c=c-447; goto XXXL4;}
if((c>894)&&(c<1341)){P1=0xf2; h=2; c=c-894;}
else {P1=0xf2; h=2; c=1341-894;}
XXXL4:
pm=(unsigned char xdata *)(JZQ_ADD+0x80*c); // 取指針地址
dat_ptr=(DAT_ITEM xdata *)pm;
len=buf_ptr->buf0[0]-1;
for(i=0,len-=5;i<len;i++) *pm++=buf_ptr->buf0[i+4];
for(;i<0x80;i++) *pm++=0;
if(c) // 未抄計次
{
dat_ptr->e_cnt=255;
if(h==0) dat_ptr->zjq_len=c;
if(h==1) dat_ptr->zjq_len=c+447;
if(h==2) dat_ptr->zjq_len=c+894;
}
P1=0xff;
c_zb=1;loop_l=0;loop_z=0;c_zbpo=0;
txdbyte('A');txdbyte(0);
ysrxd=240; time=0; continue;
}
if(buf_ptr->buf0[1]==5) // 抄錄集中器的下載參數數據庫(code=5)
{
ledst(0xd7);
P1=0xf1;buf_ptr = (HBUF xdata *)BUF_ADD;
c=256*(unsigned)buf_ptr->buf0[2]+(unsigned)buf_ptr->buf0[3]; //取地址
c=comp1(c);
pm=(unsigned char xdata *)(JZQ_ADD+0x80*c);
dat_ptr=(DAT_ITEM xdata *)pm;
if(c) len=0x18; // 電表庫長度
else len=28; // 集中器庫長度
txdbyte('A'); txdbyte(len); txdbyte(5);
s=0;
if(c!=0)
{
txdbyte(buf_ptr->buf0[2]);txdbyte(buf_ptr->buf0[3]);
s=buf_ptr->buf0[2]+buf_ptr->buf0[3];
}
else s=0;
s=s+len+5;
if(len==0x18) //len=len-2;
{
if(dat_ptr->pre_sno!=0){len=len-2; goto fashpd;}
if(dat_ptr->s_xh==0){len=len-2; goto fashpd;}
len=len-7;
for(i=0;i<len;i++)
{
txdbyte(*pm);
s+=*pm++;
}
i=dat_ptr->s_xh>>8;
s+=i; txdbyte(i);
i=(char)dat_ptr->s_xh;
s+=i; txdbyte(i);
}
else
{
fashpd:
for(len-=3,i=0;i<len;i++)
{
txdbyte(*pm);
s+=*pm++;
}
}
txdbyte(s);
ysrxd=240;time=0; continue;
}
if(buf_ptr->buf0[1]==6) // 點抄單塊表(code=6)
{
ledst(0xd7);
ys1(0xff);
ledst(0xf7);
P1=0xf1; buf_ptr = (HBUF xdata *)BUF_ADD;
if((buf_ptr->buf0[2]&0x01)==0x0) // 無 中繼標志
{
if(PLM_snd_rcv2())
{
ledst(0xd7);
txdbyte('A');
len=buf_ptr->buf0[3]+3; txdbyte(len); txdbyte(6); s=len+6;
len=len-3;
for(i=0;i<len;i++)
{
txdbyte(buf_ptr->buf0[i+4]);
s+=buf_ptr->buf0[i+4];
}
txdbyte(s);
ledst(0xf7);
}
else
{txdbyte('A');txdbyte(0);}
}
else // 有中繼標志
{
if(PLM_snd_rcv1())
{
ledst(0xd7);
txdbyte('A');
len=buf_ptr->buf0[3]+3; txdbyte(len); txdbyte(6); s=len+6;
len=len-3;
for(i=0;i<len;i++)
{
txdbyte(buf_ptr->buf0[i+4]);
s+=buf_ptr->buf0[i+4];
}
txdbyte(s);
ledst(0xf7);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -