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