// return the byte count received before timeout, or error(<0) int32_t serial_recv_stream_timeout (serial_t *obj, char *prxbuf, uint32_t len, uint32_t timeout_ms, void *force_cs) { PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)&(obj->hal_uart_adp); uint32_t TimeoutCount=0, StartCount; int ret; void (*task_yield)(void); task_yield = NULL; pHalRuartOp = &(obj->hal_uart_op); HalRuartEnterCritical(pHalRuartAdapter); ret = pHalRuartOp->HalRuartIntRecv(pHalRuartAdapter, (u8*)prxbuf, len); HalRuartExitCritical(pHalRuartAdapter); if ((ret == HAL_OK) && (timeout_ms > 0)) { TimeoutCount = (timeout_ms*1000/TIMER_TICK_US); StartCount = HalTimerOp.HalTimerReadCount(1); task_yield = (void (*)(void))force_cs; while (pHalRuartAdapter->State & HAL_UART_STATE_BUSY_RX) { if (HAL_TIMEOUT == RuartIsTimeout(StartCount, TimeoutCount)) { ret = pHalRuartOp->HalRuartStopRecv((VOID*)pHalRuartAdapter); ret = pHalRuartOp->HalRuartResetRxFifo((VOID*)pHalRuartAdapter); pHalRuartAdapter->Status = HAL_UART_STATUS_TIMEOUT; break; } if (NULL != task_yield) { task_yield(); } } return (len - pHalRuartAdapter->RxCount); } else { return (-ret); } }
int32_t serial_recv_stream (serial_t *obj, char *prxbuf, uint32_t len) { PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)&(obj->hal_uart_adp); int ret; pHalRuartOp = &(obj->hal_uart_op); ret = pHalRuartOp->HalRuartIntRecv(pHalRuartAdapter, (u8*)prxbuf, len); return (ret); }