📄 main.c
字号:
else
if(*pcPkt==(INT8U)0x05)
{
*pcDstPkt=0xf5;
j++;
}
else//出现了非法字符,忽略本条指令
return 0;
pcDstPkt++;
pcPkt++;
}
}
return j;
}
//链路数据编码
//参数:Src:编码前数据;SrcLength:编码前数据长度;Dst:编码后数据
//返回编码后数据长度
INT8U Encode(INT8U *rcvbuf,INT8U *DstBuf,INT8U length,INT8U *Dstlength)
{
INT8U i=0,j=0;
INT16U sum=0;
for(i=0;i<length;i++)
sum+=*(rcvbuf+i);
*DstBuf=0xf0;
j++;
DstBuf++;
*DstBuf=length;
j++;
DstBuf++;
for(i=0;i<length;i++)//将有效数据进行转义
{
if((*rcvbuf!=(INT8U)0xf0)&&(*rcvbuf!=(INT8U)0xf5)&&(*rcvbuf!=(INT8U)0xff))
{
*DstBuf=*rcvbuf;
DstBuf++;
rcvbuf++;
j++;
}
else if(*rcvbuf==(INT8U)0xf0)
{
*DstBuf=0xf5;
DstBuf++;
j++;
*DstBuf=0x00;
DstBuf++;
j++;
rcvbuf++;
}
else if(*rcvbuf==(INT8U)0xff)
{
*DstBuf=0xf5;
DstBuf++;
j++;
*DstBuf=0x0f;
DstBuf++;
j++;
rcvbuf++;
}
else if(*rcvbuf==(INT8U)0xf5)
{
*DstBuf=0xf5;
DstBuf++;
j++;
*DstBuf=0x05;
DstBuf++;
j++;
rcvbuf++;
}
}
sum=sum&0xff;
if((sum!=(INT16U)0xf0)&(sum!=(INT16U)0xff)&(sum!=(INT16U)0xf5))//对校验和进行判断 是否需要转义
{
*DstBuf=(INT8U)sum;
DstBuf++;
j++;
}else if(sum==(INT8U)0xf0)
{
*DstBuf=0xf5;
DstBuf++;
j++;
*DstBuf=0x00;
DstBuf++;
j++;
}
else if(sum==(INT8U)0xff)
{
*DstBuf=0xf5;
DstBuf++;
j++;
*DstBuf=0x0f;
DstBuf++;
j++;
}
else if(sum==(INT8U)0xf5)
{
*DstBuf=0xf5;
DstBuf++;
j++;
*DstBuf=0x05;
DstBuf++;
j++;
}
*DstBuf=0xff;
DstBuf++;
j++;
*Dstlength=j;
return 1;
}
void USARTCammandPro(INT8U *pCmdBuf,INT8U CmdLength)
{
if(CmdLength<5)
return ;
if(*(pCmdBuf+2)==(INT8U)0xa1)//继电器操作
{ //附加参数1:需要操作的继电器的编号
// 附加参数2:0FH打开00H关闭
switch(*(pCmdBuf+3))
{
case (INT8U)0x0://00H零气
if(*(pCmdBuf+4)==(INT8U)0x0f)
ZEROAIROPEN
if(*(pCmdBuf+4)==(INT8U)0x00)
ZEROAIRCLOSE
break;
case (INT8U)0x1://01H空气
if(*(pCmdBuf+4)==(INT8U)0x0f)
COMAIROPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
COMAIRCLOSE;
break;
case (INT8U)0x2://02H 一通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL1OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL1CLOSE;
break;
case (INT8U)0x3://03H 二通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL2OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL2CLOSE;
break;
case (INT8U)0x4: //04H 三通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL3OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL3CLOSE;
break;
case (INT8U)0x5: //05H 四通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL4OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL4CLOSE;
break;
case (INT8U)0x6://06H 五通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL5OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL5CLOSE;
break;
case (INT8U)0x7://07H 六通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL6OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL6CLOSE;
break;
case (INT8U)0x8://08H 七通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL7OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL7CLOSE;
break;
case (INT8U)0x9://09H 八通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL8OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL8CLOSE;
break;
case (INT8U)0xa://0aH 九通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL9OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL9CLOSE;
break;
case (INT8U)0xb://0bH 十通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
CHANNEL10OPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
CHANNEL10CLOSE;
break;
case (INT8U)0xc: //0cH进气室
if(*(pCmdBuf+4)==(INT8U)0x0f)
AIRROOMOPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
AIRROOMCLOSE;
break;
case (INT8U)0xd://0dH 排气通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
AIROUTOPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
AIROUTCLOSE;
break;
case (INT8U)0xe://0EH 排水通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
WATEROUTOPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
WATEROUTCLOSE;
break;
case (INT8U)0xf://0FH 所有15个通道
if(*(pCmdBuf+4)==(INT8U)0x0f)
ALLOPEN;
if(*(pCmdBuf+4)==(INT8U)0x00)
ALLCLOSE;
break;
}
}
if(*(pCmdBuf+2)==(INT8U)0xa2)//查询继电器状态
{
INT8U Cmd[4];
Cmd[0]=0xe2;
Cmd[1]=PINC;
Cmd[2]=PINA;
USARTSendCammand(Cmd,3);
}
if(*(pCmdBuf+2)==(INT8U)0xb1)//汽缸控制
{
if((*(pCmdBuf+3)==(INT8U)0x0f)&&(*(pCmdBuf+4)<(INT8U)0x03))
{
MotorCtlFlag=1;
MotorStep=(*(pCmdBuf+4))-1;
}
if(*(pCmdBuf+3)==(INT8U)0x00)
MotorCtlFlag=2;
}
if(*(pCmdBuf+2)==(INT8U)0xc1)//测电压
{
VoltageSampleFlag=(INT8U)1;
}
if(*(pCmdBuf+2)==(INT8U)0xc2)//停止测电压
VoltageSampleFlag=(INT8U)0;
}
void USARTSendCammand(INT8U *pCmdBuf,INT8U CmdLength)
{
INT8U CodedCmd[30],CodedLength=0;
Encode(pCmdBuf,CodedCmd,CmdLength,&CodedLength);
for(int i=0;i<CodedLength;i++)
USARTSendChar(CodedCmd[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -