#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x.h>
#define SlvRxd BIT7
#define SlvRxdSt P1IN & BIT7
#define SlvRxdIns P1DIR &=~ BIT7
extern void SlvDataSend(unsigned char SendNo,unsigned char Table);
extern void SlvSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
extern void SysSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
//------------------------------ *** - 判断指令数据是否是单独指令 - *** ------------------------------//
bool SlvCheckAdd(void)
{
bool AddFg;
unsigned char i;
AddFg=0;
for(i=0;i<4;i++)
{
if(SlvBuf[3+i]==0xaa)
{
AddFg=1;
}
else
{
AddFg=0;
LongToHex(GloBuf,(unsigned char*)&ChipMac);
if(SlvBuf[3+i] == GloBuf)
{
AddFg=1;
}
else
{
break;
}
}
}
return AddFg;
}
void SlvAddParse(void)
{
switch(SlvBuf[9])
{
case 0x01 ://---读数据
switch(SlvBuf[11])//---
{
case 0x90 ://---(点抄数据)
switch(SlvBuf[12])//---
{
case 0x10 ://---当前数据---FE FE FE 68 10 01 AA AA AA AA AA 68 01 03 90 10 D7 16
SlvSendRes=0x0001;
break;
case 0x11 ://---冻结数据
SlvSendRes=0x0002;
break;
case 0x1f ://---综合数据
SlvSendRes=0x0004;
break;
}
break;
}
break;
case 0x03 ://---读地址
switch(SlvBuf[11])
{
case 0x81 :
switch(SlvBuf[12])
{
case 0x0a :
SlvSendRes=0x0008;
break;
}
break;
}
break;
case 0x04 ://---写数据
switch(SlvBuf[11])
{
case 0x90 :
switch(SlvBuf[12])
{
case 0x10 :
SlvSendRes=0x0010;
break;
}
break;
}
break;
case 0x15 ://---写地址
switch(SlvBuf[11])
{
case 0xa0 :
switch(SlvBuf[12])
{
case 0x18 :
SlvSendRes=0x0020;
break;
}
break;
}
break;
default:
if(SlvBuf[9]==0x81)
{
if(SlvBuf[11]==0x90)
{
if(SlvBuf[12]==0x10)
{
ByteCopy(GloBuf,&SlvBuf[13],12);
SysSendFull(SlvBuf[2],0x81,0x90,0x10,12);
}
}
}
break;
}
}
void SlvClerRec(void)
{
SlvRecDptr=0;
SlvInFg=0;
SlvSendEndFg=1;
RamCler(SlvBuf,48);
}
void SlvCmdPar(void)
{
if(SlvCheckAdd())
{
SlvAddParse();
}
else
{
SlvClerRec();
}
SlvDataSend(SlvSendRes,SlvBuf[2]);
}
void SlvCommConn(void)
{
if(SlvCmdParFg)
{
if(SlvBuf[1]==0x10)
{
if(SlvCheckSum())
{
SlvCmdPar();
}
else
{
SlvClerRec();
}
}
else
{
SlvClerRec();
}
SlvCmdParFg=0;
}
else
{
if(SecConSt&0x02)
{
SecConSt&=0xfd;
if(SlvInFg)
{
if(SlvInTime>0)
{
SlvInTime--;
}
else
{
SlvClerRec();
}
}
}
}
}
void SlvRecConn(void)
{
unsigned char i;
i=0;
if(P1IFG&BIT7)
{
ChkFg=0;
ChkBit=0;
SlvRecData=0;
SlvInFg=1;
SlvInTime=3;//--------------------------------------------如果两秒内没有接收结束自
SlvDelay(90);
while(i<10){if(i<9){if(i>0){SlvRecData>>=1;if(SlvRxdSt){SlvRecData|=0x80;if(ChkBit){ChkBit=0;}else{ChkBit=1;}}}SlvDelay(165);}else{if(i==9){ChkFg=SlvRxdSt;SlvDelay(75);}}i++;}
if(ChkBit==ChkFg)//-------------------------------------------------------上次数据是否发送完毕?
{
if(SlvSendEndFg)
{
if(SlvRecDptr<48)
{
if(SlvRecDptr==0)//----------------------------------数据缓冲区地址指针是否为零
{
if(SlvRecData==0x68)//------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
{
SlvBuf[0]=0x68;
SlvRecDptr++;
}
else
{
SlvRecDptr=0;//------------------------------缓冲区地址归零
}
}
else
{
if(SlvRecDptr==8)//------------------------------缓冲区指针是否等于7
{
if(SlvRecData==0x68)//--------------------------------缓冲区已接收的第8位是否等于0x68
{
SlvBuf[8]=0x68;//--------------------------数据保存到缓冲区
SlvRecDptr++;
}
else
{
SlvRecDptr=0;//--------------------------缓冲区地址归零
}
}
else
{
SlvBuf[SlvRecDptr]=SlvRecData;//--------------数据保存到缓冲区
SlvRecDptr++;//------------------------------缓冲区地址累加
}
if(SlvRecDptr>12)
{
if(SlvBuf[SlvBuf[10]+11]==0x16)//----------------------------是否完成一帧数据的接收?结束符是否等于0x16
{
SlvCmdParFg=1;//-----------------------------------------------启动命令解析使能位
SlvRecDptr=0;//------------------------------------------缓冲区地址归零
SlvSendEndFg=0;//------------------------------------------------已发送完毕位归零
P1IE &= ~SlvRxd;
}
}
}
}
else
{
SlvRecDptr=0;//--------------------------------------缓冲区地址归零
}
}
else
{
SlvRecDptr=0;
}
}
else
{
SlvRecDptr=0;
SlvRecData=0;
}
}
}