📄 uart.c
字号:
__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 + -