📄 protocol.c
字号:
//***************************************************//
#define __PROTOCOL_INC_
#include ".\DAT\DEF.H"
//***************************************************//
void RX_ISR(void) //接收服务程序
{
UINT ch;
n_TxTimeUp=TXRESETTIME;
EnableRx();
DisableTx();
ch=*SCIRXBUF; // 读可以清除中断标志
if(FlagRxOver)
{
EnableINT(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
return;
}
if(FlagRxStart==0)
{
ClrRxStart();
ClrRxOver();
if(ch==C_SYNC)
{
SetRxStart();
rxtx_ptr=0;
rxtx_size=0XFFFF;
}
else
{
EnableINT(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
return;
}
}
else
{
if(rxtx_ptr==7)
{
if(ch!=C_SYNC)
{
ClrRxStart();
ClrRxOver();
EnableINT(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
return;
}
}
else
if(rxtx_ptr==9)
{
rxtx_size =ch;
rxtx_size+=12;
if(rxtx_size>256)
rxtx_size=256;
}
}
RxTxBuffer[rxtx_ptr]=ch;
rxtx_ptr++;
if(rxtx_ptr>=rxtx_size)
{
ClrRxStart();
ClrRxOver();
if(ch==C_ENDC)
{
SetRxOver();
DisableRx();
n_TxTimeUp=0XFF;
}
}
EnableINT(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
}
//***************************************************//
void TX_ISR(void) //发送服务程序
{
UINT ch;
n_TxTimeUp=TXRESETTIME;
DisableRx();
ClrRxStart();
ClrRxOver();
if(FlagTxStart && (FlagTxOver==0))
{
EnableTx();
if(rxtx_ptr<rxtx_size) // 数据是否发送完毕
{
ch=RxTxBuffer[rxtx_ptr];
*SCITXBUF=ch; // 发送当前字节
rxtx_ptr++; // 增加数据索引
}
else
{
ClrTxStart();
SetTxOver();
DisableTx();
EnableRx();
}
}
else
{
ClrTxStart();
SetTxOver();
DisableTx();
EnableRx();
}
EnableINT(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
}
//***************************************************//
void Cmd_Explain(void)
{
UINT command_fun;
UINT std_fun;
UINT ext_fun;
UINT rtn_CRC;
ClrTxStart();
SetTxOver();
rtn_CRC=CalCRC16(&RxTxBuffer[0],(rxtx_size-2));
#if(test)
if(1)
#else
if(RxTxBuffer[rxtx_size-2]==rtn_CRC)
#endif
{
OthLed_ON();
#if(!test)
SUB33(&RxTxBuffer[10],RxTxBuffer[9]);
#endif
command_fun=RxTxBuffer[8];
if(RxTxBuffer[1]==0XFF)
{
if((command_fun==0x8)&&(rxtx_size==12+1))//采样计数器
{
OthLed_OFF();
TX_ReceiveCnt();
}
else
if((command_fun==0x9)&&(rxtx_size==12+3))//广播采样
{
TX_StartAD();
}
else
if((command_fun==0xa)&&(rxtx_size==12+2))//写设备地址
{
if(KEYIn()==0)
TX_WriteAddress();
}
else
if((command_fun==0xb)&&(rxtx_size==12+0))//读设备地址
{
if(KEYIn()==0)
TX_ReadAddress();
}
}
else
if(RxTxBuffer[1]==DeviceNo)
{
SetTxLogon();
if((FlagTxLogon)&&(command_fun>=1)&&(command_fun<=4))
{
std_fun=RxTxBuffer[10];
ext_fun=RxTxBuffer[11];
if(std_fun==0XA0)
{
switch(ext_fun)
{
case 0x80://查询状态
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadState();
break;
}
break;
case 0x90://主时钟电压和频率
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadVF();
break;
}
break;
case 0xA0://A相数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+2)
TX_ReadData(1);
break;
}
break;
case 0xB0://B相数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+2)
TX_ReadData(2);
break;
}
break;
case 0xC0://C相数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+2)
TX_ReadData(3);
break;
}
break;
case 0xD1://原始波形数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadFile(1);
break;
}
break;
case 0xD2://原始波形数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadFile(2);
break;
}
break;
case 0xD3://原始波形数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadFile(3);
break;
}
break;
case 0xD4://原始波形数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadFile(4);
break;
}
break;
case 0xD5://原始波形数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadFile(5);
break;
}
break;
case 0xD6://原始波形数据
switch(command_fun)
{
case 1://读数据
if(rxtx_size==12+2+0)
TX_ReadFile(6);
break;
}
break;
default:
break;
}//扩展码
}//基本码
}//读和写
}//设备号
else
OthLed_OFF();
if((FlagTxStart)&&(RxTxBuffer[1]==DeviceNo))
{
RxTxBuffer[0] =C_SYNC;
RxTxBuffer[1]=DeviceNo;
RxTxBuffer[7] =C_SYNC;
RxTxBuffer[8]|=0x80;
TX_HandSend();
return;
}
}//校验和
ClrRxStart();
ClrRxOver();
EnableRx();
DisableTx();
}
//***************************************************//
void TX_SendCnt(UINT cnt)
{
Aphase[cnt].Ok=0;
Bphase[cnt].Ok=0;
Cphase[cnt].Ok=0;
Aphase[cnt].No=cnt;
Bphase[cnt].No=cnt;
Cphase[cnt].No=cnt;
SetAdClock();
ReceiveSendCntDo();
SetRxOver();
SetTxOver();
ClrRxStart();
ClrTxStart();
RxTxBuffer[ 0]=C_SYNC;
RxTxBuffer[ 1]=0XFF;
RxTxBuffer[ 7]=C_SYNC;
RxTxBuffer[ 8]=0x08;
RxTxBuffer[10]=cnt;
RxTxBuffer[ 9]=1+0;
rxtx_size=12+1+0;
TX_HandSend();
}
//***************************************************//
void TX_ReceiveCnt(void)
{
n_AdCnt=RxTxBuffer[10];
Aphase[n_AdCnt].Ok=0;
Bphase[n_AdCnt].Ok=0;
Cphase[n_AdCnt].Ok=0;
Aphase[n_AdCnt].No=n_AdCnt;
Bphase[n_AdCnt].No=n_AdCnt;
Cphase[n_AdCnt].No=n_AdCnt;
ClrAdClock();
n_AdDelay=0;
ReceiveSendCntDo();
}
//***************************************************//
void TX_StartAD(void)
{
AdStartInit();
if(RxTxBuffer[11]==1)
{
SetSingleAd();
SetSingleAdV();
ClrSingleAdF();
}
if(FlagSingleAd)
{
if(RxTxBuffer[12]==0)
{
ClrAdExtClk();
}
AdTotalCnt=1;
}
else
{
AdTotalCnt=RxTxBuffer[12];
if(AdTotalCnt>MAXADTOTALCNT)
{
AdTotalCnt=MAXADTOTALCNT;
}
}
if(RxTxBuffer[10]==DeviceNo)
{
if(AdTotalCnt>0)
{
n_AdDelay=FIRSTTIME;
SetAdClock();
}
RxTxBuffer[ 1]=DeviceNo;
RxTxBuffer[10]=0;
RxTxBuffer[ 9]=1;
rxtx_size=12+1;
SetTxStart();
}
}
//***************************************************//
void TX_EndAD(void)
{
SetRxOver();
SetTxOver();
ClrRxStart();
ClrTxStart();
RxTxBuffer[ 0]=C_SYNC;
RxTxBuffer[ 1]=DeviceNo;
RxTxBuffer[ 7]=C_SYNC;
RxTxBuffer[ 8]=0x89;
RxTxBuffer[10]=0x01;
RxTxBuffer[ 9]=1+0;
rxtx_size=12+1+0;
TX_HandSend();
}
//***************************************************//
void TX_WriteAddress(void)
{
DeviceNo=RxTxBuffer[10];
DeviceClass=RxTxBuffer[11];
SpiWriteStatus(0x0);
SpiWrite(&DeviceNo,EEDeviceNo,1);
SpiWrite(&DeviceClass,EEDeviceClass,1);
SpiWriteStatus(0xC);
RxTxBuffer[ 1]=DeviceNo;
RxTxBuffer[ 9]=0;
rxtx_size=12+0;
SetTxStart();
}
//***************************************************//
void TX_ReadAddress(void)
{
SpiRead(&DeviceNo,EEDeviceNo,1);
SpiRead(&DeviceClass,EEDeviceClass,1);
RxTxBuffer[ 1]=DeviceNo;
RxTxBuffer[10]=DeviceNo;
RxTxBuffer[11]=DeviceClass;
RxTxBuffer[ 9] =2+0;
rxtx_size=12+2+0;
SetTxStart();
}
//***************************************************//
//***************************************************//
void TX_ReadVF(void)
{
UINT ch;
T_AdRecord1 *pAdRecord;
if(FlagAdHaveDone)
{
pAdRecord=(T_AdRecord1 *)&VoltFrequency;
ch=pAdRecord->VoltDC_R.uint2.UINTDataH;
RxTxBuffer[12]=HIGH8(ch);
RxTxBuffer[13]= LOW8(ch);
ch=pAdRecord->VoltDC_R.uint2.UINTDataL;
RxTxBuffer[14]=HIGH8(ch);
RxTxBuffer[15]= LOW8(ch);
ch=pAdRecord->VoltAC_R1.uint2.UINTDataH;
RxTxBuffer[16]=HIGH8(ch);
RxTxBuffer[17]= LOW8(ch);
ch=pAdRecord->VoltAC_R1.uint2.UINTDataL;
RxTxBuffer[18]=HIGH8(ch);
RxTxBuffer[19]= LOW8(ch);
ch=pAdRecord->VoltAC_I1.uint2.UINTDataH;
RxTxBuffer[20]=HIGH8(ch);
RxTxBuffer[21]= LOW8(ch);
ch=pAdRecord->VoltAC_I1.uint2.UINTDataL;
RxTxBuffer[22]=HIGH8(ch);
RxTxBuffer[23]= LOW8(ch);
ch=pAdRecord->Frequency.uint2.UINTDataH;
RxTxBuffer[24]=HIGH8(ch);
RxTxBuffer[25]= LOW8(ch);
ch=pAdRecord->Frequency.uint2.UINTDataL;
RxTxBuffer[26]=HIGH8(ch);
RxTxBuffer[27]= LOW8(ch);
}
else
{
for(ch=0;ch<16;ch++)
{
RxTxBuffer[12+ch]=0;
}
}
RxTxBuffer[ 9] =16+2;
rxtx_size=12+16+2;
SetTxStart();
}
//***************************************************//
void TX_ReadState(void)
{
RxTxBuffer[12]=1;
RxTxBuffer[ 9] =1+2;
rxtx_size=12+1+2;
SetTxStart();
}
//***************************************************//
void TX_ReadData(UINT abc)
{
UINT ch,i;
UINT n_ReadAdCnt; // AD读记录号
UINT n_XieBoCnt; // 谐波次数
UINT *pAdRecord;
n_ReadAdCnt=RxTxBuffer[12];
if(n_ReadAdCnt>MAXADTOTALCNT)
n_ReadAdCnt=MAXADTOTALCNT;
n_XieBoCnt=RxTxBuffer[13];
if(n_XieBoCnt>9)
n_XieBoCnt=9;
n_XieBoCnt=n_XieBoCnt*8;
RxTxBuffer[ 9] =n_XieBoCnt+6+2;
rxtx_size=12+n_XieBoCnt+6+2;
switch(abc)
{
case 1:
pAdRecord=(UINT *)&Aphase[n_ReadAdCnt];
break;
case 2:
pAdRecord=(UINT *)&Bphase[n_ReadAdCnt];
break;
case 3:
pAdRecord=(UINT *)&Cphase[n_ReadAdCnt];
break;
default:
pAdRecord=(UINT *)&Aphase[n_ReadAdCnt];
}
if(FlagAdHaveDone)
{
RxTxBuffer[12]=*pAdRecord++;// 序号
RxTxBuffer[13]=*pAdRecord++;// 有效性
ch=*pAdRecord++; // 直流
RxTxBuffer[16]=HIGH8(ch);
RxTxBuffer[17]= LOW8(ch);
ch=*pAdRecord++;
RxTxBuffer[14]=HIGH8(ch);
RxTxBuffer[15]= LOW8(ch);
pAdRecord++;
pAdRecord++;
for(i=0;i<n_XieBoCnt;i+=4)
{
ch=*pAdRecord++;
RxTxBuffer[20+i]=HIGH8(ch);
RxTxBuffer[21+i]= LOW8(ch);
ch=*pAdRecord++;
RxTxBuffer[18+i]=HIGH8(ch);
RxTxBuffer[19+i]= LOW8(ch);
}
}
else
{
n_XieBoCnt+=6;
for(i=0;i<n_XieBoCnt;i++)
{
RxTxBuffer[12+i]=0;
}
}
SetTxStart();
}
//***************************************************//
void TX_ReadFile(UINT abc)
{
UINT ch,i;
UINT *pAdRecord;
switch(abc)
{
case 1:
pAdRecord=(UINT *)&AD_Adata;
break;
case 2:
pAdRecord=(UINT *)&AD_Adata+64;
break;
case 3:
pAdRecord=(UINT *)&AD_Bdata;
break;
case 4:
pAdRecord=(UINT *)&AD_Bdata+64;
break;
case 5:
pAdRecord=(UINT *)&AD_Cdata;
break;
case 6:
pAdRecord=(UINT *)&AD_Cdata+64;
break;
default:
pAdRecord=(UINT *)&AD_Adata;
}
if(FlagAdHaveDone)
{
for(i=0;i<MAXADTOTALDOT;i+=2)
{
ch=*pAdRecord++;
RxTxBuffer[12+i]=HIGH8(ch);
RxTxBuffer[13+i]= LOW8(ch);
}
}
else
{
for(i=0;i<MAXADTOTALDOT;i++)
{
RxTxBuffer[12+i]=0;
}
}
RxTxBuffer[ 9] =MAXADTOTALDOT+2;
rxtx_size=12+MAXADTOTALDOT+2;
SetTxStart();
}
//***************************************************//
void TX_ACK(void)
{
RxTxBuffer[9]=0+2;
rxtx_size=12+ 0+2;
}
//***************************************************//
void TX_HandSend(void)
{
UINT rtn_CRC;
#if(!test)
ADD33(&RxTxBuffer[10],RxTxBuffer[9]);
#endif
rtn_CRC=CalCRC16(&RxTxBuffer[0],(rxtx_size-2));
RxTxBuffer[rxtx_size-2]=rtn_CRC;
RxTxBuffer[rxtx_size-1]=C_ENDC;
rxtx_ptr=0;
rxtx_size++;
SetTxStart();
ClrTxOver();
DisableRx();
EnableTx();
*SCITXBUF=0xFF;
}
//***************************************************//
UINT CalCRC16(UINT* ptr, UINT count)
{
UINT CRC16;
CRC16 = 0;
do
{
CRC16+=*ptr++;
}
while(--count > 0);
return CRC16&0xff;
}
//***************************************************//
void ADD33(UINT* ptr, UINT count)
{
if(count==0)
return;
do
{
*ptr+=0X33;
*ptr&=0xff;
ptr++;
}
while(--count > 0);
}
//***************************************************//
void SUB33(UINT* ptr, UINT count)
{
if(count==0)
return;
do
{
*ptr-=0X33;
*ptr&=0xff;
ptr++;
}
while(--count > 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -