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

📄 serial.c

📁 STM3240G-Eval_uCOS-III
💻 C
📖 第 1 页 / 共 5 页
字号:

    rd_callback_arg = pif->RdCallbackArg;
    rd_callback_buf = pif->RdCallbackBuf;
    rd_callback     = pif->RdCallback;

    wr_callback_arg = pif->WrCallbackArg;
    wr_callback_buf = pif->WrCallbackBuf;
    wr_callback     = pif->WrCallback;

    Serial_IF_Clr(pif);                                         /* Clr IF.                                              */

#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)                       /* Clr rd buf.                                          */
    if (pif->RdBufEn == DEF_YES) {
        SerialBuf_Clr(&(pif->RdBuf));
    }
#endif
#if (SERIAL_CFG_WR_BUF_EN == DEF_ENABLED)                       /* Clr wr buf.                                          */
    if (pif->WrBufEn == DEF_YES) {
        SerialBuf_Clr(&(pif->WrBuf));
    }
#endif
    CPU_CRITICAL_EXIT();

    SerialOS_SemDel(pif->WrSem);
    pif->WrSem = (void *)0;

    SerialOS_SemDel(pif->RdSem);
    pif->RdSem = (void *)0;


    if (rd_callback != (SERIAL_CALLBACK_FNCT *)0) {
      (*rd_callback)((SERIAL_IF_NBR)pif->Nbr,                   /* Call rd callback fnct.                               */
                     (void        *)rd_callback_arg,
                     (void        *)rd_callback_buf,
                     (CPU_SIZE_T   )0,
                     (SERIAL_ERR   )SERIAL_ERR_IF_CLOSING);
    }


    if (wr_callback != (SERIAL_CALLBACK_FNCT *)0) {
      (*wr_callback)((SERIAL_IF_NBR)pif->Nbr,                   /* Call wr callback fnct.                               */
                     (void        *)wr_callback_arg,
                     (void        *)wr_callback_buf,
                     (CPU_SIZE_T   )0,
                     (SERIAL_ERR   )SERIAL_ERR_IF_CLOSING);
    }


#if (SERIAL_CFG_TX_DESC_NBR > 0)
    pif->TxBufListEnd = (SERIAL_BUF_DESC *)0;
    pbuf              =  pif->TxBufListStart;                   /* Inform any pending callback.                         */
    while (pbuf != (SERIAL_BUF_DESC *)0) {
        pbuf->Callback((SERIAL_IF_NBR)pif->Nbr,
                       (void        *)pbuf->CallbackArg,
                       (void        *)pbuf->CallbackBuf,
                       (CPU_SIZE_T   )0,
                       (SERIAL_ERR   )SERIAL_ERR_IF_CLOSING);

        pbuf_next          =  pbuf->NextPtr;
        pbuf_next->PrevPtr = (SERIAL_BUF_DESC *)0;

        Mem_PoolBlkFree(&pif->TxBufPool, pbuf, &lib_err);

        pbuf                = pbuf_next;
        pif->TxBufListStart = pbuf;
    }
#endif


    CPU_CRITICAL_ENTER();
    pif->State = SERIAL_STATE_CLOSED;
    CPU_CRITICAL_EXIT();

   *perr = SERIAL_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                             Serial_Rd()
*
* Description : Read synchronously from a serial interface with an optional time-out interval.
*
* Argument(s) : if_nbr      Interface number.
*
*               pdest       Pointer to destination buffer.
*
*               len         Number of octets to read.
*
*               timeout_ms  Optional timeout period in milliseconds. If specified 0, wait indefinitely.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Device successfully read.
*                               SERIAL_ERR_SIGNAL               OS semaphore could NOT be created.
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
*                                                               --- RETURNED BY Serial_RdHandler() : ---
*                               SERIAL_ERR_NULL_PTR             NULL pointer passed for argument 'pdest'.
*
*                                                               ----- RETURNED BY Serial_RdEnd() : -----
*                               SERIAL_ERR_TIMEOUT              Operation timed-out.
*                               SERIAL_ERR_FAIL                 Device read failed.
*
* Return(s)   : Number of octets read.
*
* Caller(s)   : Application.
*
* Note(s)     : (1) Only ONE task/context can read from the same serial interface at a time.  If the receiver
*                   is busy when this function is called, an error will be returned.
*********************************************************************************************************
*/

