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

📄 lcd_link.c

📁 外部接传感器完成数据采集
💻 C
字号:
#include <cxfunc1.h>
#include <at8252.h>	
#include <string.h>
#include <absacc.h>
#include <intrins.h>
#include <math.h>
#include <stdio.h>
#include <ctype.h>                   
#include <stdlib.h>
#include <lcd_func.h>
#include <lcd_def.h>
#include <lcd_ext.h>
//判断是否是匹配站号 
long int is_matching_stat(unsigned char *p)
{          
	unsigned int xdata vC;

	if(dadrS==0) return(SUCCESS);
	else{
		vC=(unsigned int)(*(p+3)<<8)+(unsigned int)(*(p+4));
		if(vC==dadrS) return(SUCCESS);
		else return(OK);             
	}       
}
//判断是否是命令帧
long int is_cmd_frm(unsigned char *p)
{
	unsigned char xdata vC;
  
	vC = *(p + 5);
	if(vC & 0x80){
		return(SUCCESS);
	}
	return(OK);
}
//判断PF是否置位(是否需要回UA帧)  
long int pf_is_set(unsigned char *p)
{
	unsigned int xdata v;
	unsigned char xdata c;
  
	v=(unsigned int)get_ctl_offset(p);
	c = *(p + v + 4);
	if(c & 0x80){
		return(SUCCESS);
	}
	return(OK);
}

//链接处理
void link_proc(void)
{
	long int xdata vc;
	
	if(rec_frmC()){
		comS.rec_bufCP=comS.rec_bufCA;
		//if(chk_event_flagI(DIS_COLG_VAL)){
		//	set_event_flag(KEY_INTERMIT);
		//}              
		vc=is_matching_stat(comS.rec_bufCP);
		if(vc==SUCCESS){
			vc=is_cmd_frm(comS.rec_bufCP);
			if(vc==SUCCESS){                        
				vc=get_frm_type(comS.rec_bufCP);
				get_stat_adr();
				switch(vc){

					/*case CNET:
					if(chk_event_flagI(IS_IFRM_LINK)){
						create_ua_frm();
						set_event_flag(NEED_REC);
					}
					break;

					case I:
					if(chk_event_flagI(IS_IFRM_LINK)){
						create_rr_frm();
						set_event_flag(NEED_REC);
						copy_com_frm();
					}
					break;

					case DISC:
					if(chk_event_flagI(IS_IFRM_LINK)){
						create_dm_frm();
						clr_event_flag(IS_IFRM_LINK);
						set_event_flag(DIS_COLG_VAL);
						dis_colg_val();
					}
					break;*/

					case UI:
					if(pf_is_set(comS.rec_bufCP)){
						create_ua_frm();
					}
					frm_proc();
					break;

					default:
					break;
				}
			}
		}
	}
	is_again_xmit();
	proc_com_interfere();
}

//获得帧类型
long int get_frm_type(unsigned char *p)
{
	unsigned char xdata c;
	unsigned long int xdata v;

	v = get_ctl_offset(p);
	c = comS.rec_bufCA[v];
	if(!(c & 0x01)){
		return(I); 
	}
	c &= 0x0f;
	if(c == 0x01){ 
		return(RR);
	}
	if(c == 0x05){
		return(RNR);
	}
	if(c == 0x09){
		return(REJ);
	}
	c = comS.rec_bufCA[v];
	c &= 0xef;
	if(c == 0x03){
		return(UI);
	}
	if(c == 0x2f){
		return(CNET);
	}
	if(c == 0x43){
		return(DISC);
	}
	if(c == 0x0f){
		return(DM);
	}
	if(c == 0x63){
		return(UA);
	}
	if(c == 0x87){
		return(FRMR);
	}
	return(OK);
}

