搜索
 找回密码
 立即注册

简单一步 , 微信登陆

UART的接口说明和应用

作者:halleyhuang | 时间:2016-7-20 11:51:23 | 阅读:4244| 显示全部楼层
一,常用API介绍
drvUART.h已有注释的略去。
void MDrv_UART_Init(UART_DEVICE_TYPEuart_dev, MS_U32 baudrate);
mdrv_uart_open一个defaultuart port——_hDefaultUart,并设置它的波特率。
void MDrv_UART_PutChar(MS_U8 u8Ch);
会向hDefaultUart输出一个字符。
void MDrv_UART_PutString(char *u8str);
会向hDefaultUart输出字符串。
MS_U8 MDrv_UART_GetChar(void);
会从hDefaultUart读取一个字符。
void MDrv_UART_GetFile(MS_U8 *pu8Buf,MS_U32 u32Len);
会从hDefaultUart读取u32Len长度的字符。
c**t UART_DrvInfo*MDrv_UART_GetInfo(void);
获取串口的初始化状态。
UART_Result MDrv_UART_GetStatus(UART_DrvStatus*pStatus);
获取串口的使用状态。
void MDrv_UART_SetDbgLevel(MS_U8 level);
typedef enum _UART_DbgLv
{
   E_UART_DBGLV_NONE           //nodebug message
   ,E_UART_DBGLV_ERR_ONLY      //showerror only
   ,E_UART_DBGLV_INFO          //showerror & informaiton
    ,E_UART_DBGLV_ALL           //show error, information &funciton name
}UART_DbgLv;
输出相应等级的打印信息。
以下函数如果编辑器sync不到这个函数,请自行在drvUART.h中补上,底层已有实现。
UART_Result MDrv_UART_SetRxMode(MS_BOOLbEnable, void *rx_buf, MS_U16 buf_len, ms_uart_rx_callback rx_cb)
bEnableRx是否有效;
rx_buf:设置Rx的缓存;
buf_len:缓存的大小;
rx_cb:设置Rxcallback,但为NULL时,设置的rx_buf无效,一般此处设个空函数,
static void _rx_callback(int c)
{
   //do not remove this function
}

二,常见问题
1.APP的串口的初始化会在操作系统启动时调用,不需要重复调用。
2.串口的默认缓存只有16byte,一次发送数据超过16byte会接受不全,需要设置Rx的缓存,
使用MDrv_UART_SetRxMode
3.mdrv_uart_readMDrv_UART_GetCharMDrv_UART_GetFile都是阻塞性函数,因此建议新建一个task去做。
4.如果担心代码的打印信息影响串口通信,如果实在mboot下通信,请在mboot下在c**ole.c208行修改#if 1//defined(CONFIG_JANUS) || defined(CONFIG_MARIA10) ,然后把宏里面的printf置空,在Stdio.h下把Printf的声明干掉。在HDMI初始化前设定MDrv_HDMITx_SetDbgLevel0)这样以来就应该只剩GE_SetOnePixel这句了,这个可能需要改lib,不建议修改。如果是AP下通信,可在sysinit.c下把cyg_uart_putchar置空,然后在language_c_libc_stdio_printf.c里把printfUSBLOG_ENABLE这个宏里拿出来并置为空函数。
5.如果需要清空缓存里的数据,可以用mdrv_uart_readMDrv_UART_GetCharMDrv_UART_GetFile把缓存的数据取走即可。


三,示范代码
extern MS_S32 gs32CachedPoolID;
extern MS_S32 gs32NonCachedPoolID;
#define UART_TASK_STACK         (4096 * 2)
static MS_U32       _u32UARTDbgLevel    = LDR_UART_DBG_ERR;
static MS_S32       _s32uartTaskID      = -1;
static MS_U8        _uart_initd         = 0;
static MS_U8*       _uartbuf            = NULL;
static MS_U32       _u32offset          = 0;
static MS_BOOL      _bstarted           = 0;
static void _uartTaskEntry(void)
{
   while (1)
    {
       if (_bstarted)
       {
           //mdrv_uart_read(_uart_hl,_uartbuf + _u32offset, 1);
                     _uartbuf[_u32offset]= MDrv_UART_GetChar();
           _u32offset++;
           //MsOS_DelayTask(1); don't delay !!!!
       }
       else
       {
           MsOS_DelayTask(10);
       }
    }
}
static void _uartCreateTask(void)
{
   void *puartTaskStack = NULL;
   // create filt task
   puartTaskStack = MsOS_AllocateMemory(UART_TASK_STACK, gs32CachedPoolID);
   UART_ASSERT(puartTaskStack > 0);
   _s32uartTaskID = MsOS_CreateTask((TaskEntry)_uartTaskEntry,
                                    (MS_U32)NULL,
                                    E_TASK_PRI_HIGH,
                                     TRUE,
                                    puartTaskStack,
                                     UART_TASK_STACK,
                                    (char*)"uart Task");
   UART_ASSERT(_s32uartTaskID >= 0);
}
static void _rx_callback(int c)
{
   //do not remove this function
}
L_INT32 Ldr_Uart_Init(L_VOID)
{
   if (_uart_initd == 1)
    {
       return 0;
    }
   MDrv_UART_Init(E_UART_PIU_UART0, 115200);
   MDrv_UART_SetRxMode(TRUE, MsOS_AllocateMemory(40 * 1024,gs32NonCachedPoolID), 40 * 1024, _rx_callback);
   //_uart_hl = mdrv_uart_open(E_UART_PIU_UART0);
   if (NULL == _uartbuf)
    {
       _uartbuf = (MS_U8 *)MsOS_AllocateMemory(40 * 1024, gs32NonCachedPoolID);
       memset(_uartbuf, 0, 40 * 1024);
       UART_ASSERT(_uartbuf > 0);
    }
   _uartCreateTask();
   _uart_initd = 1;
   return 0;
}
L_INT32  Ldr_Uart_Read(L_UINT8*pReadBuffer, L_UINT32 *pLength, L_UINT32 uDelayTime)
{
   UART_DBGMSG(LDR_UART_DBG_INFO, printf("%s\n", __FUNCTION__));
   UART_ASSERT(pReadBuffer);
   UART_ASSERT(pLength);
   UART_ASSERT(_uart_initd);
   MS_U32 u32CurrentTime = MsOS_GetSystemTime();
   _u32offset  = 0;
   _bstarted   = 1;
   while (MsOS_GetSystemTime() - u32CurrentTime < uDelayTime)
    {
       if (_u32offset == *pLength)
       {
           break;
       }
       else
       {
           MsOS_DelayTask(5);
       }
    }
   if (_u32offset > 0)
    {
       memcpy(pReadBuffer, _uartbuf, _u32offset);
       _u32offset = 0;
       _bstarted  = 0;
       *pLength   = _u32offset;
       return 0;
    }
   return -1;
}
L_INT32  Ldr_Uart_Write(L_UINT8*pWriteBuffer, L_UINT32 *pLength, L_UINT32 uDelayTime)
{
   UART_ASSERT(pWriteBuffer);
   UART_ASSERT(pLength);
           intilen = 0;
   while (ilen < *pLength)
           {
       MDrv_UART_PutChar(pWriteBuffer[ilen]);
       ilen++;
    }
    return0;
}


该会员没有填写今日想说内容.
回复

使用道具 举报

大神点评2

bean.yang 发表于:2016-7-22 09:10:20
基本协议,非常详细说明了串口机制
回复 支持 反对

使用道具 举报

liugewill 发表于:2017-3-17 09:37:26
好东西,感谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
手机版