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

📄 net.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
字号:
#include "../ucos_ii/includes.h"


static INT32U NetBaud[] = {38400,19200,9600,4800,2400,1200,600,300,115200,57600,230400,460800,921600};


BOOL LinkState(UCHAR CommNo)
{
	INT8U State[2];

	if(CommNo == 0)
		{
			State[0] = *Com_AuxIn;
			if((State[0]&0x08) != 0)
				return TRUE;
		}
	else
		{
			State[1] = *Com_AuxIn;
			if((State[1]&0x80) != 0)
				return TRUE;
		}


	return FALSE;
}


UCHAR PollBaud(INT32U Baud)
{
	INT8U i;
	for(i=0;i<sizeof(NetBaud)/4;i++)
	{
		if(Baud == NetBaud[i])
			return i;
	}
	        return 9;
}

void NetCodeData(UCHAR *Psrc,UCHAR *Pdst)
{
	struct NetInfoHead *p;
	INT8U *a;
	p = (struct NetInfoHead *)Psrc;
	do
	{
		a = Psrc;
		*Pdst = ':';	Pdst++;
		gsmBytes2String(Psrc,(char*)Pdst,p->DataLength+5);
		Pdst += (p->DataLength+5)*2;
		Psrc += p->DataLength+5;
		*Pdst = '\r';	Pdst++;
		*Pdst = '\n';	Pdst++;
		p = (struct NetInfoHead *)Psrc;
	}while(p->DataType != EndRecordType);
	
	a = Psrc;
	*Pdst = ':';	Pdst++;
	gsmBytes2String(Psrc,(char*)Pdst,p->DataLength+5);
	Pdst += (p->DataLength+5)*2;
	Psrc += p->DataLength+5;
}



UCHAR NetCrc(unsigned char* Data,int Length)
{
	int sum=0,i;
	unsigned char crc;
	for(i = 0;i < Length;i++)
	{
		sum += *Data;
		Data++;
	}
	crc = 0x100 - (unsigned char)sum;
	return crc;
}
void NetCode(UCHAR *Data,UCHAR *Pdst)
{
	INT8U netinfolength,PackNo,i,j;
	INT8U *p;

	netinfolength = sizeof(struct netinfo);
	PackNo = netinfolength/0x20;

	p = Pdst;
	for(i=0;i<PackNo;i++)
	{
		*Pdst = 0x20;	Pdst++;
		*Pdst = 0x00;	Pdst++;
		*Pdst = i*0x20;	Pdst++;
		*Pdst = ConfigMemType;	Pdst++;
		for(j=0;j<0x20;j++)
		{
			*Pdst = *Data;
			Pdst++;	Data++;
		}
		*Pdst = NetCrc(p,0x24);	Pdst++;
		p = Pdst;
	}
	
	PackNo = netinfolength%0x20;
	
	*Pdst = PackNo;	Pdst++;
	*Pdst = 0x00;	Pdst++;
	*Pdst = i*0x20;	Pdst++;
	*Pdst = ConfigMemType;	Pdst++;	

	for(i=0;i<PackNo;i++)
	{
		*Pdst = *Data;
		Pdst++;	Data++;
	}
		*Pdst = NetCrc(p,PackNo+4);	Pdst++;
	
	p = Pdst;
	*Pdst = 0x00;	Pdst++;
	*Pdst = 0x00;	Pdst++;
	*Pdst = 0x00;	Pdst++;
	*Pdst = EndRecordType;	Pdst++;	
	*Pdst = NetCrc(p,4);
}

