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

📄 main.c

📁 一个实现一个串口扩展四个串口的实现程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	t1 = c&0xff;
//	t2 = (c>>8)&0xff;

//	SBUF=t2;
//	while(TI==0);
//		TI=0;
	SBUF=t1;
	while(TI==0);
		TI=0;


	for(i=0;i<LEN_COM;i++)
	{
		SBUF = MSendBuff[i];
		while(TI==0);
		TI=0;
	}

}
#endif

#if CPU_DO_AS_TX
/********************************************************************/  
void SerialSendInterrupt(void)	interrupt 12	// UART SEND INTERRUPT
{
	if(TI)
	{
		if(s_ucMSendBuffTail != s_ucMSendBuffTop)
		{
			SBUF = MSendBuff[s_ucMSendBuffTail++];
			s_ucMSendBuffTail %= SEND_BUFF_LEN;
		}
	}
	TI =0;
}
#endif

#if CPU_DO_AS_RX
void SerialReceiveInterrupt(void) interrupt 4	//UART interrupt 接收数据
{

	uchar tmp;
	static uchar ucCount = 0;
//	EA=0;
	if(RI)
	{
		tmp = SBUF;
		if(Flag_First)
		{
			
			if(tmp==FrameHead1)
			{
				Flag_First=0;
				Flag_Second=1;	//start rev 2nd byte
			}
		}
		else if(Flag_Second)
		{
			
			if(tmp==FrameHead2)
			{
				Flag_Second=0;	//start rev 3rd byte,COm No
				Flag_Third=1;
			}
		}
		else if(Flag_Third)
		{
		//这里假定了在以桢头开始的后面len个数据都是来自同一个串口。
			ComNo= tmp>>4;		// com no is high 4 bit
			len = tmp&0x0F;
			
			g_tMRevBuff[ComNo].port = ComNo;
//			g_tMRevBuff[ComNo].len =len;
			if( (len >0) && (len < RECEIVE_BUFFER_LENGTH))
			{
				Flag_Data = TRUE;
				Flag_Third=0;
			}
			else
			{
				Flag_First = 1;
				Flag_Third = 0;
			}
		}
		else if(Flag_Data)
		{					
#if 0
			if(len <= LEN_COM)
			{
				g_tMRevBuff[ComNo].aucData[g_tMRevBuff[ComNo].len++] = tmp;
				if(len == g_tMRevBuff[ComNo].len)
				{
					
					g_tMRevBuff[ComNo].flag = TRUE;
					Flag_First = 1;
					Flag_Data = 0; 
					
				}
			}
#endif		
			g_tMRevBuff	[ComNo].aucData[g_tMRevBuff[ComNo].ucTop++] = tmp;
			g_tMRevBuff[ComNo].ucTop %= RECEIVE_BUFFER_LENGTH;
/*			
			if(g_tMRevBuff[ComNo].ucTop == g_tMRevBuff[ComNo].ucTail)
			{
//				LED =~LED;
			}
*/			
			ucCount++;
			if(len == ucCount)
			{
				Flag_First = 1;
				Flag_Data = 0; 
				ucCount = 0;
			}
			
	
		}
	RI=0;
	}
//	EA=1;
}
#endif

