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

📄 standard.c

📁 单片机通讯程序,从单片机SAT设备中获得设备状态.
💻 C
字号:
//pragma ot(0)
#define QZJ_GLOBALS
#include "Macro.h"
#include "Main.h"

void SendYxYcToEXT(unsigned char Port);

void make_crctable(void)
{
unsigned int data i, j;
unsigned int data r;
#define CHAR_BIT 8
#define UCHAR_MAX 255
#define CRCPOLY 0x8005

    for (i = 0; i <= UCHAR_MAX; i++)
    {
        r = i;
        for (j = CHAR_BIT; j > 0; j--)
        {
            if (r & 1)
                r = (r >> 1) ^ CRCPOLY;
            else
                r >>= 1;
        }
        crctable[i] = r;
    }
}

static unsigned char Std_Receive(unsigned char Port)
{
struct Serial_rcv xdata *Com;
unsigned char cTmp;
	Com = Rcv + Port;
	while  ( Com->Tail != Com->Head )    {
		cTmp=Com->Data[Com->Head++];
		Com->Head=Com->Head % sizeof(Com->Data);
		if ( (!Com->lastSOH && (cTmp == DLE) ) || (Com->lastSOH && (cTmp != DLE)) ) {
			if ( !Com->lastSOH ) { Com->lastSOH = 1 ; continue; }
			Com->lastSOH = 0;
			switch (cTmp) {
				case SOH:
					Com->pos = 0;
					Com->Start = 1;
					break;
				case EOT:
					if (Com->Start) {
						Com->Start = 0;
						return 1;
					}
					break;
				default:
					Com->Start = 0;
					break;
			}
			continue;
		}
        if (!Com->Start ) continue;
		Com->lastSOH = 0;
		Com->Buff[Com->pos++]= cTmp;
		Com->pos= Com->pos % sizeof(Com->Buff); 
	}  //end of while
    return 0;
}

void Std_Process(unsigned char Port)
{	// data is in Rcv.Buff[0]...[len-1]
	// type, address, ......, CRCL, CRCH
struct Serial_rcv xdata *Com;
unsigned int data CRC;
unsigned int xdata iTmp;
unsigned char xdata tmpBuff[256];
	if (!Std_Receive(Port)) return;
	Com = Rcv + Port;
	if (Com->pos < 4) return;
	CRC = 0;
	iTmp = 0;
	while (iTmp < Com->pos) { UPDATA_CRC(CRC, Com->Buff[iTmp++]); }   
	if (CRC != 0) return;
	if ( Com->Buff[1] != Address ) return;
	switch (Com->Buff[0]) { 
		case SET_PARA: 
			SetPara(Com->pos-4,&Com->Buff[2]);
			break;
		case SET_CAIJI:
/*			len =Com->Buff[2];  // new state of Relay 
			if (YkStyle == 0) {

			}
			else {
				RELAY2 =0;  
	 			iDelay = 200;		// output pulse
			}
*/			break;
		case GET_PARA: 
			ReadPara( tmpBuff);  
			iTmp = 13 + tmpBuff[5] * LENCMD + tmpBuff[10] * LENCMD;
			if ( Send_To_EXT_Buffer(Port, D_PARA, tmpBuff, iTmp) )  SendStart(Port);
			break;
		case GET_CAIJI:  // (center station)want getting the data of caiji-ban 
			SendYxYcToEXT(Port);
			break;
	}
}

unsigned char Send_To_EXT_Buffer(unsigned char Port,unsigned char Type,unsigned char xdata *buff,unsigned int len)
{
unsigned char xdata tmp_data[1024];
unsigned char xdata TempBuf[1024];
struct Serial_snd xdata *Com;
unsigned char data temp;
unsigned int data i, j;
unsigned int data CRC;
	Com = Snd + Port;
	TempBuf[0]=Type;	
	TempBuf[1]=Address;
	if (len > 0) memcpy(&TempBuf[2],buff,len);
	tmp_data[0] = DLE;
	tmp_data[1] = SOH;
	for(i = 0, j = 2, CRC = 0; i < (len + 2); i++) {
		temp=TempBuf[i];
		if(temp == DLE) tmp_data[j++] = DLE;
		tmp_data[j++] =temp;
		UPDATA_CRC(CRC,temp);
	}
	temp = CRC & 0x0ff;
	if(temp == DLE) tmp_data[j++] = DLE;
	tmp_data[j++] = temp;
	temp = (CRC>>8)&0xff;
	if(temp == DLE) tmp_data[j++] = DLE;
	tmp_data[j++] = temp;

	tmp_data[j++] = DLE;
	tmp_data[j++] = EOT;
	if(Com->Tail < Com->Head) {
		if(((unsigned int)Com->Tail + j) >= Com->Head)
			return 0;
		else {
			for(i = 0; i < j; i++)
				Com->Data[Com->Tail++]=tmp_data[i];
			return 1;
		}
	}
	else if ((sizeof(Snd[0].Data) - Com->Tail + Com->Head) > j) {
		for(i = 0; i < j; i++) {
			Com->Data[Com->Tail++] = tmp_data[i];
			Com->Tail = Com->Tail % sizeof(Snd[0].Data);
		}
		return 1;
	}
	else
		return 0;
}