CPU_SIZE_T  Serial_Rd (SERIAL_IF_NBR   if_nbr,
                       void           *pdest,
                       CPU_SIZE_T      len,
                       CPU_INT32U      timeout_ms,
                       SERIAL_ERR     *perr)
{
    SERIAL_IF             *pif;
    SERIAL_CALLBACK_INFO   rd_info;
    CPU_SIZE_T             len_rd;
    void                  *psignal;
#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
    CPU_BOOLEAN            valid;
#endif


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* ------------------- VALIDATE ARGS ------------------ */
    valid = Serial_IF_IsValid(if_nbr, perr);
    if (valid != DEF_YES) {                                     /* Rtn err if IF not valid.                             */
        return ((CPU_SIZE_T)0);
    }
#endif

    if (len == (CPU_SIZE_T)0) {                                 /* Chk for zero len.                                    */
       *perr = SERIAL_ERR_NONE;
        return ((CPU_SIZE_T)0);
    }

    psignal = SerialOS_SemCreate((CPU_INT16U)0);
    if (psignal == (void *)0) {
        *perr  = SERIAL_ERR_SIGNAL;
         return ((CPU_SIZE_T)0);
    }
    rd_info.SignalPtr = (void     *)psignal;
    rd_info.Timeout   = (CPU_INT32U)timeout_ms;
    rd_info.Len       = (CPU_SIZE_T)0;
    rd_info.Err       = (SERIAL_ERR)SERIAL_ERR_NONE;

    pif = &Serial_IF_Tbl[if_nbr];

    Serial_RdHandler((SERIAL_IF            *) pif,
                     (void                 *) pdest,
                     (CPU_SIZE_T            ) len,
                     (SERIAL_CALLBACK_FNCT *)&Serial_RdCallback,
                     (void                 *)&rd_info,
                     (CPU_BOOLEAN           ) DEF_NO,
                     (CPU_INT32U            ) timeout_ms,
                     (SERIAL_ERR           *) perr);

    if (*perr == SERIAL_ERR_NONE) {
        len_rd = Serial_RdEnd(pif, &rd_info, perr);             /* Wait for rd end.                                     */
    } else {
        len_rd = 0;
    }

    SerialOS_SemDel(psignal);
    return (len_rd);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                          Serial_RdAsync()
*
* Description : Read asynchronously from a serial interface.
*
* Argument(s) : if_nbr      Interface number.
*
*               pdest       Pointer to destination buffer.
*
*               len         Number of octets to read.
*
*               phandler    Address of read complete callback function.
*
*               parg        Pointer to read complete callback context.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Asynchronous operation successful.
*                               SERIAL_ERR_NULL_PTR             NULL pointer passed for argument 'pdest'.
*                               SERIAL_ERR_NULL_FNCT            NULL pointer passed for argument 'phandler'.
*                               SERIAL_ERR_IF_IN_USE            Serial interface is in use.
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
* Return(s)   : None.
*
* Caller(s)   : Application.
*
* Note(s)     : (1) Only ONE task/context can read from the same serial interface at a time.  If the receiver
*                   is busy when this function is called, an error will be returned.
*********************************************************************************************************
*/

void  Serial_RdAsync (SERIAL_IF_NBR          if_nbr,
                      void                  *pdest,
                      CPU_SIZE_T             len,
                      SERIAL_CALLBACK_FNCT  *phandler,
                      void                  *parg,
                      SERIAL_ERR            *perr)
{
    SERIAL_IF    *pif;
#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
    CPU_BOOLEAN   valid;
#endif


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* ------------------- VALIDATE ARGS ------------------ */
    valid = Serial_IF_IsValid(if_nbr, perr);
    if (valid != DEF_YES) {                                     /* Rtn err if IF not valid.                             */
        return;
    }
#endif

    if (len == (CPU_SIZE_T)0) {                                 /* Chk for zero len.                                    */
       *perr = SERIAL_ERR_NONE;
        return;
    }

    pif = &Serial_IF_Tbl[if_nbr];

    Serial_RdHandler(pif,
                     pdest,
                     len,
                     phandler,
                     parg,
                     DEF_YES,
                     0,
                     perr);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                          Serial_WaitFor()
*
* Description : Wait for octet array to arrive on serial interface.
*
* Argument(s) : if_nbr      Interface number.
*
*               psrc        Pointer to buffer to wait for.
*
*               len         Number of octets in the buffer.
*
*               timeout_ms  Optional timeout period in milliseconds. If specified 0, wait indefinitely.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Octet array arrived on serial interface.
*                               SERIAL_ERR_NULL_PTR             NULL pointer passed for argument 'psrc'.
*                               SERIAL_ERR_SIGNAL               OS semaphore could NOT be created.
*
*                                                               -- RETURNED BY Serial_IF_IsValid() : --
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
*                                                               ----- RETURNED BY Serial_RdEnd() : ----
*                               SERIAL_ERR_TIMEOUT              Operation timed-out.
*                               SERIAL_ERR_FAIL                 Operation failed.
*
* Return(s)   : None.
*
* Caller(s)   : Application.
*
* Note(s)     : (1) Only ONE task/context can read from the same serial interface at a time.  If the receiver
*                   is busy when this function is called, an error will be returned.
*
*               (2) This function bypasses the line driver for new incoming octets, and may use rd
*                   buf for initial comparison.
*********************************************************************************************************
*/

void  Serial_WaitFor (SERIAL_IF_NBR   if_nbr,
                      void           *psrc,
                      CPU_SIZE_T      len,
                      CPU_INT32U      timeout_ms,
                      SERIAL_ERR     *perr)
{
    SERIAL_CALLBACK_INFO   rd_info;
    SERIAL_IF             *pif;
    CPU_BOOLEAN            valid;
    void                  *psignal;
#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)
    CPU_BOOLEAN            cmp;
    CPU_BOOLEAN            empty;
    CPU_BOOLEAN            rd;
    CPU_INT08U             datum;

⌨️ 快捷键说明

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