📄 uart.c.bak
字号:
////WorkState(F:充电,C:放电,E:无操作,N:无电池)
//将缓冲池中的数据取走,调整缓冲池的数据个数、头指针、尾指针
#include "uart.h"
unsigned char DoWithCommand(void)
{
unsigned char R_command=0,reply=0,i=0 ;
Current=0x05DC; //1.5a
Voltage=0x41A0; //16.8v
TimeRemain=0x0040; //64min
R_command=RData[(Head+3)%RBUFSIZE]; //命令代码
switch (R_command)
{
case CONNECT: //A:连接
SData[0]=14;
SData[1]=ADDRESS;
SData[2]=R_command;
SData[3]=WorkType;
SData[4]=Edition;
SData[5]=(&RunStep[RStepNo])->action;
SData[6]=RStepNo;
SData[7]=Current%256;
SData[8]=Current>>8;
SData[9]=Voltage%256;
SData[10]=Voltage>>8;
SData[11]=VolumeRatio;
SData[12]=TimeRemain%256;
SData[13]=TimeRemain>>8;
SData[14]=OutCheckSum();
reply=1;
break;
case ACONTROL: // 'F'传送动作控制代码
if (RData[(Head+4)%RBUFSIZE]=='A')
{
(&RunStep[0])->action=RData[(Head+6)%RBUFSIZE];
(&RunStep[0])->ref_exe=RData[(Head+7)%RBUFSIZE]+RData[(Head+8)%RBUFSIZE]*256;
(&RunStep[0])->ref_stp=RData[(Head+9)%RBUFSIZE]+RData[(Head+10)%RBUFSIZE]*256;
TStepNo=1;
}
else if(RData[(Head+4)%RBUFSIZE]=='B')
{
(&RunStep[TStepNo])->action=RData[(Head+6)%RBUFSIZE];
(&RunStep[TStepNo])->ref_exe=RData[(Head+7)%RBUFSIZE]+RData[(Head+8)%RBUFSIZE]*256;
(&RunStep[TStepNo])->ref_stp=RData[(Head+9)%RBUFSIZE]+RData[(Head+10)%RBUFSIZE]*256;
TStepNo++;
}
else
{
//command length + address +command type[F传送动作控制代码]+
//command data[命令状态(A:第一条命令;B:后续命令;J:跳转指令)+序号 +
//动作代码CONTROL type [E] +跳转到指定的序号+循环的次数] +chechsum
if(RData[(Head+4)%RBUFSIZE]=='J')
{
(&RunStep[TStepNo])->action=RData[(Head+6)%RBUFSIZE];
(&RunStep[TStepNo])->ref_exe=RData[(Head+7)%RBUFSIZE];
(&RunStep[TStepNo])->ref_stp=RData[(Head+8)%RBUFSIZE];
TStepNo++;
}
}
SData[0]=5;
SData[1]=ADDRESS;
SData[2]=R_command;
SData[3]='O';
SData[4]='K';
SData[5]=OutCheckSum();
reply=2;
break;
case LSAMPLE: //'S':采样数据
SData[0]=12;
SData[1]=ADDRESS;
SData[2]=R_command;
SData[3]=(&RunStep[RStepNo])->action;
SData[4]=RStepNo;
SData[5]=Current%256;
SData[6]=Current>>8;
SData[7]=Voltage%256;
SData[8]=Voltage>>8;
SData[9]=VolumeRatio;
SData[10]=TimeRemain%256;
SData[11]=TimeRemain>>8;
SData[12]=OutCheckSum();
reply=3;
break;
//command length +address +command type[G] +command data["on" or "off"] (1 B) +chechsum
case LCONTROL: //'L':通道控制
if(RData[Head+4]==1)
Action_Control=1;
else
Action_Control=0;
SData[0]=5;
SData[1]=ADDRESS;
SData[2]=R_command;
SData[3]='O';
SData[4]='K';
SData[5]=OutCheckSum();
reply=4;
break;
//以上情况为同种类型的应答
case HDATA: //'H': 历史操作数据
ReadFlash();//
SData[0]=13;
SData[1]=ADDRESS;
SData[2]=R_command;
SData[3]=(&RunStep[RStepNo])->action;
SData[4]=RStepNo;
SData[5]=Current%256;
SData[6]=Current>>8;
SData[7]=Voltage%256;
SData[8]=Voltage>>8;
SData[9]=VolumeRatio;
SData[10]=TimeRemain%256;
SData[11]=TimeRemain>>8;
SData[12]= 0x00;//01表示还有后续的数据;00表示无后续数据 及所有数据传送完毕
SData[13]=OutCheckSum();
reply=5;
break;
case ROMREAD: //'R':读,
SM_Receive (0x16, RData[(Head+4)%RBUFSIZE],RData[(Head+5)%RBUFSIZE]+1) ;
SData[0]=2+RData[(Head+5)%RBUFSIZE];
SData[1]=ADDRESS;
SData[2]=R_command;
//添加相应的代码,从EEPROM中读出数据,并填写在ReplayMessage从3开始的单元中
for(i=0;i<RData[(Head+5)%RBUFSIZE];i++)
SData[3+i]=RECVCHARS[i];
SData[3+i]=OutCheckSum();
reply=6;
break;
case ROMWRITE: //'W':写
//添加相应的代码,将要写入的数据写入EEPROM中
SM_Send (0x16, RData[(Head+4)%RBUFSIZE], RData[(Head+5)%RBUFSIZE]+1) ;
SData[0]=5;
SData[1]=ADDRESS;
SData[2]=R_command;
SData[3]='O';
SData[4]='K';
SData[5]=OutCheckSum();
reply=7;
break;
default:
break;
}
if(reply>=1 &&reply<=7 )
{
//DataSended=0;
SBUF=SData[0];
DataSended=1;//表示当前已传送字节位置
}
ES0=0;
DataNo=DataNo-(RData[(Head+1)%RBUFSIZE]+1);
Head=(Head+RData[(Head+1)%RBUFSIZE]+2)%RBUFSIZE ;
//DataNo=0;
//Head=0;
//Pos=0;
ES0=1;
return reply;
}
/********************************************************************************/
//在缓冲池中检验,是否有自己的数据。如果检查到别人的数据要清除。如果事自己的数据且正确就返回一个为1的值
//若校验错误返回2;
unsigned char RBufJudge()
{
unsigned char my_message=0;
int Rcurrentp=0,temp_no,check_sum,tempacc=0;
unsigned char temp_pos=0;
temp_no =DataNo;//缓冲数据个数
temp_pos=Head;
if (temp_no >0)
{
if(!(RData[(temp_pos)%RBUFSIZE]==0xff && RData[(temp_pos+1)%RBUFSIZE]!=0xff))
{
temp_no--;
temp_pos=(++temp_pos)%RBUFSIZE ;
}
else
{
if(RData[(temp_pos+2)%RBUFSIZE]==ADDRESS)
{
TestVar=RData[(temp_pos)%RBUFSIZE];
TestVar1=RData[(temp_pos+1)%RBUFSIZE];
TestVar2=DataNo;
if ((Pos+RBUFSIZE-temp_pos)%RBUFSIZE<RData[(temp_pos+1)%RBUFSIZE]+2) //若当前数据‘个数小于指定长度
{
//if(TR2==0) TR2 =1; //开定时器2,启动超时检测
goto jend;
}
else
{
TR2=0;
TH2 =0xf9; //等待10个字节时须在16位模式下设置为0xf933
TL2 =0x33;
for (check_sum=0,Rcurrentp=1;+Rcurrentp <(RData[(temp_pos+1)%RBUFSIZE]);Rcurrentp ++) //求校验和
{
check_sum =(check_sum+RData[(temp_pos+Rcurrentp+1)%RBUFSIZE])%256;
}
if (check_sum !=RData[((temp_pos+Rcurrentp+1)%RBUFSIZE)])
{
my_message=RData[(temp_pos+3)%RBUFSIZE];
//校验错误
SData[0]=4;
SData[1]=ADDRESS;
SData[2]=my_message;
SData[3]='E';
SData[4]= SData[1]+SData[2]+SData[3];
SBUF=SData[0];
DataSended=1;//表示当前已传送字节位置
ES0=0;
Pos=0;
ES0=1;
temp_no=0;
temp_pos=0;
goto jend;
}
else
{
//temp_no=temp_no-RData[temp_pos];
//temp_pos=(temp_pos+RData[temp_pos])%RBUFSIZE ;
my_message=1;
goto jend;
}
}
}
}
}
jend:
Head=temp_pos;
ES0 =0;
DataNo =temp_no;//缓冲数据个数
ES0 =1;
return my_message;
}
unsigned char OutCheckSum(void) //生成校验
{
unsigned char i;
unsigned int sum;
for(i=1,sum=0;i<SData[0]-1;i++)
sum=(sum+SData[i])%256;
return sum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -