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

📄 com.c

📁 中芯微VC0528测试程序
💻 C
字号:
/*
 *  Com.c
 *
 *  Copyright (C) 2004 Vimicro Corporation
 *  
 *  Written by TangMian	Email: tangmian@vimicro.com	Tel: 010-68948888-8902
 *
 *  Overview:
 *   This is a Serial Communication Firmware. It is used to Script Test.
 *
 *
 *   2005,10,27
 *		Released By TangMian.	Version 1.01
 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "Com.h"

void Com_SendData(char* pt, int num);

void ErrorCommand(void);
void RespondCommand(void);
void ReturnCommand(UINT8 vl);
UINT16 LengthCommand(void);
UINT8 GetDataCommand(UINT8* ptr, UINT16 length);

void InitComRecive(UINT32 baud, void (*func)(UINT8 uOneByte));


UINT8	m_buf[12];
UINT8	bcomnum = 0;

UINT32		dPara[64];


static UINT8	buffer[256];
static UINT8	bData[256];






static	UINT32	(*pReceiveFunc)(UINT8* pbDptr);
static	void	(*pSendFunc)(UINT8* pbDptr, UINT32 dNum);




//************************************************ API ******************************************************//
/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Initialize Uart0
 [ARGUMENTS]
			pReceiveCom:	Receive Function Pointer
			pSendCom:	Send Function Pointer
 [RETURN VALUE]
			NULL
------------------------------------------------------------------------------------------------------------*/
void Com_Init(UINT32 (*pReceiveCom)(UINT8* pbDptr), void (*pSendCom)(UINT8* pbDptr, UINT32 dNum))
{
	memset(m_buf, 0, 12);
	memset(buffer, 0, 256);
	memset(bData, 0, 256);
	memset((void*)dPara, 0, 64);
	pReceiveFunc = pReceiveCom;
	pSendFunc = pSendCom;
}



/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Check that wether command has been received
 [ARGUMENTS]
			NULL
 [RETURN VALUE]
			1: command received;	0: No command received
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_Check(void)
{

	UINT8*	sptr;
	
	sptr = m_buf + bcomnum;
	bcomnum += (UINT8)pReceiveFunc(sptr);
	/*
	if((m_buf[0]==0x80) && (bcomnum==0xA))
	{
		//bcomnum = 0; //leon
		return 1;
	}
	else
		return 0;*///leon
	if(m_buf[0]!=0x80)
		bcomnum=0;
	if(bcomnum>=0xA)
	{
		bcomnum = 0; 
		return 1;
	}
	else
		return 0;	

}

/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Get Command Main ID
 [ARGUMENTS]
			NULL
 [RETURN VALUE]
			ID Number	(0x81: 938; 0x82: 568; 0x83 Function ...)
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_GetMainID(void)
{
	return m_buf[1];
}

/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Get Function Parameter
 [ARGUMENTS]
			NULL
 [RETURN VALUE]
			1: Success; 0: Failed
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_GetFuncPara(void)
{
	UINT32	i, len;
	//UINT8*	sptr;
	
	//sptr = (UINT8*)dPara;
	len = LengthCommand();
	RespondCommand();
	i = GetDataCommand(bData, len);
	if (i)
	{
		//for(j=0; j<256; j++)
		//{
			//*sptr ++ = *(bData + j);
			memcpy((void*)dPara, (void*)(bData + 1), 256);
		//}
	}
	
	return i;
}


/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Get Function Command ID
 [ARGUMENTS]
			NULL
 [RETURN VALUE]
			ID Number
------------------------------------------------------------------------------------------------------------*/
UINT16 Com_GetFuncID(void)
{
	if(Com_GetFuncPara())
		return ((m_buf[2] << 8) | m_buf[3]);
	else
		return 0;
}


/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Return Function Result
 [ARGUMENTS]
			bParaNum:	The Number of Parameter to be returned
 [RETURN VALUE]
			1: Success; 0: Failed
