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

📄 serial.c

📁 STM3240G-Eval_uCOS-III
💻 C
📖 第 1 页 / 共 5 页
字号:
#endif
    CPU_SR_ALLOC();


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* ------------------- VALIDATE ARGS ------------------ */
    if (psrc == (void *)0) {                                    /* Validate src buf ptr.                                */
       *perr = SERIAL_ERR_NULL_PTR;
        return;
    }
#endif

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

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

    pif = &Serial_IF_Tbl[if_nbr];
    SerialOS_SemWait(pif->RdSem, 0, perr);
    if (*perr != SERIAL_OS_ERR_NONE) {
         return;
    }

    CPU_CRITICAL_ENTER();

    SerialBuf_Init((SERIAL_BUF  *)&(pif->RdUserBuf),            /* Init cmp buf.                                        */
                   (CPU_INT08U  *)  psrc,
                   (CPU_SIZE_T   )  len,
                   (CPU_BOOLEAN  )  DEF_YES);

#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)                       /* -------------------- CHK RD BUF -------------------- */
    if (pif->RdBufEn == DEF_YES) {
        empty = SerialBuf_IsEmpty(&(pif->RdBuf));
        if (empty == DEF_NO) {
            CPU_CRITICAL_EXIT();
            cmp = DEF_NO;
            do {
                CPU_CRITICAL_ENTER();
                rd = SerialBuf_RdOctet(&(pif->RdBuf), &datum);
                if (rd == DEF_YES) {
                    cmp = SerialBuf_Cmp(&(pif->RdUserBuf), datum);
                    if (cmp != DEF_YES) {
                        CPU_CRITICAL_EXIT();
                    }
                }
            } while ((rd  == DEF_YES) &&
                     (cmp != DEF_YES));

            empty = SerialBuf_IsEmpty(&(pif->RdBuf));
            if ((cmp   == DEF_YES) &&
               ((empty == DEF_NO)  ||
                (pif->RdBufErr == SERIAL_ERR_NONE))) {
                    CPU_CRITICAL_EXIT();
                    SerialOS_SemSignal(pif->RdSem);
                   *perr  = SERIAL_ERR_NONE;
                    return;
            }

            if (pif->RdBufErr != SERIAL_ERR_NONE) {             /* Restart cmp if rd buf err.                           */
                SerialBuf_Init((SERIAL_BUF  *)&(pif->RdUserBuf),
                               (CPU_INT08U  *)  psrc,
                               (CPU_SIZE_T   )  len,
                               (CPU_BOOLEAN  )  DEF_YES);

                pif->RdBufErr  = SERIAL_ERR_NONE;               /* Flush rd buf.                                        */
                SerialBuf_Clr(&(pif->RdBuf));
            }

        } else if (pif->RdBufErr != SERIAL_ERR_NONE) {
            pif->RdBufErr = SERIAL_ERR_NONE;                    /* Flush rd buf.                                        */
            SerialBuf_Clr(&(pif->RdBuf));
        }
    }
#endif


    psignal = SerialOS_SemCreate((CPU_INT16U)0);
    if (psignal == (void *)0) {
        CPU_CRITICAL_EXIT();
        SerialOS_SemSignal(pif->RdSem);
       *perr = SERIAL_ERR_SIGNAL;
        return;
    }
    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;


                                                                /* --------------------- START RD --------------------- */
    pif->RdCallback    = &Serial_RdCallback;                    /* Callback called upon completion.                     */
    pif->RdCallbackArg = (void *)&rd_info;                      /* Arg     passed to callback.                          */
    pif->RdCallbackBuf =  psrc;                                 /* Buf     passed to callback.                          */
#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)
    pif->RdCallbackLen =  len;                                  /* Buf len passed to callback.                          */
#endif
    pif->RdState       =  SERIAL_RD_STATE_CHK;

    Serial_IF_RxStart(pif);                                     /* Start rx'er.                                         */
    CPU_CRITICAL_EXIT();


   (void)Serial_RdEnd(pif, &rd_info, perr);                     /* Wait for rd end.                                     */
    SerialOS_SemDel(psignal);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                             Serial_Wr()
*
* Description : Write synchronously to a serial interface with an optional time-out interval.
*
* Argument(s) : if_nbr      Interface number.
*
*               psrc        Pointer to source buffer.
*
*               len         Number of octets to write.
*
*               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 written.
*                               SERIAL_ERR_SIGNAL               OS semaphore could NOT be created.
*                               SERIAL_ERR_NULL_PTR             NULL pointer passed for argument 'psrc'.
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
*                                                               ---- RETURNED BY Serial_WrStart() : ---
*                               SERIAL_ERR_BUF_ALLOC            Buffer structure could NOT be allocated.
*
*                                                               ---- RETURNED BY Serial_WrEnd() : -----
*                               SERIAL_ERR_TIMEOUT              Operation timed-out.
*                               SERIAL_ERR_FAIL                 Device write failed.
*
* Return(s)   : Number of octets written.
*
* Caller(s)   : Application.
*
* Note(s)     : (1) Multiple tasks/contexts may write to the same serial interface at any time.
*
*               (2) A synchronous write CANNOT be requested in interrupt context.
*********************************************************************************************************
*/

