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

📄 serial_line_tty.c

📁 STM3240G-Eval_uCOS-III
💻 C
📖 第 1 页 / 共 2 页
字号:
*
* Argument(s) : pdev        Pointer to device.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Serial line driver              opened.
*                               SERIAL_ERR_LINE_OPEN            Serial line driver could NOT be opened.
*
* Return(s)   : Pointer to line driver data structure.
*
* Caller(s)   : Serial_Open().
*
* Note(s)     : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/

static  void  *SerialLine_Open (SERIAL_DEV  *pdev,
                                SERIAL_ERR  *perr)
{
    SERIAL_LINE_INFO  *pinfo;
    CPU_SIZE_T         octets_reqd;
    LIB_ERR            lib_err;


   (void)&pdev;

    pinfo = SerialLine_TTY_Info;
    if (pinfo == (SERIAL_LINE_INFO *)0) {                       /* Find avail TTY info struct.                          */
        pinfo  = (SERIAL_LINE_INFO *)Mem_HeapAlloc((CPU_SIZE_T  ) sizeof(SERIAL_LINE_INFO),
                                                   (CPU_SIZE_T  ) sizeof(CPU_ALIGN),
                                                   (CPU_SIZE_T *)&octets_reqd,
                                                   (LIB_ERR    *)&lib_err);
        if (pinfo == (SERIAL_LINE_INFO *)0) {
           *perr = SERIAL_ERR_LINE_DRV_OPEN;
            return ((void *)0);
        }
    } else {
        SerialLine_TTY_Info = pinfo->NextPtr;
    }

    pinfo->NextPtr = (SERIAL_LINE_INFO *)0;
    pinfo->TxState =  SERIAL_LINE_TTY_TX_STATE_NORMAL;
    pinfo->EchoRx  =  DEF_ENABLED;
    pinfo->EchoTx  =  DEF_DISABLED;

   *perr = SERIAL_ERR_NONE;

    return ((void *)pinfo);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                         SerialLine_Close()
*
* Description : Close serial line driver.
*
* Argument(s) : pdev        Pointer to device.
*
*               pline_data  Pointer to line driver data structure.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Serial line driver closed.
*
* Return(s)   : None.
*
* Caller(s)   : Serial_Close().
*
* Note(s)     : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/

static  void  SerialLine_Close (SERIAL_DEV  *pdev,
                                void        *pline_data,
                                SERIAL_ERR  *perr)
{
    SERIAL_LINE_INFO  *pinfo;


   (void)&pdev;

    pinfo = (SERIAL_LINE_INFO *)pline_data;

    pinfo->TxState = SERIAL_LINE_TTY_TX_STATE_NORMAL;
    pinfo->EchoRx  = DEF_DISABLED;
    pinfo->EchoTx  = DEF_DISABLED;

    pinfo->NextPtr      = SerialLine_TTY_Info;
    SerialLine_TTY_Info = pinfo;

   *perr = SERIAL_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                        SerialLine_RdOctet()
*
* Description : Get next octet to transmit.
*
* Argument(s) : pdev        Pointer to device.
*
*               pbuf        Pointer to buffer.
*
*               pdatum      Pointer to variable that will receive data octet.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Octet supplied.
*                               SERIAL_ERR_UNDERFLOW            Buffer underflow.
*
* Return(s)   : None.
*
* Caller(s)   : Serial_IF_Tx().
*
* Note(s)     : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/

static  void  SerialLine_RdOctet (SERIAL_DEV  *pdev,
                                  SERIAL_BUF  *pbuf,
                                  CPU_INT08U  *pdatum,
                                  SERIAL_ERR  *perr)
{
    SERIAL_LINE_INFO  *pinfo;
    CPU_BOOLEAN        rd;


    pinfo = (SERIAL_LINE_INFO *)pdev->LineDrv_Data;
    switch (pinfo->TxState) {
        case SERIAL_LINE_TTY_TX_STATE_CR:                       /* ---------------- TX CARRIAGE RETURN ---------------- */
             pinfo->TxState = SERIAL_LINE_TTY_TX_STATE_NORMAL;
            *pdatum         = ASCII_CHAR_CARRIAGE_RETURN;
            *perr           = SERIAL_ERR_NONE;
             return;


        case SERIAL_LINE_TTY_TX_STATE_NORMAL:                   /* --------------------- TX OCTETS -------------------- */
             rd = SerialBuf_RdOctet(pbuf, pdatum);
             if (rd == DEF_NO) {
                *perr = SERIAL_ERR_UNDERFLOW;
                 return;
             }
             if (*pdatum == ASCII_CHAR_LINE_FEED) {
                 pinfo->TxState = SERIAL_LINE_TTY_TX_STATE_CR;
             }
             break;
    }

#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)                       /* Echo data.                                           */
    pinfo = (SERIAL_LINE_INFO *)pdev->LineDrv_Data;
    if (pinfo->EchoTx == DEF_ENABLED) {
        SerialIF_Rx(pdev, *pdatum);
    }
#endif

   *perr = SERIAL_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                        SerialLine_WrOctet()
*
* Description : Handle octet received from serial port.
*
* Argument(s) : pdev        Pointer to device.
*
*               pbuf        Pointer to buffer.
*
*               datum       Data octet to write.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Octet handled.
*                               SERIAL_ERR_OVERFLOW             Buffer overflow.
*                               SERIAL_ERR_LINE_END             End of line detected.
*
* Return(s)   : None.
*
* Caller(s)   : Serial_IF_Rx().
*
* Note(s)     : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/

static  void  SerialLine_WrOctet (SERIAL_DEV  *pdev,
                                  SERIAL_BUF  *pbuf,
                                  CPU_INT08U   datum,
                                  SERIAL_ERR  *perr)
{
#if (SERIAL_CFG_WR_BUF_EN == DEF_ENABLED)
    SERIAL_LINE_INFO  *pinfo;
#endif
    CPU_BOOLEAN        wr;


   (void)&pdev;

    if ((datum == ASCII_CHAR_LINE_FEED) ||
        (datum == ASCII_CHAR_CARRIAGE_RETURN)) {
        wr = SerialBuf_WrOctet(pbuf, ASCII_CHAR_NULL);
       *perr = SERIAL_ERR_LINE_END;
        return;
    }

    wr = SerialBuf_WrOctet(pbuf, datum);
    if (wr == DEF_NO) {
       *perr = SERIAL_ERR_OVERFLOW;
        return;
    }

#if (SERIAL_CFG_WR_BUF_EN == DEF_ENABLED)                       /* Echo data.                                           */
    pinfo = (SERIAL_LINE_INFO *)pdev->LineDrv_Data;
    if (pinfo->EchoRx == DEF_ENABLED) {
        SerialIF_TxWrBuf(pdev, datum);
    }
#endif

   *perr = SERIAL_ERR_NONE;
}

⌨️ 快捷键说明

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