------------------------------------------------------------------------------------------------------------*/
void Com_ReturnValue(UINT8 bParaNum)
{
	UINT32	Temp;
	//UINT8*	sptr;
	
	Temp = bParaNum * 4;
	
	//sptr = (UINT8*)dPara;
	buffer[0] = START_FLAG;
	buffer[1] = Temp + 4;
	buffer[2] = 0x0;
	buffer[3] = 0x0;
	memcpy((void*)(buffer + 4), (void*)dPara, Temp);
	buffer[Temp + 4] = 0x55;
	buffer[Temp + 5] = END_FLAG;
	
	Com_SendData((char*)buffer, (Temp + 6));
	
	bcomnum = 0;
	memset(m_buf, 0, 12);
	memset(buffer, 0, 256);

}

/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Return Error Command
 [ARGUMENTS]
			NULL
 [RETURN VALUE]
			NULL
------------------------------------------------------------------------------------------------------------*/
void ErrorCommand(void)
{
	//DisableInterrupt();
	buffer[0] = m_buf[0];
	buffer[1] = m_buf[1];
	buffer[2] = m_buf[2];
	buffer[3] = m_buf[3];
	buffer[4] = 0x00;
	buffer[5] = 0x02;		//Unknown Command
	buffer[9] = END_FLAG;
	Com_SendData((char*)buffer, 10);
	memset(m_buf, 0, 12);
	bcomnum = 0;
	//EnableInterrupt();
}

/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Download File to a Buffer
 [ARGUMENTS]
			filePtr : Buffer Point
			size : Buffer size
 [RETURN VALUE]
			NULL
// Add by aawolf 2005.12.1
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_DownloadFile(UINT8 * filePtr,UINT32 size)
{
	UINT8 * ptr;
	UINT32	filesize=0;
	char buffer[1];
	memset(buffer,0,1);

	ptr = filePtr;

	while(filesize<size)
	{
		if((size - filesize) < 512)
		{
			GetDataCommand(ptr, (size - filesize));
			break;
		}
		else
		{
			filesize += 512;
			GetDataCommand(ptr, 512);
			ptr += 512;
		}
		buffer[0] = 0x1;
		Com_SendData(buffer,1);
	}

	return 0;
}

/*------------------------------------------------------------------------------------------------------------
 [DESCRIPTION]
			Upload a Buffer to a File
 [ARGUMENTS]
			filePtr : Buffer Point
			size : Buffer size
 [RETURN VALUE]
			NULL
// Add by aawolf 2005.12.1
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_UploadFile(UINT8 * ptr,UINT32 size)
{
	UINT8	rx;
	char buffer[1];
	memset(buffer,0,1);

	while(size)
	{
		if(size > 512)
		{
			Com_SendData((char*)ptr, 512);
			ptr+=512;
			size-=512;
			//rx=Uart_Getch();
		}
		else
		{
			Com_SendData((char*)ptr, size);
			break;
		}
		//Delay(100);
		GetDataCommand((UINT8 *)buffer, 1);
		//if(buffer[0] != 0x1)
		//	return 0x1;


	}
	//rx=Uart_Getch();
	return 0;
}

//************************************************ API ******************************************************//



void Com_SendData(char* pt, int num)
{
	pSendFunc((UINT8*)pt, num);

}


void RespondCommand(void)
{
	memcpy(buffer, m_buf, 4);
	buffer[4] = buffer[5] = 0x0;
	buffer[9] = END_FLAG;
	Com_SendData((char*)buffer, 10);
}

void ReturnCommand(UINT8 vl)
{
	if(vl!=0)
	{
		buffer[1]=0x00;
		buffer[2]=vl;
	}
	buffer[14]=0x55;
	buffer[15]=END_FLAG;

	Com_SendData((char*)buffer, 16);
}

UINT16 LengthCommand(void)
{
	UINT16	length;

	length = ((m_buf[4] << 8) | m_buf[5]);
	length *= 4;
	length +=3;

	return length;
}


UINT8 GetDataCommand(UINT8* ptr, UINT16 length)
{

	UINT32	dComNum = 0;
	UINT32	dNum, timeout;
	UINT8*	sptr;
	
	sptr = ptr;
	dNum = timeout = 0;
	//while((dComNum < length) && (timeout >= 0x7ffffff))
	while((dComNum < length) && (timeout < 0x7ffffff))	//leon	
	{
		dNum = pReceiveFunc(sptr);
		if (dNum == 0)
			timeout ++;
		else
		{
			sptr += dNum;
			dComNum += dNum;
		}
	}
	if(timeout >= 0x7ffffff)
		return 0;
	else
		return 1;

}

⌨️ 快捷键说明

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