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