?? uart.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 + -