CPU_SIZE_T  Serial_Wr (SERIAL_IF_NBR   if_nbr,
                       void           *psrc,
                       CPU_SIZE_T      len,
                       CPU_INT32U      timeout_ms,
                       SERIAL_ERR     *perr)
{
    SERIAL_IF             *pif;
    CPU_BOOLEAN            valid;
    SERIAL_CALLBACK_INFO   wr_info;
    CPU_SIZE_T             len_wr;
    void                  *psignal;
    SERIAL_BUF_DESC        buf;
    CPU_SR_ALLOC();


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* ------------------- VALIDATE ARGS ------------------ */
    if (psrc == (void *)0) {                                    /* Validate src buf ptr.                                */
       *perr = SERIAL_ERR_NULL_PTR;
        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);
    }

    wr_info.Timeout = (CPU_INT32U)timeout_ms;
    wr_info.Len     = (CPU_SIZE_T)0;
    wr_info.Err     = (SERIAL_ERR)SERIAL_ERR_NONE;


    buf.Len         =  len;
    buf.DataPtr     =  psrc;
    buf.Callback    = &Serial_WrCallback;                       /* Callback called upon completion.                     */
    buf.CallbackArg = &wr_info;                                 /* Argument passed to callback.                         */
    buf.CallbackBuf =  psrc;                                    /* Buf      passed to callback.                         */


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


    pif = &Serial_IF_Tbl[if_nbr];

    SerialOS_SemWait(pif->WrSem, 0, perr);
    if (*perr != SERIAL_OS_ERR_NONE) {
         return ((CPU_SIZE_T)0);
    }

    psignal = SerialOS_SemCreate((CPU_INT16U)0);
    if (psignal == (void *)0) {
        SerialOS_SemSignal(pif->WrSem);
       *perr = SERIAL_ERR_SIGNAL;
        return ((CPU_SIZE_T)0);
    }

    wr_info.SignalPtr = (void *)psignal;

    CPU_CRITICAL_ENTER();
    Serial_WrStart(pif, &buf, perr);                            /* Start wr.                                            */
    CPU_CRITICAL_EXIT();

    if (*perr == SERIAL_ERR_NONE) {
        len_wr = Serial_WrEnd(pif, &wr_info, perr);             /* Wait for wr end.                                     */
    } else{
        len_wr = 0;
    }

    SerialOS_SemDel(psignal);
    return (len_wr);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                          Serial_WrAsync()
*
* Description : Write asynchronously to a serial interface.
*
* Argument(s) : if_nbr      Interface number.
*
*               psrc        Pointer to source buffer.
*
*               len         Number of octets to write.
*
*               phandler    Address of write complete callback function.
*
*               parg        Pointer to write complete callback context.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE             Device successfully written.
*                               SERIAL_ERR_NULL_PTR         NULL pointer passed for argument 'psrc'.
*                               SERIAL_ERR_NULL_FNCT        NULL pointer passed for argument 'phandler'.
*                               SERIAL_ERR_IF_IN_USE        Serial interface is in use.
*
*                                                           ---- RETURNED BY Serial_IF_IsValid() : ----
*                               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) Multiple tasks/contexts may write to the same serial interface at any time.
*********************************************************************************************************
*/

void  Serial_WrAsync (SERIAL_IF_NBR          if_nbr,
                      void                  *psrc,
                      CPU_SIZE_T             len,
                      SERIAL_CALLBACK_FNCT  *phandler,
                      void                  *parg,
                      SERIAL_ERR            *perr)
{
    SERIAL_IF        *pif;
    CPU_BOOLEAN       valid;
    SERIAL_BUF_DESC   buf;
    CPU_BOOLEAN       lock;
    CPU_SR_ALLOC();


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* ------------------- VALIDATE ARGS ------------------ */
    if (psrc == (void *)0) {                                    /* Validate src buf ptr.                                */
       *perr = SERIAL_ERR_NULL_PTR;
        return;
    }
    if (phandler == (void *)0) {                                /* Validate callback fnct ptr.                          */
       *perr = SERIAL_ERR_NULL_FNCT;
        return;
    }
#endif

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


    buf.Len         = len;
    buf.DataPtr     = psrc;
    buf.Callback    = phandler;                                 /* Callback called upon completion.                     */
    buf.CallbackArg = parg;                                     /* Argument passed to callback.                         */
    buf.CallbackBuf = psrc;                          

⌨️ 快捷键说明

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