⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 standard.c

📁 交直流灵达电源单片机通讯程序,通过协议获得电源当前状态.
💻 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 + -