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

📄 uart.c

📁 ucos-II+移植到arm+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 "../ucos-ii/uhal/isr.h"
#include "uart.h"

extern struct_Uart_Buffer Uart_Buffer[];
extern serial_driver_t* serial_drv[];
extern int NumberOfUartDrv;

void irq_OSRevUart(int vector, int ndev)
{
	int nrev;
	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);
}

/*************************
	读串口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 + -