BOOL NetDecode(UCHAR *Data,UCHAR *Pdst)
{
	struct NetInfoHead *NetInfoHeadS;
	UCHAR NetDataLength,NetDataType = DefaultType,Crc,i,CrcSum;
	USHORT StartAddress;
	UCHAR  *p;
	p = Data;
	
	do
	{
		NetInfoHeadS = (struct NetInfoHead *)Data;
		NetDataLength = NetInfoHeadS->DataLength;
		StartAddress = NetInfoHeadS->DataStartAddress;
		StartAddress = reversebyte(StartAddress);
		NetDataType = NetInfoHeadS->DataType;
		
		NetInfoHeadS++;
		Data = (UCHAR *)NetInfoHeadS;
		
		Crc = NetCrc((UCHAR*)p,(int)(NetDataLength+4));
		CrcSum = *(Data+NetDataLength);
		if(Crc != CrcSum)
			return FALSE;
		for(i=0;i<NetDataLength;i++)		//数据拷贝
		{
			*Pdst = *Data;
			Pdst++; Data++;
		}
		Data++;					//Crc
		p = Data;
		
	}while(NetDataType != EndRecordType);
	return TRUE;
}

// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标数据指针
// 返回: 目标数据长度
int gsmString2Bytes(char* pSrc, unsigned char* pDst, int nSrcLength)
{
 	int i,n=0;
 	BOOL	IsHexFlag = FALSE;
	for (i = 0; i < nSrcLength; )
	{
		IsHexFlag = FALSE;
		if(((*pSrc >= '0') && (*pSrc <= '9'))||((*pSrc >= 'A') && (*pSrc <= 'F')))
		{
			// 输出高4位
			if ((*pSrc >= '0') && (*pSrc <= '9'))
			{
				*pDst = (*pSrc - '0') << 4;
			}
			else
			{
				*pDst = (*pSrc - 'A' + 10) << 4;
			}
			IsHexFlag = TRUE;
		}	
		pSrc++;
		i++;
		if(!IsHexFlag)	continue;
		if(((*pSrc >= '0') && (*pSrc <= '9'))||((*pSrc >= 'A') && (*pSrc <= 'F')))
		{
			// 输出低4位
			if ((*pSrc>='0') && (*pSrc<='9'))
			{
				*pDst |= *pSrc - '0';
			}
			else
			{
				*pDst |= *pSrc - 'A' + 10;
			}
			pDst++;
			n++;
		}
		pSrc++;
		i++;
	}

	// 返回目标数据长度
	return (n);
}

// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 
// 输入: pSrc - 源数据指针
//       nSrcLength - 源数据长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmBytes2String(unsigned char* pSrc, char* pDst, int nSrcLength)
{
	char tab[]="0123456789ABCDEF";	// 0x0-0xf的字符查找表
	int i;
	for (i = 0; i < nSrcLength; i++)
	{
		*pDst++ = tab[*pSrc >> 4];		// 输出高4位
		*pDst++ = tab[*pSrc & 0x0f];	// 输出低4位
		pSrc++;
	}

	// 输出字符串加个结束符
	*pDst = '\0';

	// 返回目标字符串长度
	return (nSrcLength * 2);
}

int ReadComm(UCHAR* pData,UCHAR port)
{
	int i = 0;
	if(port == 0)
	{		
		while(Usart0.Rxc_Wr != Usart0.Rxc_Rd)
		{
			*pData++ = Usart0.Rxc_Buff[Usart0.Rxc_Rd];
			i++;
			if(Usart0.Rxc_Rd<(RXC_BUFF_SIZE-1))
				Usart0.Rxc_Rd++;
			else
				Usart0.Rxc_Rd = 0;
		}
	}
	else
	{
		while(Usart1.Rxc_Wr != Usart1.Rxc_Rd)
		{
			*pData++ = Usart1.Rxc_Buff[Usart1.Rxc_Rd];
			i++;
			if(Usart1.Rxc_Rd<(RXC_BUFF_SIZE-1))
				Usart1.Rxc_Rd++;
			else
				Usart1.Rxc_Rd = 0;
		}
	}
	return i;
}
int UsartWrite(UCHAR *pbuf, ULONG count,UCHAR port)
{
	int i;
	if(port != 0)
	{
		for(i=0; i<count; i++)
		{
			Usart1.Txc_Buff[Usart1.Txc_Wr] = *(pbuf+i);
			if(Usart1.Txc_Wr<(TXC_BUFF_SIZE-1))
			    	Usart1.Txc_Wr++;
			else  
			    	Usart1.Txc_Wr=0;
		}
		while ((US1_CSR & US_TXEMPTY) == 0);
		US1_IER |= US_TXEMPTY;
	}
	else
	{
		for(i=0; i<count; i++)
		{
			Usart0.Txc_Buff[Usart0.Txc_Wr] = *(pbuf+i);
			if(Usart0.Txc_Wr<(TXC_BUFF_SIZE-1))
			    	Usart0.Txc_Wr++;
			else  
			    	Usart0.Txc_Wr=0;
		}
		while ((US0_CSR & US_TXEMPTY) == 0);
		US0_IER |= US_TXEMPTY;
	}
	return i;
}

