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

📄 uart.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
                                                                           
        __GpuiUartInfoTab[uiId]->PdqReviceBuf = (DataQueue *)GpuiUartReviceTab[uiId];   
                                                                        /*  记录接收缓存                */
                                                                        
        __GpuiUartInfoTab[uiId]->PdqSendBuf = (DataQueue *)GpuiUartSendTab[uiId];		
                                                                        /*  记录发送缓存                */
                                                                        
        __GpuiUartInfoTab[uiId]->uiUartId =  uiId;                      /*  记录下自己的ID号            */
                                                                      
        ImpCmd(Tab_UART, pcArg, uiParaData);                            /*  从字符串中提取参数          */           
		 
        if (__uartInit(__GpuiUartInfoTab[uiId], uiParaData, 
            __GuiQueueReviceFifoTab[uiId], __GuiQueueSendFifoTab[uiId]) == OPERATE_FAIL) {
            
            return(OPERATE_FAIL);
        }
        else {
            return(OPERATE_SUCCESS);
        }                                                                                                                               
    }
    else {
        return(OPERATE_FAIL);
    } 

}

/*********************************************************************************************************
** Function name:           uartSetMode
** Descriptions:            设置串口的参数
** input parameters:        uiId      : 子设备号
**                          uiCmd     :设置参数宏:CTMODE--串口模式;BAUDRATE--串口波特率
**                          pcArg     :字符串指针
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
** Example1:                char pUartBps[] = "BaudRate=9600";
**                          WdtSetMode( 0, BAUDRATE, pUartBps);  
** Example2:                char pUart[]="DataBits=8 StopBits=1 Parity=NONE RtsControl=NONE";
**                          WdtSetMode( 0, CTMODE, pUart);  
********************************************************************************************************/
#define BAUDRATE    0   
#define CTMODE      1
extern int32 uartSetMode (uint32 uiId,
                          uint32 uiCmd,
                          char *pcArg)
{
    uint32 uiParaData[MAX_UART_STR_NUM] = {0};                          /*  定义一个数组存放字符串的参数*/
	
    if ((uiId < __UART_MAX_NUM) && (strlen(pcArg) < 80)) {
        
		ImpCmd(Tab_UART, pcArg, uiParaData);                            /*  从字符串中提取参数          */ 
		switch(uiCmd){

		case BAUDRATE:
			return(__uartBandRate(__GpuiUartInfoTab[uiId], uiParaData[BaudRate])); 
	        break;	
	    			
		case CTMODE:
			return(__uartMode(__GpuiUartInfoTab[uiId], uiParaData));					
            break;   
		default:
			break;	
		}
    }		
	return OPERATE_FAIL;     
}
/*********************************************************************************************************
** Function name:			__uartGetState
** Descriptions:			从底层串口寄存器获取当前串口的参数
** input parameters:		uiId:               子设备号
**							uiParaData:         字符串指针
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
********************************************************************************************************/
int32 __uartGetState (uint32 uiId, uint32 *uiParaData)
{
    volatile uint32 *puiAddrBase;
	volatile uint32  uiOffBase;

	uint32 uiBak = 0;
	
	puiAddrBase = __GpuiUartInfoTab[uiId]->puiAddrBase;
	uiOffBase   = __GpuiUartInfoTab[uiId]->uiOffBase;
	
	uiBak = puiAddrBase[__B_UART_LCR << uiOffBase];
	puiAddrBase[__B_UART_LCR << uiOffBase] |= 0x80;                     /*  允许访问分频因子寄存器      */
		  
	uiParaData[BaudRate] = ((Fpclk / (puiAddrBase[__B_UART_DLL << uiOffBase] | 
	                        (puiAddrBase[__B_UART_DLM << uiOffBase] << 8)) / 16));
	uiParaData[DataBits] = (uiBak & 0x03) + 5;
	uiParaData[StopBits] = ((uiBak >> 2) & 0x01) + 1;
	if (((uiBak >> 3) & 0x01) == 0)
	    uiParaData[Parity] = 0;
	else
	{
	    uiParaData[Parity] = (((uiBak >> 4) & 0x03) + 1);   
	}
	
	puiAddrBase[__B_UART_LCR << uiOffBase] &= 0x7F;                     /*  禁止访问分频因子寄存器      */
	
	return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name:           uartGetState
** Descriptions:            获取当前串口的参数
** input parameters:        uiId:               子设备号
**                          pcArg:              字符串指针
** Output parameters:       pcArg:              输出字符串参数
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
********************************************************************************************************/
extern int32 uartGetState (uint32 uiId, char * pcArg)
{
    uint32 uiParaData[MAX_UART_STR_NUM]={0};                           /*  定义一个数组存放字符串的参数*/
	if(uiId < __UART_MAX_NUM) {
	    __uartGetState(uiId, uiParaData);
	    ExpCmd(Tab_UART, pcArg, uiParaData);
	}
	else
		return OPERATE_FAIL;
	return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name:			_uartQueueStatus
** Descriptions:			获取Queue队列的状态
** input parameters:		PUartInfo      : 指向uart信息结构体的指针
**                          uiWhichFifo	  : 1-发送队列;0-接收队列
** Returned value:			发送队列中可操作的空间大小,或接收队列中可用数据个数
********************************************************************************************************/
static int32 _uartQueueStatus (__PUART_INFO PUartInfo, uint32 uiWhichFifo)
{
	if ((uiWhichFifo == TX_FIFO) && ((PUartInfo->uiUartFlag) < 0x80))
	{
		return (PUartInfo->PdqSendBuf->MaxData - PUartInfo->PdqSendBuf->NData);
	}
	if (uiWhichFifo == RX_FIFO)
	{
		return (PUartInfo->PdqReviceBuf->NData);
	}
	return 0;
}

/*********************************************************************************************************
** Function name:           uartFifoStatus
** Descriptions:            获取Queue队列的状态
** input parameters:        uiId:           子设备号
**                          uiWhichFifo:    TX_FIFO-发送队列;RX_FIFO-接收队列
** Returned value:          发送队列中可操作的空间大小,或接收队列中可用数据个数
********************************************************************************************************/
extern int32 uartFifoStatus (uint32 uiId, uint32 uiWhichFifo)
{
	if (uiId < __UART_MAX_NUM)
		return _uartQueueStatus(__GpuiUartInfoTab[uiId], uiWhichFifo);
	else
		return 0;
}

/*******************************************************************************************************
** Function name:           uartFifoFlush
** Descriptions:            清空接收或发送Queue队列
** input parameters:        uiId:        UART子设备号
**                          uiWhichFifo: TX_FIFO-发送队列;RX_FIFO-接收队列
** Output parameters:       NONE
** Returned value:			OPERATE_SUCCESS:    操作成功
**                          OPERATE_FAIL:       操作失败
*******************************************************************************************************/
extern int32 uartFifoFlush (uint32 uiId, uint32 uiWhichFifo)
{
     if (uiId >__UART_MAX_NUM) {
        return OPERATE_FAIL;
     }
        else if (uiWhichFifo == RX_FIFO) {
            QueueFlush((void *)__GpuiUartInfoTab[uiId]->PdqReviceBuf);  /*  清空接收队列                */
        }
            else if (uiWhichFifo == TX_FIFO) {	 
                QueueFlush((void *)__GpuiUartInfoTab[uiId]->PdqSendBuf);/*  清空发送队列                */
            }
                else { 
                        return OPERATE_FAIL;
                }
     return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name:			__uartGetch
** Descriptions:			无等待接收一个字节
** input parameters:		PUartInfo      : 指向uart信息结构体的指针
**                          uiRet       : 存储接收到的数据
** Returned value:			UART_OK   : 成功
**                          UART_EMPTY: 无数据
********************************************************************************************************/
static uint32 __uartGetch (__PUART_INFO PUartInfo, uint8 *uiRet)
{
    uint32 uiErr;

    IRQDisable();                                                       /* 关中断                       */
    
    uiErr = QueueRead(uiRet, PUartInfo->PdqReviceBuf);
    
    IRQEnable();                                                        /* 开中断                       */
    return uiErr;
} 
/*********************************************************************************************************
** Function name:           uartRead
** Descriptions:            从串口设备读取数据
** input parameters:        uiId:        子设备号
**                          puiBuf:      保存返回数据的字符串指针地址
**                          uiNum:       读取的数据个数
**                          pRsv:        保留参数
** Output parameters:       puiBuf:      读到的数据首地址      
** Returned value:          实际读取的数据个数
********************************************************************************************************/
extern int32   uartRead (uint32 uiId,
                         uint8 *puiBuf,
                         uint32 uiNum,
                         void *pRsv)
{
	uint32 i;
	uint32 uiReviceNum = 0;	
	if (uiId < __UART_MAX_NUM) {
	
		IRQDisable();                                                   /*  关中断                      */
		
		for (i = 0; i < uiNum; i++) {			
			if(QUEUE_OK == ( __uartGetch(__GpuiUartInfoTab[uiId], puiBuf++))) {
				uiReviceNum ++;
			}
			else
				break;
		}
		
	    IRQEnable();                                                    /*  开中断                      */
	} 
	return uiReviceNum;	
}
/*********************************************************************************************************
** Function name:			__uartWrite
** Descriptions:			发送多个字节数据
** input parameters:		PUartInfo:      指向uart信息结构体的指针
**                          puiData:        要发送的数据的首地址
**                          uiNumByte:      发送数据的个数
** Output parameters:       NONE
** Returned value:			成功发送数据的个数
********************************************************************************************************/
static uint32 __uartWrite (__PUART_INFO PUartInfo, uint8 *puiData, uint32 uiNumByte)
{
    volatile uint32 *puiAddrBase;
	volatile uint32  uiOffBase;
	
    uint32 uiSendNumbyte;
    
    uint8 uiTemp;
    

⌨️ 快捷键说明

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