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

📄 uitransfer.c

📁 嵌入工linux开发的源码
💻 C
字号:
#include <pr2k.h>
#include <TypeDefine.h>


#ifdef __WIN32__
#include <uiTransfer.h>      
#include <uiUart.h>
#else
#include <uart.h>
#include <Transfer.h>      
#endif

#ifndef  __WIN32__
extern unsigned int gSecondTick;
#endif
                         
// return: second
unsigned int _GetTickCount()
{
	
#ifndef  __WIN32__
	
	return gSecondTick;
#else
	int t;
	
	t = GetTickCount();
	return  t/1000;
	
#endif
}
         
// graduation of timeOut is second
DLL_EXP(int)  MasterHandShake(int UartNo, short timeOut)
{
	unsigned int t0, t1;
	unsigned char ch;
	int ret;

//	rtsCh = HANDSHAKE_RTS;
//	okCh = HANDSHAKE_OK;
	t0 = _GetTickCount();
	while(1)
	{
		com_SendByte(UartNo, HS_MASTER_RTS);

        ret = hs_ReceiveByte(UartNo, &ch);
		if((ret==STATUS_OK)&&(ch==HS_SLAVE_ACK))
		{
			com_SendByte(UartNo, HS_MASTER_CONFIRM);
			return STATUS_OK;
		}


		t1 = _GetTickCount();

		if(t1<t0)
			break;

		if((t1-t0)>timeOut)
			break;

	}

	return HS_ERR_TIMEOUT;

}


DLL_EXP(int)  SlaveHandShake(int UartNo, short timeOut)
{
	unsigned int t0, t1;
	unsigned char ch ;
	int i, ret;

	if((UartNo!=COM1)&&(UartNo!=COM2))
		return HS_ERR_ARG;


	t0 = _GetTickCount();
                            
	while(1)
	{                                                 
		ret = com_ReceiveByte(UartNo, &ch);
		if((ret==STATUS_OK)&&(ch==HS_MASTER_RTS))
		{          
			//while(1)                                
			com_SendByte(UartNo, HS_SLAVE_ACK);
            
			do
			{                              
				ret = com_ReceiveByte(UartNo, (unsigned char *)&ch);

			}while((ret==STATUS_OK)&&(ch==HS_MASTER_RTS));
           
			if((ret!=STATUS_OK)||(ch!=HS_MASTER_CONFIRM))
			{   
				for(i=0; i<100; i++)
				{     
		    		ret = com_ReceiveByte(UartNo, &ch);
					//if(ret==STATUS_OK)                   
	                if((ret==STATUS_OK)&&(ch==HS_MASTER_CONFIRM))
						break;
				}
             
			}

			if((ret==STATUS_OK)&&(ch==HS_MASTER_CONFIRM))
			{
				return STATUS_OK;
			}
			else
				return HS_ERR_CONFIRM;
		}

		t1 = _GetTickCount();

		if(t1<t0)
			break;

		if((t1-t0)>timeOut)
			break;
	}

	return HS_ERR_TIMEOUT;
}



int swapInt(int data)
{
	int i;
	char *p;
	char buffer[4];

#ifdef __WIN32__
	p = (char *)&data;
	for(i=0; i<4; i++)
	{
		buffer[3-i] = p[i];
	}

	return *(int *)buffer;
#else

    return  data;
#endif

}

static unsigned int GetChecksum(unsigned char *buffer, unsigned int dataLen)
{
	unsigned int i, checksum=0;

	for(i=0; i<dataLen; i++)
		checksum += buffer[i];

	return checksum;
}

unsigned short  gErrCheckNum = 0;
unsigned short  gErrLenNum = 0;
unsigned short  gErrBlockNum = 0;

DLL_EXP(unsigned int) ReceivePackData(int UartNo, int packetNo, unsigned char *buffer)
{
	unsigned int len, readLen;
	unsigned int bgChkSum, checkSum;
	unsigned int swapNo, swapLen, swapChkSum;
	unsigned char ack; 
	int no;
	int i, iret, errorNum=0;                  
/*
	TDeviceState DS;    
	unsigned char byTemp;
                   
	DS.BaudRate = 9600;
	DS.Parity = NOPARITY; 
	DS.DataBits = 8;
	//DS.StopBits = ONESTOPBIT;
	DS.StopBits = TWOSTOPBITS;
*/

	for(i=0; i<10; i++)
	{                    

//		com_Close(COM2);
//		IrDA_Open("COM2", &DS);                                          

		iret = SlaveHandShake(UartNo, 50);
		if(iret!=STATUS_OK)
			continue;

		iret = com_Receive(UartNo, (unsigned char *)&no, 4);
		swapNo = swapInt(no);
		if(swapNo!=packetNo)
		{
			ack = ACK_ERRPACKETNO;
			com_Send(UartNo, (unsigned char *)&ack, 1);
			//ShowString(10, 125, "receive again OK");
			continue;
		}

		iret = com_Receive(UartNo, (unsigned char *)&len, 4);
		swapLen = swapInt(len);		
		if(iret!=4)
		{
			ack = ACK_ERRLEN;
			com_Send(UartNo, (unsigned char *)&ack, 1);
			//ShowString(10, 125, "receive again OK");
			continue;
		}

		readLen = com_Receive(UartNo, buffer, swapLen);
		if(readLen!=swapLen)
		{
			ack = ACK_ERRBLOCK;

			com_Send(UartNo, (unsigned char *)&ack, 1);

			//ShowString(10, 125, "receive again OK");
			continue;
		}

		iret = com_Receive(UartNo, (unsigned char *)&bgChkSum, 4);
                                            
		swapChkSum = swapInt(bgChkSum);
		checkSum = GetChecksum(buffer, readLen);

		if(swapChkSum==checkSum)
		{
			ack = ACK_OK;
			com_Send(UartNo, (unsigned char *)&ack, 1);
			return readLen;
		}

		//show_unsigned(10, 128, ++errorNum, DEC);
		//show_unsigned(10, 80, gUart0Error, DEC);
		ack = ACK_ERRCHECKSUM;
		com_Send(UartNo, (unsigned char *)&ack, 1);

		//show_unsigned(10, 112, ++gErrCheckNum, HEX);

	}

	return 0;
}

