在线时间5 小时
UID3131298
注册时间2015-5-25
NXP金币0
该用户从未签到
新手上路

- 积分
- 25
- 最后登录
- 2015-6-15
|

楼主 |
发表于 2015-5-26 13:56:22
|
显示全部楼层
您好,这块就是无线传输的程序,改的要求就是将主机随机设置的延时时间变成通过判断从机需要发送的数据长度来进行延时,数据越长,延时越短。
#pragma CODE_SEG DEFAULT
UINT8 checkxor(UINT8 datbuf[],UINT16 checknum)
//数据求异或校验结果,datbuf[]=数据缓存,checknum=求校验和的字节个数
{
UINT16 wori,chxor=0;
for(wori=0;wori<checknum;wori++)
{
chxor=chxor^datbuf[wori];//异或
}
return chxor;
}
void prepdata(UINT8 worknum)
//准备返回的数据并启动发送,worknum=任务序号
{
UINT8 btem,bflg=0;
switch(worknum)
{
case 0://请求连接
{
trbuff1[0]=0x55;//通信头
trbuff1[1]=0x55;
trbuff1[2]=0x00;//任务序号
trbuff1[3]=zjhm;//主机号码低
trbuff1[4]=zjhm>>8;//主机号码高
trbuff1[5]=jchm;//机车号码低
trbuff1[6]=jchm>>8;//机车号码高
trbuff1[7]=checkxor(trbuff1,7);//校验
trtotal1=8;//返回数据个数
}break;
case 1://建立连接
{
trbuff1[0]=0x55;//通信头
trbuff1[1]=0x55;
trbuff1[2]=0x01;//任务序号
trbuff1[3]=jchm;//机车号码低
trbuff1[4]=jchm>>8;//机车号码高
trbuff1[5]=icpage;//页码低
trbuff1[6]=icpage>>8;//页码高
trbuff1[7]=0xFF;
trbuff1[8]=checkxor(trbuff1,8);//校验
trtotal1=9;//返回数据个数
}break;
case 2://传送数据
{
trbuff1[0]=0x55;//通信头
trbuff1[1]=0x55;
trbuff1[2]=0x02;//任务序号
trbuff1[3]=jchm;//机车号码低
trbuff1[4]=jchm>>8;//机车号码高
fallrd(icpageb,trbuff1,5);//读出数据
trbuff1[269]=checkxor(trbuff1,269);//校验
trtotal1=270;//返回数据个数
}break;
case 3://结束确认
{
trbuff1[0]=0x55;//通信头
trbuff1[1]=0x55;
trbuff1[2]=0x03;//任务序号
trbuff1[3]=jchm;//机车号码低
trbuff1[4]=jchm>>8;//机车号码高
trbuff1[5]=checkxor(trbuff1,5);//校验
trtotal1=6;//返回数据个数
}break;
default:
{
bflg=0x01;
}break;
}
if(bflg==0) //数据正确,发送
{
trnum1=0;//计数器清零
btem=Sci1.scisr1.byte;
Sci1.scidrl.byte=trbuff1[0];//发送
Sci1.scicr2.bit.tcie=1;//允许发送中断
trnum1++;//发送个数加一
disram[6]=disram[6]|0x01;//无线通信指示灯
display(disram,CSTXSGS);
}
}
void wirlescom()
{
Byte i;
if(wirelflg==0x01)//接收到命令
{
wirelflg=0;//清标志
if(icpage>1) //数据量足够
{
switch(rvbuff1[2])//任务序号
{
case 0://主机广播
{
if(checkxor(rvbuff1,5)==rvbuff1[5])//校验正确
{
if(((rvbuff1[3]*256)+rvbuff1[4])==zjhm)//主机号码正确
{
/* 设置侦听标志位 */
TestNum = 0;
wxzdsel = WireLis; //Used in the interrupt procedure
/* 延迟随机时间 */
// SysCntBak = SysCnt%100; //for test
// datam(num);//更新显示内容 //for test
// display(disram,CSTXSGS); //for test
for( i = 0; i < SysCnt%100; i ++ )
{ 3
timedelay( 10 );
cplwdi(&Pim.pth.byte,&pthbak);
if( Idleflg != 0 )
{
TestNum = 0;
break;
}
}
if( Idleflg == 0 )
{
wxzdsel = WXSTA;
TestNum = 0;
prepdata(0);//返回数据
}
else
{
wxzdsel = WXSTA;
Idleflg = 0;
} //MAX 990ms
}
}
}break;
case 1://建立连接
{
if(checkxor(rvbuff1,5)==rvbuff1[5])//校验正确
{
if(((rvbuff1[3]*256)+rvbuff1[4])==jchm)//机车号码正确
{
prepdata(1);//返回数据
}
}
}break;
case 2://传送数据
{
if(checkxor(rvbuff1,7)==rvbuff1[7])//校验正确
{
if(((rvbuff1[3]*256)+rvbuff1[4])==jchm)//机车号码正确
{
icpageb=(rvbuff1[5]*256)+rvbuff1[6];//页码
prepdata(2); //返回数据
}
}
}break;
case 3://结束确认
{
if(checkxor(rvbuff1,5)==rvbuff1[5])//校验正确
{
if(((rvbuff1[3]*256)+rvbuff1[4])==jchm)//机车号码正确
{
prepdata(3);//返回数据
rstflg=0x01;//复位标志
}
}
}break;
default:break;
}
}
}
else if(trendflg==0x01) //发送完毕标志
{
trendflg=0; //清除标志
disram[6]=disram[6]&0xFE;//无线通信指示灯
display(disram,CSTXSGS);
if(rstflg==0x01)//复位标志
{
ferase(0);//擦除前两页
ferase(1);
disend();//显示结束
display(disram,CSTXSGS);
// Sci1.scicr2.bit.rie=0;//停止接收
for(;;)//等待复位
{}
}
}
}
#pragma CODE_SEG DEFAULT
|
|