void SendYxYcToEXT(unsigned char Port)
{
unsigned char xdata  SndBuff[1000];
unsigned char data i;
unsigned int data len;
unsigned int data iLen;
	len = 0;
	SndBuff[len++] = DATA_YX;
	SndBuff[len++] = Len_Yx;
	SndBuff[len++] = LastYx1 ^ 0xff;
	SndBuff[len++] = LastYx2 ^ 0xff;

	SndBuff[len++] = DATA_YC;
	SndBuff[len++] = Len_Yc;

	for (i=0; i<8; i++) {
		SndBuff[len++] = AD_Data[i] & 0xff;
		SndBuff[len++] = AD_Data[i] / 256;
	}

	SndBuff[len++] = DATA_COM1;
    if (Port1Style) {
		iLen = Port1Data[0] + Port1Data[1] * 256;
        memcpy(&SndBuff[len], &Port1Data[0], iLen + 2);
		Port1Data[0] = 0;
		Port1Data[1] = 0;
        len += iLen + 2;
    }
    else {
        SndBuff[len++] = 0;
        SndBuff[len++] = 0;
	}
	SndBuff[len++] = DATA_COM2;
    if (Port2Style) {
		iLen = Port2Data[0] + Port2Data[1] * 256;
        memcpy(&SndBuff[len], &Port2Data[0], iLen + 2);
		Port2Data[0] = 0;
		Port2Data[1] = 0;
        len += iLen + 2;
    }
    else {
        SndBuff[len++] = 0;
        SndBuff[len++] = 0;
	}
    if ( Send_To_EXT_Buffer(Port, D_CAIJI, SndBuff, len) )  SendStart(Port);
}



unsigned char Send_To_Port_Buffer(unsigned char Port, unsigned char xdata *buff, unsigned int len)
{
struct Serial_snd xdata *Com;
unsigned int data i;
	Com = Snd + Port;
	if(Com->Tail < Com->Head) {
		if(((unsigned int)Com->Tail + len) >= Com->Head)
			return 0;
		else {
			for(i = 0; i < len; i++)
				Com->Data[Com->Tail++]=buff[i];
			return 1;
		}
	}
	else if ((unsigned int)(Com->Head + sizeof(Com->Data) - Com->Tail ) > len) {
		for(i = 0; i < len; i++) {
			Com->Data[Com->Tail++] = buff[i];
			Com->Tail = Com->Tail % sizeof(Com->Data);
		}
		return 1;
	}
	else
		return 0;
}

unsigned char CommModeStoD(unsigned char str)
{
    str &= 0xdf; // 将小写转换成大写
    switch (str) {
        case 'N':  // None
            return 0x03;
            break;
        case 'M':  // 标记
            return 0x03 | 0x28;
            break;
        case 'S':
            return 0x03 | 0x38;
            break;
        case 'E':  // 偶数
            return 0x03 | 0x18;
            break;
        case 'O':  // 奇数
            return 0x03 | 0x08;
            break;
        default:
            return 0x03;
            break;
    }
}

void SetPara(unsigned int len, unsigned char xdata* Source)
{
unsigned char xdata tmpBuff[1024];
unsigned int data iTmp, crc;
unsigned int data i;
unsigned long data lTmp;
    for (crc=0,i=0; i<len; i++) UPDATA_CRC(crc,Source[i]);
    if (crc != 0) return;
 	iTmp = 11 + Source[5] * LENCMD + Source[10] * LENCMD;
    if (iTmp != (len-2)) return;
    if (Source[0] != 0x08) return;
    tmpBuff[0] = 0x08;
    if (Source[1] == 0) {
        tmpBuff[1] = 0;
        tmpBuff[4] = 0;
    }
    else {
        tmpBuff[1] = 1;
        iTmp = Source[3] * 256 + Source[2];
        lTmp = 172800 / iTmp;
        tmpBuff[2] = lTmp & 0xff;
        tmpBuff[3] = CommModeStoD(Source[4]);
        tmpBuff[4] = Source[5];
        if ( Source[5]>0 ) memcpy(&tmpBuff[9], &Source[11], Source[5] * LENCMD); 
    }
    if (Source[6] == 0) {
        tmpBuff[5] = 0;
        tmpBuff[8] = 0;
    }
    else {
        tmpBuff[5] = 1;
        iTmp = Source[8] * 256 + Source[7];
        lTmp = 172800 / iTmp;
        tmpBuff[6] = lTmp & 0xff;
        tmpBuff[7] = CommModeStoD(Source[9]);
        tmpBuff[8] = Source[10];
        if ( Source[10]>0 ) memcpy(&tmpBuff[9+tmpBuff[4] * LENCMD], &Source[11 + Source[5] * LENCMD], Source[10] * LENCMD); 
    }
    iTmp = 9 + tmpBuff[4] * LENCMD + tmpBuff[8] * LENCMD;
    crc = 0;
    for (i=0; i<iTmp; i++) UPDATA_CRC(crc,tmpBuff[i]);
    tmpBuff[iTmp] = crc & 0xff;
    tmpBuff[iTmp+1] = (crc>>8)&0xff;
    if ( WriteEE(tmpBuff, iTmp+2) ) SetCommPort();
}

unsigned char CommModeDtoS(unsigned char mode)
{
    switch (mode) {
        case 0x03:  // None
            return 'n';
            break;
        case 0x2b:  // 标记1
            return 'm';
            break;
        case 0x3b:  // 空格,0
            return 's';
            break;
        case 0x1b:  // 偶数
            return 'e';
            break;
        case 0x0b:  // 奇数
            return 'o';
            break;
        default:
            return 'N';
    }
}

void ReadPara(unsigned char xdata* Dest)
{
unsigned int data i;
unsigned int data CRC;
unsigned long xdata lTmp;
unsigned int xdata iTmp;
unsigned char xdata tmpBuff[sizeof(Port1Cmd) + sizeof(Port2Cmd) + 20];
unsigned char code initData[] = { 0x08, 0x00, 0xc0, 0x12, 'n', 0x00,
                                        0x00, 0xc0, 0x12, 'n', 0x00};
    ReadEE(tmpBuff, sizeof(Port1Cmd) + sizeof(Port2Cmd) + 11);
    memcpy( Dest, initData, sizeof(initData) );

   	if (tmpBuff[0] != 0x08) return;    // port * 2 { style, 9600, N/M/P/E, len}
	CRC = 0;
	iTmp = tmpBuff[4] * LENCMD + tmpBuff[8] * LENCMD + 11;   // 11 = 1 + 4 + 4 + 2(crc)
	for (i=0; i<iTmp; i++) UPDATA_CRC(CRC,tmpBuff[i]);
	if (CRC != 0) return;
	if (tmpBuff[1] == 1) {
		Dest[1] = 1;
        lTmp = 172800 / Port1Baud;
		Dest[2] = lTmp & 0xff;
		Dest[3] = (lTmp>>8) & 0xff;
        Dest[4] = CommModeDtoS(tmpBuff[3]);
		Dest[5] = tmpBuff[4];
		if ( tmpBuff[4]>0 ) memcpy(&Dest[11],&tmpBuff[9],tmpBuff[4] * LENCMD);
	}
	if (tmpBuff[5] == 1) {
		Dest[6] = 1;
        lTmp = 172800 / Port2Baud;
		Dest[7] = lTmp & 0xff;
		Dest[8] = (lTmp>>8) & 0xff;
        Dest[9] = CommModeDtoS(tmpBuff[7]);
		Dest[10] = tmpBuff[8];
		if ( tmpBuff[8]>0 ) memcpy(&Dest[11 + Dest[5] * LENCMD],&tmpBuff[9 + tmpBuff[4] * LENCMD],tmpBuff[8] * LENCMD);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -