📄 lcd_link.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=¬e.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 + -