//获得帧长度
unsigned int get_frm_len(void)
{
	unsigned char xdata s;
	unsigned int xdata lenC;

	comS.rec_bufCP=comS.rec_bufCA;
	s=get_ctl_offset(comS.rec_bufCP);
	lenC=(unsigned int)(*(comS.rec_bufCP+s+1)<<8)+(unsigned int)(*(comS.rec_bufCP+s+2));
	return(lenC);
}

/*//复制自记数据到内存
void copy_com_frm(void)
{
	unsigned char xdata s;
	unsigned int xdata frm_lenC;

	note.bufCP=&note.bufCA[note.lenC];
	comS.rec_bufCP=comS.rec_bufCA;              
	frm_lenC=get_frm_len();
	note.lenC+=(unsigned long int)frm_lenC;
	if(note.lenC>=10028){
		get_stat_adr();
		delay(3);
		create_dm_frm();
		clr_event_flag(IS_IFRM_LINK);
		set_event_flag(DIS_COLG_VAL);
		dis_colg_val(); 
	}
	else{
		s=(get_ctl_offset(comS.rec_bufCP)+3);
		memcpy(note.bufCP,(comS.rec_bufCP+s),frm_lenC);
	}
}*/

//get the control field offset of a frame
//input:  p:  pointer of the frame start
//return:     offset of the start
long int get_ctl_offset(unsigned char *p)
{
	unsigned char xdata c;
  
	c = *(p + 5) & 0x07;        //rpt_adr num
	return((long int)c * 2 + 6);
}

//fill frame head into buffer
//return: length of head
void fill_head(unsigned char frm_type)
{
	unsigned char xdata *vCP;

	vCP=comS.xmit_bufCA;
	*vCP++=0x7e;
	*vCP++=(unsigned char)(dadrS>>8);
	*vCP++=(unsigned char)dadrS;
	*vCP++=(unsigned char)(sadrS>>8);
	*vCP++=(unsigned char)sadrS;
	*vCP++=0x00;
	*vCP++=frm_type;
}

//create ua response frame
//return:   FAULT:          lnk_info fault
//          OK:             success
void create_ua_frm(void)
{
	unsigned char xdata *vCP;

	vCP=comS.xmit_bufCA;
	vCP+=7;
	fill_head(0x73);
	*vCP++=0x00;             //high byte of frame length
	*vCP++=0x00;             //low byte of frame lehgth
	*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],8);
	comS.xmit_cntC=11;
	clr_port_bit(1);
	XMIT_INT_ON;
} 
/*//create RR frame
//return:   FAULT:          lnk_info fault
//          OK:             success
void create_rr_frm(void)
{
	unsigned char xdata i_numC,*vCP;

	vCP=comS.xmit_bufCA;
	vCP+=7;
	i_numC=(comS.rec_bufCA[6]<<4)+0x21;
	fill_head(i_numC);                       //RR type
	*vCP++=0x00;               //high byte of frame length
	*vCP++=0x00;               //low byte of frame lehgth
	*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],8);
	comS.xmit_cntC=11;
	clr_port_bit(1);
	XMIT_INT_ON;
}
//create RNR frame
//return:   FAULT:          lnk_info fault
//          OK:             success
void create_rnr_frm(void)
{
	unsigned char xdata i_numC,*vCP;

        vCP=comS.xmit_bufCA;
        vCP+=7;
        i_numC=(comS.rec_bufCA[6]<<4)+0x25;
        fill_head(i_numC);                       //RR type
        *vCP++=0x00;               //high byte of frame length
        *vCP++=0x00;               //low byte of frame lehgth
        *((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],8);
        comS.xmit_cntC=11;
        clr_port_bit(1);
        XMIT_INT_ON;
}
//create dm response frame
//return:   FAULT:          lnk_info fault
//          OK:             success
void create_dm_frm(void)
{
       unsigned char xdata *vCP;

       vCP=comS.xmit_bufCA;
       vCP+=7;
       fill_head(0x0f);
       *vCP++=0x00;             //high byte of frame length
       *vCP++=0x00;             //low byte of frame lehgth
       *((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],8);
       comS.xmit_cntC=11;
       clr_port_bit(1);
       XMIT_INT_ON;
}*/

//发送命令帧	
void snd_frm(unsigned char cmd_numC)
{
	unsigned char xdata * vCP;

	vCP=comS.xmit_bufCA;
	comS.xmit_bufCP=comS.xmit_bufCA;
	*vCP++=0x7e;
	*vCP++=(unsigned char)(dadrS>>8);
	*vCP++=(unsigned char)dadrS;
	*vCP++=(unsigned char)(sadrS>>8);
	*vCP++=(unsigned char)sadrS;
	*vCP++=0x80;
	*vCP++=0x03;
		switch(cmd_numC){

		case DIS_CURR_RAIN:	    
		*vCP++=0x00;
		*vCP++=0x02;
		*vCP++=0x30;
		*vCP++=0x90;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],10);
		comS.xmit_cntC=13;
		break; 

		/*case DIS_COLG_VAL:
		*vCP++=0x00;
		*vCP++=0x18;
		*vCP++=0xdf;
		*vCP++=0x81;
		*vCP++=0x01;
		*vCP++=0xb0;
                *vCP++=0x00;
		*vCP++=0x12;
                *vCP++=0x00;
		*vCP++=0x01;
                *vCP++=0x30;
		*vCP++=0x00;
                *vCP++=0x00;
		*vCP++=0x00;
                *vCP++=(unsigned char)(colg.begin_timeC>>24);
                *vCP++=(unsigned char)(colg.begin_timeC>>16);
                *vCP++=(unsigned char)(colg.begin_timeC>>8);
                *vCP++=(unsigned char) colg.begin_timeC;
                *vCP++=(unsigned char)(colg.end_timeC>>24);
                *vCP++=(unsigned char)(colg.end_timeC>>16);
                *vCP++=(unsigned char)(colg.end_timeC>>8);
                *vCP++=(unsigned char) colg.end_timeC;
                *vCP++=0x00;
		*vCP++=0x00;
                *vCP++=0x00;
                *vCP++=0x00;
	        *((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],32);
		comS.xmit_cntC=35;
                set_event_flag(IS_IFRM_LINK);                                           
                break;*/

                case DIS_TIME_LIVE:        //send command of reading sys time
                *vCP++=0x00;
		*vCP++=0x02;
		*vCP++=0x08;
		*vCP++=0xb0;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],10);
		comS.xmit_cntC=13;
                break;

                case SET_TIME_LIVE:        //send command of set sys time
                *vCP++=0x00;
                *vCP++=0x08;
                *vCP++=0x08;
                *vCP++=0xa8;
                *vCP++=0x00;
                *vCP++=0x04;
                *vCP++=(unsigned char)(sys_timeS.totl_seC>>24);
                *vCP++=(unsigned char)(sys_timeS.totl_seC>>16);
                *vCP++=(unsigned char)(sys_timeS.totl_seC>>8);
                *vCP++=(unsigned char)sys_timeS.totl_seC;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],16);
		comS.xmit_cntC=19;
                break;

                case SET_STAT_LIVE:
                *vCP++=0x00;
                *vCP++=0x08;
                *vCP++=0x8b;
                *vCP++=0x02;
                *vCP++=0xa8;
                *vCP++=0x00;
                *vCP++=0x03;
                *vCP++=(unsigned char)(stat.adrC>>8);
                *vCP++=(unsigned char)stat.adrC;
                *vCP++=0x00;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],16);
		comS.xmit_cntC=19;
                break;

                case STARTUP_CFG:         //start up configure
                *vCP++=0x00;
                *vCP++=0x0a;
                *vCP++=0x87;
                *vCP++=0x02;
                *vCP++=0xa8;
                *vCP++=0x00;
                *vCP++=0x05;
                *vCP++=0x03;
                *vCP++=0x00;
                *vCP++=0x00;
                *vCP++=0x00;
                *vCP++=0x00;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],18);
		comS.xmit_cntC=21;
                break;

                case STARTUP_WORK:
                *vCP++=0x00;
                *vCP++=0x0a;
                *vCP++=0x87;
                *vCP++=0x02;
                *vCP++=0xa8;
                *vCP++=0x00;
                *vCP++=0x05;
                *vCP++=0x04;
                *vCP++=0x00;
                *vCP++=0x00;
                *vCP++=0x00;
                *vCP++=0x00;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],18);
		comS.xmit_cntC=21;
                break;

                case POWER_UP:
                *vCP++=0x00;
		*vCP++=0x02;
		*vCP++=0x09;
		*vCP++=0xa8;
		*((unsigned int *)vCP)=chk_crc(&comS.xmit_bufCA[1],10);
		comS.xmit_cntC=13;
 		break;

		default:
		break;	
	}
	clr_port_bit(1);
	XMIT_INT_ON;
	set_event_flag(NEED_REC);  
}

//重新发送
void is_again_xmit(void)         
{
	if(timer_cnt_b>=15){
		if(chk_event_flagI(NEED_REC)){
			xmit_numC--;
			if(xmit_numC==0){
		 		clr_event_flag(NEED_REC);
				xmit_numC=3;
			}
			clr_port_bit(1);
			XMIT_INT_ON;
		}
	}
}

//处理通信干扰
void proc_com_interfere(void)
{
	if(timer_cnt_h>=3){
		if((comS.frm_headC==TRUE)&&(comS.rec_overC==FALSE)){
			comS.rec_bufCA[0]=0;
			comS.rec_bufCP=comS.rec_bufCA;
			comS.rec_cntC=0;
			set_port_bit(0);
			comS.frm_headC=FALSE;
			comS.rec_overC=FALSE;
		}               
	}
}

//function:	CRC校验		 		 			 	
unsigned char rec_frmC(void)
{
	unsigned int xdata crcI,vc;

	if(!comS.rec_overC) return(FALSE);
	crcI=chk_crc(&comS.rec_bufCA[1],comS.rec_numC-3);
	vc=comS.rec_bufCA[comS.rec_numC-2]*256+comS.rec_bufCA[comS.rec_numC-1];
	if(crcI==vc){	
		comS.rec_numC=0;	
		comS.rec_overC=FALSE;
		return(TRUE);
	}
	return(FALSE);
}

#pragma NOAREGS
void update_xmit(void)
{
	TI=FALSE;

	if(comS.xmit_bufCP-comS.xmit_bufCA==comS.xmit_cntC){                
		comS.xmit_bufCP=comS.xmit_bufCA;
		set_port_bit(1);
                init_recv();
	}
	else{
		SBUF = *comS.xmit_bufCP++;	
	}
        timer_cnt_b=0;
}
#pragma AREGS

#pragma NOAREGS
void update_rec(void)
{
	RI=FALSE;

	if(chk_event_flagI(NEED_REC)) clr_event_flag(NEED_REC);
	if(comS.rec_bufCP-comS.rec_bufCA<256){
		*comS.rec_bufCP=SBUF;
		if(!comS.frm_headC){
			if(*comS.rec_bufCP==0x7e){
				timer_cnt_h=0;
				comS.rec_bufCP++;
			 	comS.rec_cntC++;
			 	comS.frm_headC=TRUE;
			   	clr_port_bit(0);
		       	}				
		}
	       	else{
			if(++comS.rec_cntC==9){
			      	comS.rec_numC=*comS.rec_bufCP+11; //get length of frame
			}
		       	if(comS.rec_cntC==comS.rec_numC){
			   	comS.rec_bufCP=comS.rec_bufCA;
			 	comS.rec_cntC=0;
			   	comS.frm_headC=FALSE;
			   	comS.rec_overC=TRUE;
			   	set_port_bit(0);
			}
			else{
			       	comS.rec_bufCP++;
		       	}
		}
	}		
}
#pragma AREGS


⌨️ 快捷键说明

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