int put_char(UCHAR c,UCHAR port)	/*chario.c*/
{
	UCHAR buf[2];

		buf[0] = c;
		UsartWrite((UCHAR *)buf, 1, port);
	return((int)c);
}

void putstring(char *string,UCHAR port)
{
	while(*string)
	{
		put_char(*string,port);
		string++;
	}
}


void ResetNet(UCHAR port,BOOL Task)
{
	if(port)
	{
		at91_pio_write (&PIO_DESC, SCK1, PIO_SET_OUT ) ;
		if(Task)
			OSTimeDlyHMSM(0,0,0,50);
		else
			delay(50);											     
		at91_pio_write (&PIO_DESC, SCK1, PIO_CLEAR_OUT ) ;
		if(Task)
			OSTimeDlyHMSM(0,0,0,50);
		else
	    	delay(50);											
		at91_pio_write (&PIO_DESC, SCK1, PIO_SET_OUT ) ;
	}
	else
	{
		at91_pio_write (&PIO_DESC, SCK0, PIO_SET_OUT ) ;
		if(Task)
			OSTimeDlyHMSM(0,0,0,50);
		else
			delay(50);											
		at91_pio_write (&PIO_DESC, SCK0, PIO_CLEAR_OUT ) ;
		if(Task)
			OSTimeDlyHMSM(0,0,0,50);
		else
	    	delay(50);											
		at91_pio_write (&PIO_DESC, SCK0, PIO_SET_OUT ) ;
	}
}
/*--------------------------------------------------------------------
目的:读出网络配置参数
输入:CommNo 串口号 Task 是否多任务已运行
输出:struct NetInfoConfig *info
--------------------------------------------------------------------*/
BOOL NetConfigInfo(UCHAR CommNo, struct NetInfoConfig *info, BOOL Task)
{
	UCHAR AscTmp[350],BinTmp[350],NetBinTmp[150],NetBinCode[150];
	USHORT i,a;
	char   *ptr;
	struct netinfo *NetInfo;
	if(Task)
	{
		OSTaskSuspend(YXID);
		OSTaskSuspend(FAID);
		OSTaskSuspend(YCID);
		OSTaskSuspend(USART1ID);
		OSTaskSuspend(USART2ID);
	}
	if(CommNo == 0)
	{
		Usart0_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
	}
	else if(CommNo == 1)
	{
		Usart1_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
	}
	ResetNet(CommNo,Task);
	for(i=0;i<40;i++)
	{
		if(Task)
			OSTimeDlyHMSM(0,0,0,50);
		else
			delay(50);										
		put_char('z',CommNo);
	}
	if(Task)
		OSTimeDlyHMSM(0,0,0,500);
	else
		delay(500);										
	ReadComm(AscTmp,CommNo);
	if(strstr((char *)AscTmp,"*** NodeSet 2.0 ***") != 0)
	{
		ptr = strchr((char *)AscTmp,'>');
		if(ptr==NULL)
			return FALSE;
		switch(*(ptr-1))
		{
			case 0x30:
			{
				putstring("GC",CommNo);
				put_char(0x0d,CommNo);
				if(Task)
					OSTimeDlyHMSM(0,0,0,400);
				else
					delay(400);
				memset(AscTmp,0,sizeof(AscTmp));
				ReadComm(AscTmp,CommNo);
					
					
				memset(BinTmp,0,sizeof(BinTmp));
				memset(NetBinTmp,0,sizeof(NetBinTmp));
				memset(NetBinCode,0,sizeof(NetBinCode));
				memcpy(BinTmp,AscTmp+4,19*16-1);
				memset(AscTmp,0,sizeof(AscTmp));
				
				a = gsmString2Bytes((char*)BinTmp,NetBinTmp,strlen((char*)BinTmp));
//				gsmBytes2String(NetBinCode,(char*)NetBinTmp,a);
				NetDecode((UCHAR*)NetBinTmp,NetBinCode);
				NetInfo = (struct netinfo *)NetBinCode;
				
				info->SubnetMask = ConfigToNetMask(NetInfo->Netmask);
				info->Baud = NetBaud[NetInfo->LineSpeed];
				info->Ip = INT8UToINT32U((INT8U*)NetInfo->IPAdress);
				info->DefGetway = INT8UToINT32U((INT8U*)NetInfo->Gateway);
				info->ServerPort = INT8UToINT16U((INT8U*)NetInfo->OwnPortNo);
				break;
			}
			case 0x31:
			{
				break;
			}
			case 0x32:
			{
				break;
			}
			case 0x38:
			{
				break;
			}
			case 0x39:
			{
				break;
			}
			default:
				return FALSE;
		}
	}
	return TRUE;
}
/*------------------------------------------------------------------*/
/*函数名称:InitNet()												*/
/*函数功能:网口初始化												*/
/*输入说明:Flag:FALSE--网口1;TRUE:--网口2							*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
BOOL InitNet(BOOL Flag, struct NetInfo *info,BOOL Task)
{
	UCHAR tmp[350],testtmp[350],NetCommand[200],CommNo;
	USHORT a,i;
	char   *ptr;
	struct netinfo *NetInfo;
	struct NetInfoConfigG6 *G6NetInfo;
	if(Task)
	{
		OSTaskSuspend(YXID);
		OSTaskSuspend(FAID);
		OSTaskSuspend(YCID);
		OSTaskSuspend(USART1ID);
		OSTaskSuspend(USART2ID);
	}

   	memset(tmp,0,sizeof(tmp));
   	
   	if(Flag == FALSE)
   	{
   		Usart0_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
   		CommNo = 0;
   	}
   	
	else
   	{
		Usart1_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
		CommNo = 1;
	}
		ResetNet(CommNo,Task);
		for(i=0;i<60;i++)
		{
			if(Task)
				OSTimeDlyHMSM(0,0,0,50);
			else
				delay(50);										
			put_char('z',CommNo);
		}
		if(Task)
			OSTimeDlyHMSM(0,0,0,500);
		else
			delay(500);										
		ReadComm(tmp,CommNo);
		if(strstr((char *)tmp,"*** NodeSet 2.0 ***") != 0)
		{
			ptr = strchr((char *)tmp,'>');
			if(ptr==NULL)
				return FALSE;
			switch(*(ptr-1))
			{
				case 0x30:
				{
					memset(tmp,0,sizeof(tmp));
					putstring("GC",CommNo);
					put_char(0x0d,CommNo);
					if(Task)
						OSTimeDlyHMSM(0,0,0,400);
					else
						delay(400);
					ReadComm(tmp,CommNo);
					
					
					memset(testtmp,0,sizeof(testtmp));
					memset(NetCommand,0,sizeof(NetCommand));
					memcpy(testtmp,tmp+4,19*16-1);

					a = gsmString2Bytes((char*)testtmp,NetCommand,strlen((char*)testtmp));
					gsmBytes2String(NetCommand,(char*)tmp,a);
					NetDecode((UCHAR*)NetCommand,tmp);
					NetInfo = (struct netinfo *)tmp;

					NetInfo->LineSpeed = PollBaud(info->Baud);							//在这里修改网络设置
					INT32UToINT8U(info->Ip,(INT8U *)NetInfo->IPAdress);
					INT32UToINT8U(info->Ip,(INT8U *)NetInfo->RomoteIpAddress);
					NetInfo->Netmask = NetMaskToConfig(info->SubnetMask);
					INT32UToINT8U(info->DefGetway,(INT8U *)NetInfo->Gateway);
					
					INT16UToINT8U(info->ServerPort,(INT8U *)NetInfo->OwnPortNo);
					INT16UToINT8U(info->ServerPort,(INT8U *)NetInfo->RomotePortNo);
					
					NetInfo->Line.Mode = 0;
					NetInfo->Line.DateBit = 3;
					NetInfo->Line.Parity = 0;
					NetInfo->Line.StopBit = 1;
					NetInfo->ConnectConfig = 0xc0;
					NetInfo->Reserved0 = 0;
					NetInfo->FlagByte = 0;
					NetInfo->TCPKeepalive = 0x2d;
					NetInfo->FlowControl = 0;
					NetInfo->Reserved1 = 0;
					NetInfo->UnconnectConfig = 0x01;
					NetInfo->UnconnectMinutes = 0;
					NetInfo->UnconnectSeconds = 0;
					memset((char *)NetInfo->Telnet_config_password,0,4);
					memset((char *)NetInfo->TriggerSend,0,88);
					
					
					memset(testtmp,0,sizeof(testtmp));
					NetCode(tmp,testtmp);
					NetCodeData(testtmp,tmp);
					
					putstring("SC",CommNo);
					put_char(0x0d,CommNo);
					if(Task)
						OSTimeDlyHMSM(0,0,0,100);
					else
						delay(100);
					ReadComm(testtmp,CommNo);
					
					putstring((char *)tmp,CommNo);
					memset(tmp,0,sizeof(tmp));
					if(Task)
						OSTimeDlyHMSM(0,0,0,500);
					else
						delay(500);
					ReadComm(tmp,CommNo);



					memset(tmp,0,sizeof(tmp));
					putstring("G7",CommNo);
					put_char(0x0d,CommNo);
					if(Task)
						OSTimeDlyHMSM(0,0,0,400);
					else
						delay(400);
					ReadComm(tmp,CommNo);
										
					memset(testtmp,0,sizeof(testtmp));
					memset(NetCommand,0,sizeof(NetCommand));
					memcpy(testtmp,tmp+4,20*16-1);

					a = gsmString2Bytes((char*)testtmp,NetCommand,strlen((char*)testtmp));
					gsmBytes2String(NetCommand,(char*)tmp,a);
					NetDecode((UCHAR*)NetCommand,tmp);
					G6NetInfo = (struct NetInfoConfigG6 *)tmp;
					
					G6NetInfo->CP1_option = XportLED1;
					G6NetInfo->IN1_statue = 0;
					G6NetInfo->OUT1_statue = 0;
					G6NetInfo->LED1_statue = 1;

					memset(testtmp,0,sizeof(testtmp));
					NetCode(tmp,testtmp);
					
					memset(tmp,0,sizeof(tmp));
					
					NetCodeData(testtmp,tmp);
					
					putstring("S7",CommNo);
					put_char(0x0d,CommNo);
					if(Task)
						OSTimeDlyHMSM(0,0,0,100);
					else
						delay(100);
					ReadComm(testtmp,CommNo);
					
					putstring((char *)tmp,CommNo);
					memset(tmp,0,sizeof(tmp));
					if(Task)
						OSTimeDlyHMSM(0,0,0,500);
					else
						delay(500);
					ReadComm(tmp,CommNo);

					if(strstr((char*)tmp,"0>"))
						return TRUE;
					else
						return FALSE;
					
					break;
				}
				case 0x31:
				{
					break;
				}
				case 0x32:
				{
					break;
				}
				case 0x38:
				{
					break;
				}
				case 0x39:
				{
					break;
				}
				default:
					i = *(ptr-1);
			}
		}
		
	return FALSE;
}


void printf0(char *fmt, ...)
{
    va_list argptr;
    char temp_buf[256];

    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    putstring(temp_buf,0);
    va_end(argptr);
}
void printf1(char *fmt, ...)
{
    va_list argptr;
    char temp_buf[256];

    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    putstring(temp_buf,1);
    va_end(argptr);
}

UCHAR BitTest(UINT Value)
{
	UINT t;
	UCHAR i;
	t = 0x80000000;
	for(i=32;i!=0;i--)
	{
		if(((Value&t)^t)==t)
			return i;
		else
			t>>=1;
	}
	return 0;
}

⌨️ 快捷键说明

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