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

📄 101seclink.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
					ComLink[i]->DLCommand = DL_CALLDATA2;
					SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
					DLSendProc(Port);
					break;
					
				default:
					break;
			}
		}
		else	//FCB未翻转
		{
			if (ComLink[i]->FCBNoTurnNum)
			{
				ComLink[i]->FCBNoTurnNum--;
				if (ComLink[i]->FCBNoTurnNum) 
					SendSecDataToMISI(Port);
			}			
		}
	}
	else	//平衡模式下,收到主站的应答处理
	{
		
	}
}

/*------------------------------------------------------------------*/
/*函数名称:ExeDLFunCode68()										*/
/*函数功能:处理68帧数据											*/
/*------------------------------------------------------------------*/
void ExeDLFunCode68(INT8U Port)
{
	INT8U	i;
	struct CLPDUFRAME *pFrame;
	
	i = Port - 1;
	ComLink[i]->IdleTimeCount = 0;
	ComLink[i]->RetryCount = MAXRETRYNUM;
		
	pFrame = (struct CLPDUFRAME*)&ComLink[i]->RxdBuf[0];
	if (pFrame->Control & P101_PRM)	//非平衡式,被动接收命令
	{
		if ( ((pFrame->Control & P101_FCB) != (ComLink[i]->RlaConCode & P101_FCB))
			|| (!(pFrame->Control & P101_FCV)) )	//FCV无效 或 FCB翻转
		{
			if (pFrame->Control & P101_FCV)	//FCV有效
			{
				ComLink[i]->RlaConCode = pFrame->Control;
 		    	ComLink[i]->FCBNoTurnNum = MAXRETRYNUM;
			}
						
			switch (pFrame->Control & P101_FUNCODE)
			{
				case DLSENDCON:
					ComLink[i]->DLCommand = DL_SENDCON;
					SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
					DLSendProc(Port);
					break;
			
				case DLSENDNOCON:
					ComLink[i]->DLCommand = DL_SENDNOCON;
					SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
					DLSendProc(Port);
					break;
				
				case DLREQDATA2:
					ComLink[i]->DLCommand = DLREQDATA2;
					SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
					DLSendProc(Port);
					break;
			
			}
		}
		else	//FCB未翻转
		{
			if (ComLink[i]->FCBNoTurnNum)
			{
				ComLink[i]->FCBNoTurnNum--;
				if (ComLink[i]->FCBNoTurnNum) 
					SendSecDataToMISI(Port);
			}			
		}
	}
	else	//平衡模式下,收到主站的应答处理
	{
		
	}

}

