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

📄 doubleuart.c

📁 在应用PHILIPS的低档ARM的开发程序采集数据
💻 C
字号:
#include "config.h"
#include <stdio.h>
#define  BufferSize  1024
//#define  RecvBuf[16];
#define	 UART_BPS	 9600	// 通讯波特率115200

unsigned char  Buffer1[BufferSize]; 
unsigned char  Buffer2[BufferSize];

unsigned char *buffer1Start, *buffer1End;
unsigned char *buffer1head, *buffer1tail;

unsigned char *buffer2Start, *buffer2End;
unsigned char *buffer2head, *buffer2tail;

char OverFlowFlag1;
char ReceiveByteFlag1;

char OverFlowFlag2;
char ReceiveByteFlag2;

uint8  stanum, endnum;

char text[]="STWSTW";
char textend[]="QUIQUI";

void BufferInit(void);
void UART_Init (void);
void UART0_SendByte (uint8 data);
void UART0_SendStr (char *str);
void UART1_SendByte (uint8 data);
void UART1_SendStr (char *str);   
unsigned char AddByteToBuffer1(unsigned char *p);
unsigned char* RemoveByteFromBuffer1();  
unsigned char AddByteToBuffer2(unsigned char *p);
unsigned char* RemoveByteFromBuffer2(); 

void BufferInit(void)
{
	buffer1Start = &Buffer1[0];
	buffer1End = &Buffer1[BufferSize-1];
	buffer1head = buffer1tail = buffer1Start;

	buffer2Start = &Buffer2[0];
	buffer2End = &Buffer2[BufferSize-1];
	buffer2head = buffer2tail = buffer2Start;
}

void __irq IRQ_UART0(void)                    //串口0接收中断
{  
  unsigned char  *ch;
  if((U0IIR&0x0f)==0x04)
  {
   *ch=U0RBR;
   AddByteToBuffer1(ch);
   ReceiveByteFlag1 =1;
  }
 
  VICVectAddr = 0x00;    
}


void __irq IRQ_UART1(void)               //串口1接收中断
{
  unsigned char  *ch;
  
  if((U1IIR&0x0f)==0x04)
  { 
   *ch=U1RBR;
   if(ReceiveByteFlag2==0)
   {
   if(*ch==text[stanum])
       stanum++;
    if(stanum==5)
   {
    stanum=0;
    ReceiveByteFlag2 =1;
   }
   }
   AddByteToBuffer2(ch);
   if(*ch==textend[endnum])  //判断接收完成
     endnum++;   
   if(endnum>=5)
   {
     endnum=0;
     ReceiveByteFlag2 =0;
   }
  }
  
  VICVectAddr = 0x00; 
}


void UART_Init (void)
{
	uint16 Fdiv;
	
	PINSEL0 = (PINSEL0 & (~0x0F)) | 0x05|(0x05<<16);	// 设置I/O连接到UART
	
	U0LCR = 0x83;						// DLAB=1,允许设置波特率
	U1LCR = 0x83;
	
	Fdiv  = (Fpclk / 16) / UART_BPS;	// 设置U0波特率
	U0DLM = Fdiv / 256;
	U0DLL = Fdiv % 256;
	U0LCR = 0x03;
	
	Fdiv  = (Fpclk / 16) / UART_BPS;	// 设置U1波特率
	U1DLM = Fdiv / 256;
	U1DLL = Fdiv % 256;
	U1LCR = 0x03;
			
	/* 使能UART0中断 */
	VICIntSelect = 0x00000000;			// 设置所有的通道为IRQ中断
	VICVectCntl0 = 0x20 | 0x06;		// UART0分配到IRQ slot0,即最高优先级
	VICVectAddr0 = (uint32)IRQ_UART0;	// 设置UART0向量地址
	VICIntEnable = 1 << 0x06;			// 使能UART0中断

	/* 使能UART1中断 */
	
     VICVectCntl1= 0x20 | 0x07;		        // UART0分配到IRQ slot0,即最高优先级
     VICVectAddr1 = (uint32)IRQ_UART1;	// 设置UART1向量地址
     VICIntEnable = 1 << 0x07;			// 使能UART1中断
}

void UART0_SendByte (uint8 data)          //串口0发送数据
{
	U0THR = data;
	
	while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
}

void UART0_SendStr (char *str)          //串口0发送字符串
{
	while (1)
	{
		if (*str == '\0')	break;		// 遇到结束符,退出
		UART0_SendByte(*str++);			// 发送数据
	}
}

void UART1_SendByte (uint8 data)          //串口1发送数据
{
	U1THR = data;
	
	while ((U1LSR & 0x20) == 0);	// 等待数据发送完毕
}

void UART1_SendStr (char *str)          //串口1发送字符串
{
	while (1)
	{
		if (*str == '\0')	break;		// 遇到结束符,退出
		UART1_SendByte(*str++);			// 发送数据
	}
}

unsigned char AddByteToBuffer1(unsigned char *p)     //串口0接收
{
	*buffer1tail = *p;
	buffer1tail++;
	if(buffer1tail>buffer1End)			//尾指针超出长度归0
		buffer1tail = buffer1Start;
	if(buffer1tail == buffer1head)		//尾指针追上头指针,置溢出标志
		OverFlowFlag1 = 1;

	return 0;
}

unsigned char* RemoveByteFromBuffer1()        //串口1发送
{
	unsigned char* p = buffer1head;
	if(buffer1head == buffer1tail)
		return 0;
	buffer1head++;
	if(buffer1head>buffer1End)			//尾指针超出长度归0
		buffer1head = buffer1Start;
	return p;
}

unsigned char AddByteToBuffer2(unsigned char *p)    //串口1接收
{
	*buffer2tail = *p;
	buffer2tail++;
	if(buffer2tail>buffer2End)			//尾指针超出长度归0
		buffer2tail = buffer2Start;
	if(buffer2tail == buffer2head)		//尾指针追上头指针,置溢出标志
		OverFlowFlag2 = 1;

	return 0;
}

unsigned char* RemoveByteFromBuffer2()       //串口0发送
{
	unsigned char* p = buffer2head;
	if(buffer2head == buffer2tail)
		return 0;
	buffer2head++;
	if(buffer2head>buffer2End)			//尾指针超出长度归0
		buffer2head = buffer2Start;
	return p;
}

int main(void)
{
     unsigned char *ch;
   
	BufferInit();                 //缓冲区初始化
         
	IRQEnable();               //使能IRQ中断
	UART_Init ();			//系统初始化
	U0IER = 0x01;            //允许串口0接收中断
	U1IER = 0x01;           //允许串口1接收中断
	ReceiveByteFlag1=0;
	ReceiveByteFlag2=0;

    while(1)
	{
		if(ReceiveByteFlag1)
		{
			if(ReceiveByteFlag1==1)
			{     
		
            //SendOpenKey();
			      UART1_SendStr (text);
			    while(ch = RemoveByteFromBuffer1())
 		         {
				    UART1_SendByte(*ch);
			      }
			      UART1_SendStr (textend);
			      ReceiveByteFlag1=0;
		 
			     if(OverFlowFlag1 ==1)
			     {
			       buffer1head = buffer1tail = buffer1Start;
			       OverFlowFlag1 =0;
			     }
			}
			

			if(ReceiveByteFlag1>2)        //判断条件是什么
			{	
				ReceiveByteFlag1=0;
				//SendCloseKey();
			}
		}

		if(ReceiveByteFlag2)
		{
			
			while(ch = RemoveByteFromBuffer2())
			{
				UART0_SendByte(*ch);
			}
			if(OverFlowFlag2 ==1)
			{
       buffer2head = buffer2tail = buffer2Start;
			 OverFlowFlag2 =0;
			}
			ReceiveByteFlag2 = 0;
			
		}
	}
   return 0;
}


⌨️ 快捷键说明

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