/***********************************************************
 Function:	
 Describe:	
 Input:		
 Output:	
 record:
 * wan 9/10/2007 config for vk3224
***********************************************************/
void Vk3224Init(void)
{
	uchar temp1,temp2,tmp;
	uchar baudrate,framelen,parity;
//	uint Back;
//reset VK3224,low	
	RST_VK =0;
	Delay(10);
	RST_VK =1;
	Delay(2000);
//config com1	
	temp1=C1BAUD1;
	temp2=C1BAUD0;
	tmp=(temp1<<1) | temp2;
	switch(tmp)
	{
		case 0x00: baudrate = BAUDRATE_300;break;	
		case 0X01: baudrate = BAUDRATE_600; break;
		case 0X02: baudrate = BAUDRATE_1200;break; 
		default: baudrate = BAUDRATE_1200;break;
	}

	if(C1CHK_EXIT)
	{
 	    framelen = FRAME_LEN_11;
		if(C1CHK)	//奇校验
		{
			parity = PARITY_ODD;
		}
		else
		{
			parity = PARITY_EVEN;
		}
	}
	else
	{
	    framelen = FRAME_LEN_10;
	}

	SoftCountNum[0] = baudrate;	//cdy, ((10bit*1000ms)/baudrate)*length*timer0	
	SetComXBaudrate(0, baudrate);
	SetComXConfig(0,PARITY_NONE, FRAME_LEN_10);
	Delay(10);
//	Back = ReadComXConfig(0); 
//	TestSent(Back);	//test
//config com2	
	temp1=C2BAUD1;
	temp2=C2BAUD0;
	tmp=(temp1<<1) | temp2;
	switch(tmp)
	{
		case 0x00: baudrate = BAUDRATE_300; break;
		case 0X01: baudrate = BAUDRATE_600; break;
		case 0X02: baudrate = BAUDRATE_1200;break;
		default:baudrate = BAUDRATE_1200;break;
	}

	if(C2CHK_EXIT)
	{
 	    framelen = FRAME_LEN_11;
		if(C2CHK)	//奇校验
		{
			parity = PARITY_ODD;
		}
		else
		{
			parity = PARITY_EVEN;
		}
	}
	else
	{
	    framelen = FRAME_LEN_10;
	}
	SoftCountNum[1] = baudrate;	//cdy, ((10bit*1000ms)/baudrate)*length*timer0
	SetComXBaudrate(1, baudrate);
	SetComXConfig(1,PARITY_NONE, FRAME_LEN_10 );
	Delay(10);
//	Back = ReadComXConfig(1); 
//	TestSent(Back);	//test
//config com3
	temp1=C3BAUD1;
	temp2=C3BAUD0;
	tmp=(temp1<<1) | temp2;
	switch(tmp)
	{
		case 0x00: baudrate = BAUDRATE_300; break;
		case 0X01: baudrate = BAUDRATE_600; break;
		case 0X02: baudrate = BAUDRATE_1200;break;
		default: baudrate = BAUDRATE_1200;break;
	}

	if(C3CHK_EXIT)
	{
 	    framelen = FRAME_LEN_11;
		if(C3CHK)	//奇校验
		{
			parity = PARITY_ODD;
		}
		else
		{
			parity = PARITY_EVEN;
		}
	}
	else
	{
	    framelen = FRAME_LEN_10;
	}
	SoftCountNum[2] = baudrate;	//cdy, ((10bit*1000ms)/baudrate)*length*timer0
	SetComXBaudrate(2, baudrate);
	SetComXConfig(2,PARITY_NONE, FRAME_LEN_10);
	Delay(10);
//	Back = ReadComXConfig(2); 
//	TestSent(Back);	//test
//config com4
	temp1=C4BAUD1;
	temp2=C4BAUD0;
	tmp=(temp1<<1) | temp2;
	switch(tmp)
	{
		case 0x00: baudrate = BAUDRATE_300; break;
		case 0X01: baudrate = BAUDRATE_600; break;
		case 0X02: baudrate = BAUDRATE_1200;break;
		default: baudrate = BAUDRATE_1200;break;
	}
	
	if(C4CHK_EXIT)
	{
 	    framelen = FRAME_LEN_11;
		if(C4CHK)	//奇校验
		{
			parity = PARITY_ODD;
		}
		else
		{
			parity = PARITY_EVEN;
		}
	}
	else
	{
	    framelen = FRAME_LEN_10;
	}
	SoftCountNum[3] = baudrate;	//cdy, ((10bit*1000ms)/baudrate)*length*timer0
	SetComXBaudrate(3, baudrate);
	SetComXConfig(3,PARITY_NONE, FRAME_LEN_10 );
	Delay(10);
//	Back = ReadComXConfig(3); 
//	TestSent(Back);	//test

	// do other inital work for VK3224
	config_vk32();
}		



/***********************************************************
 Function:vk3224 interrupt,	
 Describe:	
 Input:		
 Output:	
***********************************************************/
void VK3224_IRQ() interrupt 0
{
	//receive data to buffer.

	
}
//***********************************************************

/***********************************************************
 Function:	HandleComXTask
 Describe:	处理子串口的任务,如果是接收fifo触点中断,表示收到数据,读取数据
 			放入缓冲区,如果是发送fifo中断,置相应标志,通知主程序可以往相应子串口写数据。
 Input:		void
 Output:	       TFIFO state data
***********************************************************/
#if 0
uchar HandleComXTask(uchar port)
{
	uchar ucTemp,i;
	ucTemp  =  GetComXStatus(port);
	//如果收到数据,and  buff is empty ,把数据放入缓冲区。
	
	if( (ucTemp&RFINT_MASK) &&(RevDataCount[i] ==0 ))
	{
		for(i = 0; i < LEN_COM; i++)
		{
			SRevBuff[port][i] = ReadDataFromFIFO(port);
//			TestSent(SRevBuff[port][i]);
			RevDataCount[port]++;
		}
		return 1;
	}
	

	return 0;
}
#endif
/***********************************************************
 Function:	HandleComXTask
 Describe:	put data to master com send buff, it is rounting pool
 Input:		void
 Output:	       TFIFO state data
***********************************************************/
#if CPU_DO_AS_TX
uchar  PutDataToMComBuff(uchar port,uchar * pdsr, uchar length)
{
	if(length >0)
	{
		MSendBuff[s_ucMSendBuffTop++] = FrameHead1;
		s_ucMSendBuffTop %= SEND_BUFF_LEN;
		MSendBuff[s_ucMSendBuffTop++] = FrameHead2;
		s_ucMSendBuffTop %= SEND_BUFF_LEN;
		MSendBuff[s_ucMSendBuffTop++] = (port <<4) + length;		// com no is high 4 bit, length is low 4 bit.
		s_ucMSendBuffTop %= SEND_BUFF_LEN;
	
		while(length--)
		{
			MSendBuff[s_ucMSendBuffTop++] = *pdsr++;
			s_ucMSendBuffTop %= SEND_BUFF_LEN;
		}
	}
	return 1;	
}
#endif
//***********************************************************





⌨️ 快捷键说明

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