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

📄 104sl.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;
		
		case U_STOPDTCON:
			
			break;
		
		case U_TESTFRACT:
			S104SendCtrlFrame(Port, U_TESTFRCON);
			break;
		
		case U_TESTFRCON:
			
			break;
			
		default:
			
			break;
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:S104ProcPeerNoAckNum()									*/
/*函数功能:处理对方确认											*/
/*输入说明:接受序列号												*/
/*------------------------------------------------------------------*/
BOOL S104ProcPeerNoAckNum(INT8U Port, INT16U PeerNR)
{
	INT8U	i, j;
	INT16U	tmp, num;
	char err[60];

	i = Port - NET1;	
	
	if (PeerNR <= ComLink[i]->NS)
		num = ComLink[i]->NS - PeerNR;
	else
		num = 32767 + ComLink[i]->NS - PeerNR;
	
	if (num > ComLink[i]->PeerNoAckNum)
	{
		//ceshi
		sprintf(err, "%04x; %04x; %04x; %04x 序列号确认错误", PeerNR, ComLink[i]->NS, ComLink[i]->PeerNoAckNum, num);
		ErrorInfo(OSPrioCur, err);
	
		return (FALSE);
	}

	for (j=0, tmp=0; j<ComLink[i]->PeerNoAckNum-num; j++)
	{
		if (ComLink[i]->DataType[j])
			tmp++;
	}
	
	for (j=0; j<num; j++)
	{
		ComLink[i]->Tick.TValue1[j] = ComLink[i]->Tick.TValue1[num+j];
		ComLink[i]->DataType[j] = ComLink[i]->DataType[num+j];
	}
	for (j=num; j<K; j++)
	{
		ComLink[i]->Tick.TValue1[j] = 0;
		ComLink[i]->DataType[j] = 0;
	}
	
	ComLink[i]->PeerNoAckNum = num;	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:S104SendCtrlFrame()										*/
/*函数功能:发送链路层数据数据,包括S和U格式						*/
/*输入说明:控制域类型												*/
/*------------------------------------------------------------------*/
void S104SendCtrlFrame(INT8U Port, INT8U Type)
{
	INT8U	i;
	struct PAPCI *pFrame;
	
	i = Port - NET1;
	pFrame = (struct PAPCI*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
	
	pFrame->StartCode = STARTCODE;
	pFrame->Length = 0x04;
	pFrame->NS = Type;
	if (Type == S_FRAME)
	{
		pFrame->NR = ComLink[i]->NR<<1;
		
		S104StopTick(Port, 2);
	}
	else
	{
		pFrame->NR = 0x00;
		
		if ((Type == U_STARTDTACT) || (Type == U_TESTFRACT))
		{
			S104BeginTick(Port, 1);
		}
		else
		{
			S104BeginTick(Port, 3);
		}
	}
	
	ComLink[i]->TxdTail += 0x06;
	
	ComLink[i]->DataType[ComLink[i]->PeerNoAckNum] = FALSE;
	ComLink[i]->PeerNoAckNum++;
	
	//发送
	S104SendDataToMISI(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:S104DLSendProc()										*/
/*函数功能:链路层发送处理											*/
/*------------------------------------------------------------------*/
void S104DLSendProc(INT8U Port, INT8U* pData, INT8U Len)
{
	INT8U	i;
	struct PAPCI *pFrame;
	
	i = Port - NET1;
	pFrame = (struct PAPCI*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
	
	if (Len == 0)
		return;

	pFrame->StartCode = STARTCODE;
	pFrame->Length = Len + 0x04;
	pFrame->NS = ComLink[i]->NS<<1;
	pFrame->NR = ComLink[i]->NR<<1;
	memcpy((INT8U*)(pFrame+1), pData, Len);
	ComLink[i]->TxdTail += Len + 0x06;		

	ComLink[i]->DataType[ComLink[i]->PeerNoAckNum] = TRUE;
	ComLink[i]->PeerNoAckNum++;
	ComLink[i]->NS++;

	//发送
	S104StopTick(Port, 2);
	S104BeginTick(Port, 3);
	S104SendDataToMISI(Port);

}
/*------------------------------------------------------------------*/
/*函数名称:S104BeginTick()											*/
/*函数功能:启动定时器												*/
/*输入说明:No:定时器号												*/
/*------------------------------------------------------------------*/
void S104BeginTick(INT8U Port, INT8U No)
{
	INT8U	i, j;
	
	i = Port - NET1;
	switch (No)
	{
		case 0:
			ComLink[i]->Tick.TValue0 = 0;
			ComLink[i]->Tick.Flag |= TICKT0USE;
			break;
			
		case 1:
			for (j=0; j<K; j++)
			{
				ComLink[i]->Tick.TValue1[j] = 0;
			}
			ComLink[i]->Tick.Flag |= TICKT1USE;			
			break;
			
		case 2:
			ComLink[i]->Tick.TValue2 = 0;
			ComLink[i]->Tick.Flag |= TICKT2USE;			
			break;
			
		case 3:
			ComLink[i]->Tick.TValue3 = 0;
			ComLink[i]->Tick.Flag |= TICKT3USE;			
			break;
	}

}

/*------------------------------------------------------------------*/
/*函数名称:S104StopTick()											*/
/*函数功能:停止定时器												*/
/*输入说明:No:定时器号												*/
/*------------------------------------------------------------------*/
void S104StopTick(INT8U Port, INT8U No)
{
	INT8U	i;
	
	i = Port - NET1;
	switch (No)
	{
		case 0:
			ComLink[i]->Tick.Flag &= (~TICKT0USE);
			break;
			
		case 1:
			ComLink[i]->Tick.Flag &= (~TICKT1USE);
			break;
			
		case 2:
			ComLink[i]->Tick.Flag &= (~TICKT2USE);			
			break;
			
		case 3:
			ComLink[i]->Tick.Flag &= (~TICKT3USE);			
			break;
	}

}

/*------------------------------------------------------------------*/
/*函数名称:S104StopDT()											*/
/*函数功能:停止数据传输,关闭TCP连接								*/
/*------------------------------------------------------------------*/
void S104StopDT(INT8U Port)
{
	INT32U	tmp;
	struct AppMsg	msg;
	
	if (Port == NET1)
		tmp = SCK0;
	else
		tmp = SCK1;
	
	msg.Cmd = DL_NOWORK;
	msg.ConNum = 0;
	msg.pData = NULL;
	msg.Len = 0;
	S104AppProc(Port, &msg);	

	//复位网口
	at91_pio_write (&PIO_DESC, tmp, PIO_SET_OUT);
	OSTimeDlyHMSM(0, 0, 0, 50);
	at91_pio_write (&PIO_DESC, tmp, PIO_CLEAR_OUT);
	OSTimeDlyHMSM(0, 0, 0, 50);
	at91_pio_write (&PIO_DESC, tmp, PIO_SET_OUT);

}

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

	S104SearchFrame(Port);
}

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

/*------------------------------------------------------------------*/
/*函数名称:S104NetTest()											*/
/*函数功能:网络连接判断											*/
/*------------------------------------------------------------------*/
void S104NetTest(INT8U Port)
{
	#ifdef	DF9311_NET
	INT8U	i;
	char	err[60];
	struct SysTime_t SystemTime;	
	i = Port - NET1;
	
	if (!LinkState(i))
	{
		if (ComLink[i]->Connect)
		{
			GetTime((void *)&SystemTime, SYSTIME);
			sprintf(err, "%04d-%02d-%02d %02d:%02d:%02d:%03d 网络连接中断...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond);
			ErrorInfo(OSPrioCur, err);
		}
		
		S104InitReset(Port);				
		ComLink[i]->Connect = FALSE;
		ComApp[i]->Connect = FALSE;
	}
	else if (!ComLink[i]->Connect)
	{
		GetTime((void *)&SystemTime, SYSTIME);
		sprintf(err, "%04d-%02d-%02d %02d:%02d:%02d:%03d 网络连接成功...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond);
		ErrorInfo(OSPrioCur, err);
		
		S104InitReset(Port);				
		ComLink[i]->Connect = TRUE;
	}
	#endif
}

⌨️ 快捷键说明

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