📄 standard.c
字号:
#define STD_GLOBALS
#include <variable.H>
unsigned char Send_To_EXT_Buffer(unsigned char Port,unsigned char Type,unsigned char xdata *buff,unsigned char len);
void SendDataToQZJ(unsigned char type, unsigned char Port);
unsigned char Std_Receive(unsigned char Port)
{
struct Serial_rcv xdata *Com;
unsigned char data tmp;
Com = Rcv + Port;
while ( Com->Tail != Com->Head ) {
tmp=Com->mData[Com->Head++];
Com->Head=Com->Head % LEN_RCV;
if ( (!Com->lastSOH && (tmp == SOH) ) || (Com->lastSOH && (tmp != SOH)) ) {
if ( !Com->lastSOH ) { Com->lastSOH = 1 ; continue; }
if ( (tmp != EOT) || (!Com->Start) ) {
Com->Start = 1; // save first byte and byte-position;
Com->pos = 1;
Com->lastSOH = 0;
Com->Buff[0]=tmp;
continue;
}
Com->Start=0;
Com->lastSOH=0;
return 1;
}
if ( Com->Start ) { // save a data
Com->lastSOH = 0;
Com->Buff[Com->pos++]=tmp;
Com->pos= Com->pos % LEN_RCV;
continue;
}
} //end of while
return 0;
}
unsigned char Send_To_QZJ_Buffer(unsigned char Port,unsigned char Type,unsigned char xdata *buff,unsigned char len)
{
unsigned char xdata tmp_data[256];
unsigned char xdata TempBuf[256];
struct Serial_snd xdata *Com;
unsigned char data i, j, temp;
unsigned int data CRC;
Com = Snd + Port;
TempBuf[0]=Address;
TempBuf[1]=Type;
if (len > 0) memcpy((unsigned char xdata*)&TempBuf[2],(unsigned char xdata*)&buff[0],len);
tmp_data[0] = SOH;
for(i = 0, j = 1, CRC = 0; i < (unsigned char)(len + 2); i++) {
temp=TempBuf[i];
if(temp == SOH) tmp_data[j++] = SOH;
tmp_data[j++] =temp;
UPDATA_CRC(CRC,temp);
}
temp = CRC & 0x0ff;
if(temp == SOH) tmp_data[j++] = SOH;
tmp_data[j++] = temp;
temp = (CRC>>8)&0xff;
if(temp == SOH) tmp_data[j++] = SOH;
tmp_data[j++] = temp;
tmp_data[j++] = SOH;
tmp_data[j++] = EOT;
if (Send_To_SndBuffer(Port, j, tmp_data) )
return 1;
return 0;
}
void SendYxToQZJ(unsigned char Port)
{
unsigned char xdata SndBuff[50];
SndBuff[0] = LastYx1;
SndBuff[1] = LastYx2;
if ( Send_To_QZJ_Buffer(Port, YXTYPE, &SndBuff[0], 2) ) SendStart(Port);
}
void SendYcToQZJ(unsigned char Port)
{
unsigned char xdata SndBuff[50];
memcpy(SndBuff, YcData, sizeof(float)*8);
if ( Send_To_QZJ_Buffer(Port, YCTYPE, &SndBuff[0], sizeof(float)*8) ) SendStart(Port);
}
void SendYkToQZJ(unsigned char Port)
{
unsigned char xdata SndBuff[50];
SndBuff[0] = CMD_ACK;
SndBuff[1] = PACK_CMDACK;
if ( Send_To_QZJ_Buffer(Port, YKTYPE, &SndBuff[0], 2) ) SendStart(Port);
}
#ifdef ELTECK_AC
void SendAcToQZJ(unsigned char Port)
{
if ( Send_To_QZJ_Buffer(Port, ACTYPE, &AcBuff[1], AcBuff[0]) ) SendStart(Port);
}
#endif
#ifdef ELTECK_DC
void SendDcToQZJ(unsigned char Port)
{
if ( Send_To_QZJ_Buffer(Port, DCTYPE, &DcBuff[1], DcBuff[0]) ) SendStart(Port);
}
#endif
void Std_Process(unsigned char Port)
{ // data is in Rcv.Buff[0]...[len-1]
// address, type, ......, CRCL, CRCH
// frame structure: SOH, Address(), CmdType(), CmdPara, Data[], crcL, crcH, SOH, EOT.
unsigned char data len;
unsigned int data CRC;
struct Serial_rcv xdata *Com;
if (!Std_Receive(Port)) return;
Com = Rcv + Port;
if (Com->pos < 4) return;
CRC = 0xffff;
len = 0;
while (len < Com->pos) { UPDATA_CRC(CRC, Com->Buff[len++]); }
if (CRC != 0) return;
if ( Com->Buff[0] != Address ) return;
switch ( Com->Buff[1] ) {
case CMD_GET:
switch ( Com->Buff[2] ) {
case PACK_DATA:
SendYcToQZJ(Port);
SendYxToQZJ(Port);
#ifdef ELTECK_AC
SendAcToQZJ(Port);
#endif
#ifdef ELTECK_DC
SendDcToQZJ(Port);
#endif
break;
case PACK_PARA:
break;
}
break;
case CMD_SET:
switch ( Com->Buff[2] ) {
case PACK_DATA:
SendYkToQZJ(Port);
break;
case PACK_PARA:
break;
default:
break;
}
break;
case CMD_ACK:
switch ( Com->Buff[2] ){
case PACK_CMDACK:
RELAY2=1;
SendYkToQZJ(Port);
break;
case PACK_PARA:
break;
default:
break;
}
break;
default: // ACK err
break;
} // end of switch
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -