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

📄 c_hdlc.c

📁 这是电信语音聊天设备的源码
💻 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 + -