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

📄 101prilink.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	if (pFrame->Control & P101_ACD)
	{
		ComLink[i]->DLCommand |= DL_REC_ACD;
	}
	
	if (pFrame->LAddress != ComLink[i]->ActDevAddr)
	{
		ComLink[i]->ActDevAddr = pFrame->LAddress;
		ComLink[i]->ActIndex = P101GetIndexByAddr(Port, ComLink[i]->ActDevAddr);
	}

	if ((pFrame->Control & 0x0F) == DLCON)
	{
		ComLink[i]->DLDevs[ComLink[i]->ActIndex].FCBNoTurnNum = 0;
	}


	PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
	P101DLSendProc(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:P101ExeDLFunCode68()									*/
/*函数功能:处理68帧数据											*/
/*------------------------------------------------------------------*/
void P101ExeDLFunCode68(INT8U Port)
{
	INT8U	i;
	struct CLPDUFRAME *pFrame;
	
	i = Port - 1;
	pFrame = (struct CLPDUFRAME*)(&ComLink[i]->RxdBuf[ComLink[i]->RxdHead]);
	
	switch (pFrame->Control & P101_FUNCODE)
	{
		case DLCON:			
			ComLink[i]->DLCommand = DL_APPCON;
			break;
		case DLRESDATA:
			ComLink[i]->DLCommand = DL_SENDDATA;
			break;
	}
	
	
	if (pFrame->Control & P101_DFC)
	{
	
	}
	
	if (pFrame->Control & P101_ACD)
	{
		ComLink[i]->DLCommand |= DL_REC_ACD;
	}


	if (pFrame->LAddress != ComLink[i]->ActDevAddr)
	{
		ComLink[i]->ActDevAddr = pFrame->LAddress;
		ComLink[i]->ActIndex = P101GetIndexByAddr(Port, ComLink[i]->ActDevAddr);
	}
	
	PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
	P101DLSendProc(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:P101DLSendProc()										*/
/*函数功能:链路层发送处理											*/
/*------------------------------------------------------------------*/
void P101DLSendProc(INT8U Port)
{
	INT8U	i, err;
	BOOL	fnext = FALSE;
	
	i = Port - 1;
	
	//更新链路层的记录
	ComLink[i]->ActIndex = ComApp[i]->ActIndex;
	ComLink[i]->ActDevAddr = ComLink[i]->DLDevs[ComLink[i]->ActIndex].DestAddr;

	
	//编辑发送帧
	switch(ComApp[i]->AppCommand)
	{
		case APP_APPCON:		//应用层对收到的数据做应答
			ComLink[i]->DLCommand = 0;
			PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
			P101DLSendProc(Port);
			break;
			
		case APP_APPDIABALE:	//应用层无效
			break;
			
		case APP_SENDCON:		//发送03命令
			P101EditFra68(Port, DLSENDCON);
			break;
			
		case APP_SENDNOCON:		//发送04命令
			fnext = TRUE;
			P101EditFra68(Port, DLSENDNOCON);
			break;
		
		case APP_TESTDLINK:		//测试链路
			if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus == PRIDISABLE)
				ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = PRIWAITSTATUS;
			else
				ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = PRIWAITINITEND;
				
			P101EditFra10(Port, DLTESTDL);
			break;
			
		case APP_SENDDATA:		//发送08命令
			P101EditFra68(Port, DLRESDATA);
			break;
			
		case APP_REQSTATUS:
			P101EditFra10(Port, DLREQSTATUS);
			break;

		case APP_CALLDATA1:
			P101EditFra10(Port, DLREQDATA1);
			break;
		
		case APP_CALLDATA2:
			P101EditFra10(Port, DLREQDATA2);
			break;
		
		case APP_NODATA:		//应用层无数据
			P101EditFra10(Port, DLNODATA);
			break;
			
		case APP_NOJOB:			//应用层无任务
			
			break;
			
		default:

			break;
	}
	
	//发送数据
	P101SendDataToMISI(Port);
	
	if (fnext)
	{
		ComApp[i]->AppCommand = 0;
//		OSTimeDly(2); 
		OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
	}	
}

/*------------------------------------------------------------------*/
/*函数名称:P101EditFra10()											*/
/*函数功能:编辑10帧												*/
/*------------------------------------------------------------------*/
void P101EditFra10(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;
	
	if ((Function==DLRESETRDL) || (Function==DLREQACD) || (Function==DLREQSTATUS))
		pFrame->Control &= (~P101_FCV);
	else
		pFrame->Control |= P101_FCV;
	if (ComLink[i]->ActDevAddr == 0xFF)
		pFrame->Control &= (~P101_FCV);
	
	if ((pFrame->Control & P101_FCV))		//FCV有效,FCB翻转
	{
		if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode & P101_FCB)
			pFrame->Control &= (~P101_FCB);
		else
			pFrame->Control |= P101_FCB;
		
		ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode = pFrame->Control;
	}

	pFrame->Control |= P101_PRM;
	pFrame->Control &= (~P101_DIR);
	
	pFrame->LAddress = ComLink[i]->ActDevAddr;
	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;
}

/*------------------------------------------------------------------*/
/*函数名称:P101EditFra68()											*/
/*函数功能:编辑68帧												*/
/*------------------------------------------------------------------*/
void P101EditFra68(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;
	
	if ((Function==DLSENDCON) || (Function==DLREQDATA1) || (Function==DLREQDATA2))
		pFrame->Control |= P101_FCV;
	else
		pFrame->Control &= (~P101_FCV);
	if (ComLink[i]->ActDevAddr == 0xFF)
		pFrame->Control &= (~P101_FCV);
	
	if ((pFrame->Control & P101_FCV))		//FCV有效,FCB翻转
	{
		if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode & P101_FCB)
			pFrame->Control &= (~P101_FCB);
		else
			pFrame->Control |= P101_FCB;
		
		ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode = pFrame->Control;
	}

	pFrame->Control |= P101_PRM;
	pFrame->Control &= (~P101_DIR);
	
	pFrame->LAddress = ComLink[i]->ActDevAddr;
	
	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;
}

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

/*------------------------------------------------------------------*/
/*函数名称:P101SendDataToMISI()									*/
/*函数功能:发送数据												*/
/*------------------------------------------------------------------*/
void P101SendDataToMISI(INT8U Port)
{
	INT16U	i, count, num;
	
	i = Port - 1;
	ComLink[i]->TimeOutCount = 0;
//	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;
	}
}

/*------------------------------------------------------------------*/
/*函数名称:P101SendSecDataToMISI()									*/
/*函数功能:重发数据												*/
/*------------------------------------------------------------------*/
void P101SendSecDataToMISI(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;
	
	P101SendDataToMISI(Port);
}























⌨️ 快捷键说明

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