/*------------------------------------------------------------------*/
/*函数名称:RecResetDL()											*/
/*函数功能:复位链路												*/
/*------------------------------------------------------------------*/
void RecResetDL(INT8U Port)
{
	INT8U i;
	
	i = Port - 1;
//	ComLink[i]->DLSecStatus = SECENABLE;
	ComLink[i]->RlaConCode &= 0xDF;	//清FCB位
	ComLink[i]->FlagData1 = FALSE;
	
	EditSecFra10(Port, DLCON);
	SendDataToMISI(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:RecDLACD()												*/
/*函数功能:														*/
/*------------------------------------------------------------------*/
void RecDLACD(INT8U Port)
{

}

/*------------------------------------------------------------------*/
/*函数名称:RecReqDLStatus()										*/
/*函数功能:请求链路状态											*/
/*------------------------------------------------------------------*/
void RecReqDLStatus(INT8U Port)
{
	INT8U i;
	
	i = Port - 1;
	ComLink[i]->FlagData1 = FALSE;
	
	EditSecFra10(Port, DLSTATUSOK);
	SendDataToMISI(Port);
}


/*------------------------------------------------------------------*/
/*函数名称:DLSendProc()											*/
/*函数功能:链路层发送处理											*/
/*------------------------------------------------------------------*/
void DLSendProc(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;
	
	if (ComApp[i]->AppCommand & APP_HAVEDATA1)
	{
		ComLink[i]->FlagData1 = TRUE;
		ComApp[i]->AppCommand &= 0xFF;
	}
	else
		ComLink[i]->FlagData1 = FALSE;
	
		
	switch(ComApp[i]->AppCommand)
	{
		case APP_APPCON:		//应用层对收到的数据做应答
			EditSecFra68(Port, DLCON);
			break;
			
		case APP_APPDIABALE:	//应用层无效
			break;
			
		case APP_SENDCON:		//发送03命令
			
			break;
		case APP_SENDNOCON:		//发送04命令 平衡模式

			break;
			
		case APP_SENDDATA:		//发送08命令
			EditSecFra68(Port, DLRESDATA);
			break;
			
		case APP_NODATA:		//应用层无数据
			EditSecFra10(Port, DLNODATA);
			break;
			
		case APP_NOJOB:			//应用层无任务
			
			break;
			
		default:
			break;
	}
	SendDataToMISI(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:EditSecFra10()											*/
/*函数功能:编辑从动站应答10帧										*/
/*------------------------------------------------------------------*/
void EditSecFra10(INT8U Port, INT8U Function)
{
	INT8U	i;
	struct FLPDUFRAME *pFrame;
	
	i = Port - 1;
	pFrame = (struct FLPDUFRAME*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
	
	pFrame->StartField = STARTCODE10;
	pFrame->Control = Function;
	pFrame->Control &= (~P101_DFC);
	if (ComLink[i]->FlagData1)
		pFrame->Control |= P101_ACD;
	else
		pFrame->Control &= (~P101_ACD);
	pFrame->Control &= (~P101_PRM);
	pFrame->Control |= P101_DIR;
	
	pFrame->LAddress = ComLink[i]->SourceNo;
	pFrame->CheckCode = (INT8U)cscrc((void*)&pFrame->Control, 2);
	pFrame->EndField = ENDCODE;
	
	ComLink[i]->TxdTail += 5;
	memcpy(ComLink[i]->TxdBuf_Sec, (INT8U*)pFrame, 5);
	ComLink[i]->TxdTail_Sec = 5;
}

/*------------------------------------------------------------------*/
/*函数名称:EditSecFra68()											*/
/*函数功能:编辑从动站应答68帧										*/
/*------------------------------------------------------------------*/
void EditSecFra68(INT8U Port, INT8U Function)
{
	INT8U	i;
	struct CLPDUFRAME *pFrame;
	
	i = Port - 1;	
	if (ComApp[i]->TxLen == 0)
		return ;

	pFrame = (struct CLPDUFRAME*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
	
	pFrame->StartField1 = STARTCODE68;
	pFrame->FramLength1 = ComApp[i]->TxLen + 2;
	pFrame->FramLength2 = ComApp[i]->TxLen + 2;
	pFrame->StartField2 = STARTCODE68;
	pFrame->Control = Function;
	pFrame->Control &= (~P101_DFC);
	if (ComLink[i]->FlagData1)
		pFrame->Control |= P101_ACD;
	else
		pFrame->Control &= (~P101_ACD);
	pFrame->Control &= (~P101_PRM);
	pFrame->Control |= P101_DIR;
	
	pFrame->LAddress = ComLink[i]->SourceNo;
	
	memcpy((INT8U*)&pFrame->LPDU[0], (INT8U*)&ComApp[i]->TxMsg, ComApp[i]->TxLen);
	pFrame->LPDU[ComApp[i]->TxLen] = (INT8U)cscrc((void*)&pFrame->Control, 2 + ComApp[i]->TxLen);
	pFrame->LPDU[ComApp[i]->TxLen + 1] = ENDCODE;
	
	ComLink[i]->TxdTail += ComApp[i]->TxLen + 8;
	memcpy(ComLink[i]->TxdBuf_Sec, (INT8U*)pFrame, ComApp[i]->TxLen + 8);
	ComLink[i]->TxdTail_Sec = ComApp[i]->TxLen + 8;
}


/*------------------------------------------------------------------*/
/*函数名称:RecMISIData()											*/
/*函数功能:接收MISI数据											*/
/*------------------------------------------------------------------*/
void RecMISIData(INT8U Port, BOOL Flag)
{
	INT16U	i, count;
	
	i = Port - 1;
	count = Readx((INT8U *)&ComLink[i]->RxdBuf[ComLink[i]->RxdTail], LPDUSIZE, Port);
	lseek(Port, count);
	
	if (Flag)
	{
		ComLink[i]->RxdTail += count;
		ComLink[i]->RxdLength += count;
	}
	
	SearchFrame(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:SendDataToMISI()											*/
/*函数功能:发送数据												*/
/*------------------------------------------------------------------*/
void SendDataToMISI(INT8U Port)
{
	INT16U	i, count, num;
	
	i = Port - 1;
	ComLink[i]->IdleTimeCount = 0;
	if (ComLink[i]->TxdHead >= ComLink[i]->TxdTail)
		return ;
	
	num = ComLink[i]->TxdTail - ComLink[i]->TxdHead;
	count = WriteX((INT8U *)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead], num, Port);
	
	ComLink[i]->TxdHead += count;
	if (ComLink[i]->TxdHead >= ComLink[i]->TxdTail)
	{
		ComLink[i]->TxdTail = 0;
		ComLink[i]->TxdHead = 0;
	}
}


/*------------------------------------------------------------------*/
/*函数名称:SendSecDataToMISI()											*/
/*函数功能:重发数据												*/
/*------------------------------------------------------------------*/
void SendSecDataToMISI(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;
	memcpy(&ComLink[i]->TxdBuf[ComLink[i]->TxdTail], ComLink[i]->TxdBuf_Sec, ComLink[i]->TxdTail_Sec);
	ComLink[i]->TxdTail += ComLink[i]->TxdTail_Sec;
	
	SendDataToMISI(Port);
}

⌨️ 快捷键说明

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