DLL_EXP(STATUS) SendPackData(int UartNo,  int packetNo, unsigned char *buffer, unsigned int len)
{
	unsigned int bgLen, checkSum;
	unsigned int lenSend, bgChkSum;
	//int bSucc;
	unsigned char ack;
	int iret, i, j;

	//bSucc = FAIL;
	bgLen = swapInt(len);

	for(i=0; i<10; i++)
	{                
                  
		iret = MasterHandShake(UartNo, 50);
		if(iret!=STATUS_OK)
			return iret;

		iret = com_Send(UartNo, (unsigned char *)&packetNo, 4);
		if(iret!=4)
		{
			//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
			continue;
		}


		iret = com_Send(UartNo, (unsigned char *)&bgLen, 4);
		if(iret!=4)
		{
			//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
			continue;
		}

		lenSend = com_Send(UartNo, buffer, len);
		if(lenSend!=len)
		{
			//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
			continue;
		}

		checkSum = GetChecksum(buffer, lenSend);

		bgChkSum = swapInt(checkSum);

		iret = com_Send(UartNo, (unsigned char *)&bgChkSum, 4);
		if(!iret)
		{
			//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
			continue;
		}

		ack = 0;
		for(j=0; j<10; j++)
		{
			iret = com_Receive(UartNo, (unsigned char *)&ack, 1);
			if(iret)
				break;
		}

		//if(iret && (ack==ACK_OK))
		if(iret && (ack<0xf0))
		{

			return STATUS_OK;
		}

	}

	return STATUS_ERR;
}


#ifdef BOOT_LOADER

void UartTest()
{
	unsigned int count=0, i=0, data, ret, loop;
	unsigned char buffer[4];
	TDeviceState DS;
	int row=0;

	DS.BaudRate = 57600;
	DS.Parity = NOPARITY;
	DS.StopBits = TWOSTOPBITS;

	com_Open(COM1, &DS);

	//OpenUart(PARITY_NONE, STOPBIT_2BIT, 57600);
	//OpenUart(COM1, PARITY_NONE, STOPBIT_1BIT, 57600);

	ShowString(10, 30, "Uart Test");

	/*if(HandShake(10)==FAIL)    // timeout is 6 second
	{
    	CloseUart();
		ShowString(10, 100, "Fail Connect");
		while(1);
	}
	*/

	ShowString(10, 30, "Send Data...");
	buffer[0]=0xff; buffer[1]=0xf8; buffer[2]=0x00; buffer[3]=0x00;

	for(i=0; i<64; i++)
	{
		com_Send(COM1, buffer, 4);
		//loop = 0x8000;
		//while(loop--);
	}


	displayClear();

	while(1)
	{
		if(!count)
		{
			ret = com_Receive(COM1, (char *)&data, 1);
			count++;
		}

		ret = com_Receive(COM1, (char *)&data, 4);

		count += ret;
		if(ret<4)
		{
			//displayClear();
			ShowString(10, 135, "total:");
			show_unsigned(50, 135, count, DEC);
			break;
		}

		if(i%2)
		{
			show_unsigned(85, 5+row*12, data, HEX);
			row++;
		}
		else
			show_unsigned(5, 5+row*12, data, HEX);

		i++;

		if(row>12)
		{
        	row=0;
			loop = 0xa000;
			while(loop--);
			displayClear();
		}

	}

	//CloseUart(COM1);
	com_Close(COM1);
	while(1);
}


void IrDA_Test(void)
{
	int loop;
	TDeviceState DS;
                   
	DS.BaudRate = 9600;
	DS.Parity = NOPARITY;
	DS.StopBits = ONESTOPBIT;

	IrDA_Open(COM2, &DS);
	while(1)
	{
		com_SendByte(COM2, 'A');
		loop = 0x1000;
		while(loop--);
                
		com_SendByte(COM2, 'B');
		//loop = 0x1000;
		//while(loop--);

		com_SendByte(COM2, 'C');
		loop = 0x1000;
		while(loop--);
	}
      
	com_Close(COM2);
	//CloseUart(COM1);
}

#endif
   

⌨️ 快捷键说明

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