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

📄 communicate.c

📁 基于S3C2410和SM501的彩屏控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			CheckDM9000();
			break;
			
		case 255:	// 卸去连接			
			connect = 0;			
			NetSendCommOK(UART0,UartSendBuf[UART0],RecData,0x55);	
			break;				

		default:	break;
	}//switch(SubCmd)	
}//NetCommProcess()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 网络数据检测及处理.
// 描述: 检测网络数据, 并处理网络数据包.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void CheckDM9000 (void)
{
	uchar cUdpData[1050];
	static ushort udpLen;
	ulong i;
	ulong DataLen;	
	uchar sum = 0;		// 校验和字节
	
	DataLen = 0;
	cUdpData[1] = 0;
	cUdpData[2] = 0;
	
	udpLen = NetRxPack(cUdpData,cIpAddr,(ushort *)&wport);	// 收取网络包数据,函数返回包长度CXTS
	DataLen = cUdpData[1] + (cUdpData[2]<<8);	// 数据长度

	// 数据包处理
	if( udpLen >= 6 && udpLen == DataLen)
	{
		for( i=0;i<DataLen;i++ ) 
		{
			sum += cUdpData[i];	//计算累加和
		}
		udpLen = 0;

		if( (sum & 0xff)==0 )
		{
			// 接收方地址与本机地址不等时,不处理
			if( cUdpData[3] != cLocalAddress )
				return;

			switch(cUdpData[4])		//命令
			{
				case 127:
					NetCommProcess(cUdpData);
					break;
					
				default:
					break;	
			}
		}
	}
}//CheckDM9000()


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 检查UART1.
// 描述: 串口1与PC机通信.
//
// [参数表]
//	Uart1ReceData: 串口0接收数据数组始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void CheckUart1(unsigned char *Uart1ReceData)
{
	uchar 	i, sum = 0;
	ulong	DataLen;	// 数据长度

	DataLen = Uart1ReceData[1] + (Uart1ReceData[2]<<8);		// 长度两个字节
	
	if((DataLen >= 6) && (DataLen == UartReceLen[UART1]))
	// 通过数据长度判断数据包是否已接收完毕
	{
		for( i=0; i<UartReceLen[UART1]; i++ )	// 计算累加和
		{
			sum += Uart1ReceData[i];
		}

		UartReceLen[UART1] = 0;		// 串口1接收长度清零
		DataLen = 0;				// 数据长度清零

		if( (sum & 0xff) == 0 )		// 校验和判断
		{
			// 接收方地址与本机地址不等时,不处理
			if( Uart1ReceData[3] != cLocalAddress )
				return;

			switch(Uart1ReceData[4])	//命令
			{
				case 127:
					Uart1_CommProcess(Uart1ReceData);	//子命令
					break;

				default:	break;
			}
		}
		else
		{
			Uart1_SendCommOK(0xAA);		//发送通信成功
		}
	}
}//CheckUart1()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: UART1发送通信成功.
// 描述: 向上位机发送通信成功数据包.
//
// [参数表]
// 	status: 状态.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart1_SendCommOK(unsigned char status)
{
	Uart1_SendBuf(0) = 2;
	Uart1_SendBuf(1) = 7+1;
	Uart1_SendBuf(2) = Uart1_ReceBuf(4);
	Uart1_SendBuf(3) = Uart1_ReceBuf(3);
	Uart1_SendBuf(4) = cLocalAddress;			//本机地址
	Uart1_SendBuf(5) = Uart1_ReceBuf(6);		//子命令
	Uart1_SendBuf(6) = status;
	
	CalCommSum(UART1,UartSendBuf[UART1], UART_SEND);		// 计算校验和
	UartStartSend(UART1);	// 启动串口发送
}//Uart1_SendCommOK()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口1通信处理.
// 描述: 根据数据包的子命令执行相应的通信处理操作.
//
// [参数表]
//	RecData: 接收数据数组的始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart1_CommProcess(unsigned char *RecData)
{	
	unsigned long	dwDstAddress, dwLength;
	unsigned char 	subCmd = RecData[6];	// 子命令
	unsigned long	i,j;
	
	switch(subCmd)
	{
		case 0:	//读控制板地址
			Uart1_SendCommOK(1);
			break;
			
		case 1:	//获取当前时间								
			SendCurrTime(UART1,UartSendBuf[UART1],RecData, UART_SEND);
			break;

		case 2:	//建立联络
			BuildConnect(UART1,UartSendBuf[UART1],RecData, UART_SEND);
			break;	
		
		case 7:		//读内存											
			ReadMemory(UartSendBuf[UART1],RecData,UART_SEND);
			UartStartSend(UART1);	
			break;
			
		case 8:		//写内存
			dwDstAddress = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);							
			dwLength = RecData[11]|(RecData[12]<<8);								
			memcpy((char *)dwDstAddress,(char *)&RecData[13],dwLength);
			Uart1_SendCommOK(0x55);
			break;  
			
		case 28:	//go, 程序复位
			goCommand(MAIN_ENTRY);	// 强制跳转到目标地址
			// 注: 要根据list文件中main_boot的入口地址进行赋值.
			break;
			
		case 29:	//
			Uart1_SendCommOK(0x55);
			break;
		
		case 30:	//把程序搬到Norflash
			dwLength = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
			j = (dwLength - 1)/NOR_FLASH_SECTOR_SIZE + 1;//擦除块数
			
			if(connect == 1)
			{
				for( i=0; i<j; i++)
				{
					if(EraseSector(i) == FALSE)
						return;
				}
				Writeflash((uchar *)DOWNLOAD_SDRAM_ADDR,0,dwLength);

				Uart1_SendCommOK(0x55);
			}
			break;

		case 255://卸去连接			
			connect = 0;			
			Uart1_SendCommOK(0x55);	
			break;				

		default:					
			break;
	}//switch(SubCmd)	
}//Uart1_CommProcess()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 检查UART2.
// 描述: 串口2与PC机通信.
//
// [参数表]
//	Uart2ReceData: 串口0接收数据数组始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void CheckUart2(unsigned char *Uart2ReceData)
{
	unsigned long 	i, sum = 0;
	unsigned long	DataLen;	// 数据长度

	DataLen = Uart2ReceData[1] + (Uart2ReceData[2]<<8);		// 长度两个字节
	
	if((DataLen >= 6) && (DataLen == UartReceLen[UART2]))
	// 通过数据长度判断数据包是否已接收完毕
	{
		for( i=0; i<UartReceLen[UART2]; i++ )	// 计算累加和
		{
			sum += Uart2ReceData[i];
		}

		UartReceLen[UART2] = 0;		// 串口2接收长度清零
		DataLen = 0;				// 数据长度清零

		if( (sum & 0xff) == 0 )		// 校验和判断
		{
			// 接收方地址与本机地址不等时,不处理
			if( Uart2ReceData[3] != cLocalAddress )
				return;

			switch(Uart2ReceData[4])	//命令
			{
				case 127:
					Uart2_CommProcess(Uart2ReceData);	//子命令
					break;

				default:	break;
			}
		}
		else
		{
			Uart2_SendCommOK(0xAA);		//发送通信成功
		}
	}
}//CheckUart2()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: UART2发送通信成功.
// 描述: 向上位机发送通信成功数据包.
//
// [参数表]
// 	status: 状态.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart2_SendCommOK(unsigned char status)
{
	Uart2_SendBuf(0) = 2;
	Uart2_SendBuf(1) = 7+1;
	Uart2_SendBuf(2) = Uart2_ReceBuf(4);
	Uart2_SendBuf(3) = Uart2_ReceBuf(3);
	Uart2_SendBuf(4) = cLocalAddress;			//本机地址
	Uart2_SendBuf(5) = Uart2_ReceBuf(6);		//子命令
	Uart2_SendBuf(6) = status;
	
	CalCommSum(UART2,UartSendBuf[UART2], UART_SEND);		// 计算校验和
	UartStartSend(UART2);	// 启动串口发送
}//Uart2_SendCommOK()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口2通信处理.
// 描述: 根据数据包的子命令执行相应的通信处理操作.
//
// [参数表]
//	RecData: 接收数据数组的始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart2_CommProcess(unsigned char *RecData)
{	
	unsigned long	dwDstAddress, dwLength;
	unsigned char 	subCmd = RecData[6];	// 子命令
	unsigned long	i, j;

	
	switch(subCmd)
	{
		case 0:	//读控制板地址
			Uart2_SendCommOK(1);
			break;
			
		case 1:	//获取当前时间								
			SendCurrTime(UART2,UartSendBuf[UART2],RecData, UART_SEND);
			break;

		case 2:	//建立联络
			BuildConnect(UART2,UartSendBuf[UART2],RecData, UART_SEND);
			break;	
		
		case 7:		//读内存											
			ReadMemory(UartSendBuf[UART2],RecData,UART_SEND);
			UartStartSend(UART2);	
			break;
			
		case 8:		//写内存
			dwDstAddress = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);							
			dwLength = RecData[11]|(RecData[12]<<8);								
			memcpy((char *)dwDstAddress,(char *)&RecData[13],dwLength);
			Uart2_SendCommOK(0x55);
			break;  
			
		case 28:	//go, 程序复位
			goCommand(MAIN_ENTRY);	// 强制跳转到目标地址
			// 注: 要根据list文件中main_boot的入口地址进行赋值.
			break;
			
		case 29:	//
			Uart2_SendCommOK(0x55);
			break;
		
		case 30:	//把程序搬到Norflash
			dwLength = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
			j = (dwLength - 1)/NOR_FLASH_SECTOR_SIZE + 1;	//擦除块数
			
			if(connect == 1)
			{
				for( i=0; i<j; i++)
				{
					if( EraseSector(i) == FALSE )
						return;
				}
				Writeflash((uchar *)DOWNLOAD_SDRAM_ADDR,0,dwLength);

				Uart2_SendCommOK(0x55);
			}
			break;

		case 255://卸去连接			
			connect = 0;			
			Uart2_SendCommOK(0x55);	
			break;				

		default:					
			break;
	}//switch(SubCmd)	
}//Uart2_CommProcess()



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 读内存.
// 描述: 读内存内容到发送数组单元.
//
// [参数表]
//	sendData: 发送数据数组的始地址.
//	RecData: 接收数据数组的始地址.
// 	sendType: 通信方式. 0-串口; 1-网络.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void ReadMemory (uchar *sendData,uchar *RecData, uchar sendType)
{
	unsigned long dwDstAddress;
	unsigned short dwLength;

	dwDstAddress = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);							
	dwLength     = RecData[11]|(RecData[12]<<8);
	
	sendData[0] = 2;
	sendData[1] = 12;
	sendData[2] = RecData[5];
	sendData[3] = RecData[4];
	sendData[4] = RecData[3];	// 本机地址
	sendData[5] = RecData[6];	// 子命令
	sendData[6] = 0x55;
	sendData[7] = RecData[7];
	sendData[8] = RecData[8];
	sendData[9] = RecData[9];
	sendData[10] = RecData[10];
	
	if(dwDstAddress < 0x400000)
	{// 读Norflash数据, 此时必须要建立连接
		if(connect == 1)
			memcpy((char *)&sendData[11],(char *)dwDstAddress,dwLength);
	}
	else
		memcpy((char *)&sendData[11],(char *)dwDstAddress,dwLength);
}//ReadMemory()



⌨️ 快捷键说明

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