📄 c_hdlc.c
字号:
/************主要完成和后台的HDLC通信********/
#pragma CODE DEBUG SYMBOLS OBJECTEXTEND
#include <reg51.h>
#include <absacc.h>
#include "Const.h"
#include "Extern.h"
extern void receive();
void RR_frame()//准备好祯
{
send_frame[0] = send_frame[1] = 0x7e;
send_frame[2] = send_frame[3] = 1 + (vr << 5);
send_frame[4] = send_frame[5] = 0x77;
send_ctrl_byte = send_frame[2];
send_inf_flag = 0;
send_data_start = 0;
send_data_length = 6;
}
void REJ_frame()//拒绝祯
{
send_frame[0] = send_frame[1] = 0x7e;
send_frame[2] = send_frame[3] = 0x09 + (vr << 5);
send_frame[4] = send_frame[5] = 0x77;
send_ctrl_byte = send_frame[2];
send_inf_flag = 0;
send_data_start = 0;
send_data_length = 6;
}
void RIM_frame()//请求初始化
{
send_frame[0] = send_frame[1] = 0x7e;
send_frame[2] = send_frame[3] = 0x07;
send_frame[4] = send_frame[5] = 0x77;
send_ctrl_byte = send_frame[2];
ns = 0;
send_inf_flag = 0;
send_data_start = 0;
send_data_length = 6;
}
void UA_frame()//响应祯
{
send_frame[0] = send_frame[1] = 0x7e;
send_frame[2] = send_frame[3] = 0x03;
send_frame[4] = send_frame[5] = 0x77;
send_ctrl_byte = send_frame[2];
send_inf_flag = 0;
send_data_start = 0;
send_data_length = 6;
}
void INF_frame()//信息祯
{
unsigned char xdata INF_i,INF_k;
unsigned char xdata INF_check;
unsigned int xdata INF_j;
unsigned int xdata sdbh_send;
send_frame[0] = send_frame[1] = 0x7e;
send_frame[2] = (vs << 1) + (vr << 5);
INF_check = send_frame[2];
INF_j = 3;
send_77_count = 0;
INF_k = 0;
sdbh_send = sdbh;
while((sdbh != sdbt) && (INF_k < 8))
{
INF_i = 0;
while(INF_i < 8)
{
send_frame[INF_j] = sdbuf[(sdbh_send + INF_j - 3 - send_77_count) & 0x7ff];
INF_check += send_frame[INF_j];
INF_i++;
if(send_frame[INF_j] == 0x77)
{
send_77_count++;
INF_j++;
send_frame[INF_j] = 0;
}
INF_j++;
}
sdbh = sdbh + 8;
sdbh = sdbh & 0x7f8;
INF_k++;
}
send_frame[INF_j++] = INF_check;
if (INF_check == 0x77)
{
send_77_count++;
send_frame[INF_j++] = 0;
}
send_frame[INF_j++] = 0x77;
send_frame[INF_j++] = 0x77;
send_ctrl_byte = send_frame[2];
send_data_start = 0;
send_inf_flag = 1;
send_data_length = INF_j;
}
void decode_hdlc_frame()//解祯
{
unsigned char xdata i,k;
unsigned char xdata check;
unsigned int xdata uint_point;
if(rv_err)
{
if(send_inf_flag == 1)
{
sdbh = (sdbh - send_data_length + send_77_count + 6) % BUF_LEN;
}
REJ_frame();
rv_err = 0;
}
else if (!(rv_ctrl_byte & 1))
{
check = 0;
for(uint_point = rv_start;uint_point != rv_end;uint_point = (uint_point + 1) & 0x7ff)
{
check = check + rvbuf[uint_point];
}
ns = ((rv_ctrl_byte >> 1) & 0x07);
nr = ((rv_ctrl_byte >> 5) & 0x07);
check = check & IDLE;
if(check != rvbuf[rv_end])
{
REJ_frame();
}
else if((nr == ((vs + 1) & 7)) && (ns == vr))
{
vs = ((vs + 1) & 7);
vr = ((vr + 1) & 7);
k = 0;
rv_start++;
rv_start = rv_start & 0x7ff;
while(rv_start != rv_end)
{
i = 0;
while(i < 16)
{
p_data[i] = rvbuf[rv_start];
if((rvbuf[rv_start] == 0x77) && (rvbuf[(rv_start + 1) & 0x7ff] == 0))
{
rv_start++;
rv_start = rv_start & 0x7ff;
}
rv_start++;
rv_start = rv_start & 0x7ff;
i++;
}
receive();
}
if (sdbt != sdbh)
{
INF_frame();
}
else
{
RR_frame();
}
}
else if((nr == vs) && (ns == vr))
{
vr = ((vr + 1) & 7);
k = 0;
rv_start++;
rv_start = rv_start & 0x7ff;
while(rv_start != rv_end)
{
i = 0;
while(i < 16)
{
p_data[i] = rvbuf[rv_start];
if((rvbuf[rv_start] == 0x77) && (rvbuf[(rv_start + 1) & 0x7ff] == 0))
{
rv_start++;
rv_start = rv_start & 0x7ff;
}
rv_start++;
rv_start = rv_start & 0x7ff;
i++;
}
receive();
}
if(send_inf_flag)
{
send_data_start = 0;
}
else if(sdbt != sdbh)
{
INF_frame();
}
else
{
RR_frame();
}
}
else if((nr != vs) && (nr != ((vs + 1) & 7)) && (ns == vr))
{
vs = 0;
vr = ((vr + 1) & 7);
if(send_inf_flag ==1)
{
sdbh = (sdbh + send_77_count + 6 - send_data_length) % BUF_LEN;
}
RIM_frame();
}
else if((nr == ((vs + 1) & 7)) && (ns != vr))
{
vs = ((vs + 1) & 7);
REJ_frame();
}
else if((nr == vs) && ( ns!= vr))
{
if(send_inf_flag == 1)
{
sdbh = (sdbh + send_77_count + 6 - send_data_length) % BUF_LEN;
}
vr = 0;
RIM_frame();
}
else
{
if(send_inf_flag == 1)
{
sdbh = (sdbh + send_77_count + 6 - send_data_length) % BUF_LEN;
}
ns = 0;
nr = 0;
RIM_frame();
}
}
else
{
nr = (rv_ctrl_byte >> 5) & 0x07;
switch(rv_ctrl_byte & 0x0f)
{
case 0x07: //SIM Frame
{
ns = 0;
nr = 0;
vr = 0;
vs = 0;
UA_frame();
}
break;
case 0x01: //RR Frame
{
if(nr == ((vs + 1) & 7))
{
vs = ((vs + 1) & 7);
if(sdbh != sdbt)
{
INF_frame();
}
else
{
RR_frame();
}
}
else if(nr == vs)
{
if(send_inf_flag)
{
send_data_start == 0;
}
else
{
if (sdbh != sdbt)
{
INF_frame();
}
else
{
RR_frame();
}
}
}
else
{
RIM_frame();
}
}
break;
case 0x09: //REJ Frame
{
if ((send_ctrl_byte & 0xf) == 0x9)
{
RR_frame();
}
else
{
send_data_start = 0;
}
}
break;
default:
{
REJ_frame();
}
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -