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

📄 uart.c

📁 s3c2410的源代码
💻 C
字号:
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.4.26
\***************************************************************************/
	

/***************************************************************************\
    #说明: 串口抽象层函数
	----------------------------------  Bug  --------------------------------------

	----------------------------------  TODO list  --------------------------------------

	----------------------------------修正--------------------------------------
	2004-5-26	创建

\***************************************************************************/

#include "../inc/macro.h"
//#include "../ucos-ii/includes.h"

#include "../uhal/isr.h"
#include "../inc/uart.h"
#include "../inc/Serial.h"
extern struct_Uart_Buffer Uart_Buffer[];
extern serial_driver_t* serial_drv[];
extern int NumberOfUartDrv;

extern char Uart_Getch(int whichUart);
extern int Uart_SendByte(int whichUart,int data);
extern int OpenUartRev(int ndev);

void irq_OSRevUart(int vector, int ndev)
{
	int nrev;
	char c;
	struct_Uart_Buffer *pUart_Buffer=&Uart_Buffer[ndev];

	if(ndev>=NumberOfUartDrv)
		return;
    
	while(serial_drv[ndev]->poll()){
		//Receive data
		*(pUart_Buffer->pUart_rev)=(U8)serial_drv[ndev]->read();
		pUart_Buffer->pUart_rev++;
		if(pUart_Buffer->pUart_rev==pUart_Buffer->Buffer+UART_REVBUFFER_SIZE)
			pUart_Buffer->pUart_rev=pUart_Buffer->Buffer;

		nrev=pUart_Buffer->pUart_rev-pUart_Buffer->pUart_read;
		if(nrev<0)//循环缓冲区调整
			nrev+=UART_REVBUFFER_SIZE;
	}

	if(nrev>=pUart_Buffer->nRev_Uart){
		//OSMboxPost(pUart_Buffer->Uart_Rev_mbox, (void*)nrev);
		//Uart_GetIntNum(0);//调用0串口改成调用此函数即可在超级终端打印字符
		c=Uart_Getch(0);
		Uart_SendByte(0,c);
	}	
}

void irq_Timer4(int vector, int ndev)
{
Uart_Printf(0,"\nenter timer interrupt\n");
}
/*************************
	读串口n的数据
	返回值,实际读取的数据
****************************/
int OSReadUart(int ndev, U8 data[], int num, int ntimeout)
{
	int i;
	//INT8U err;
	int nrev;
	struct_Uart_Buffer *pUart_Buffer=&Uart_Buffer[ndev];

	pUart_Buffer->nRev_Uart=num;	//设置Uart1接收数据数

	nrev=pUart_Buffer->pUart_rev-pUart_Buffer->pUart_read;
	if(nrev<0)//循环缓冲区调整
		nrev+=UART_REVBUFFER_SIZE;

	/*if(nrev<num){
		while((nrev=(int)OSMboxPend(pUart_Buffer->Uart_Rev_mbox, ntimeout,&err))<num){
			if(err==OS_TIMEOUT){
				num=nrev;
				break;
			}
		}
	}*/

	for(i=0;i<num;i++){
		data[i]=*(pUart_Buffer->pUart_read);
		pUart_Buffer->pUart_read++;
		if(pUart_Buffer->pUart_read==pUart_Buffer->Buffer+UART_REVBUFFER_SIZE)
			pUart_Buffer->pUart_read=pUart_Buffer->Buffer;
	}
	return nrev;
}

void OSInitUart(void)
{
	int i;

	for(i=0;i<NumberOfUartDrv;i++){
		Uart_Buffer[i].pUart_rev=Uart_Buffer[i].Buffer;	//Uart 接收缓冲区指针
		Uart_Buffer[i].pUart_read=Uart_Buffer[i].Buffer;	//Uart 读缓冲区指针
		Uart_Buffer[i].nRev_Uart=1;		//设定的Uart接收字符数
		OpenUartRev(i);
	}
}

/*************************
	开启串口n接收中断
****************************/
int OpenUartRev(int ndev)
{
//	struct_Uart_Buffer *pUart_Buffer=&Uart_Buffer[ndev];

	if(ndev>=NumberOfUartDrv)
		return FAIL;

//	if(pUart_Buffer->Uart_Rev_mbox==NULL)
//		pUart_Buffer->Uart_Rev_mbox=OSMboxCreate((void*)NULL);

	SetISR_Interrupt(serial_drv[ndev]->nIsr, (Interrupt_func_t)irq_OSRevUart, (void*)ndev);

	return OK;
}

⌨️ 快捷键说明

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