串口0参数配置:工作模式:模式1(异步全双工) 发送方式:查询 接收发送:中断
问题描述:
串口接收中断开启,当串口以查询的方式发送数据的同时,串口有可能收到数据进入中断服务函数,代码如下:
/**
******************************************************************************
** \brief UART通道发送数据函数,查询方式调用此函数,中断方式发送不适用
**
** \param [in] u8Idx通道号,Data发送数据
**
** \retval Ok发送成功
**\retval ErrorInvalidParameter发送失败
******************************************************************************/
en_result_t Uart_SendData(uint8_t u8Idx, uint8_t u8Data)
{
stc_uart_instance_data_t *pstcData = NULL;
ASSERT(IS_VALID_CH(u8Idx));
pstcData = UartGetInternDataPtr(u8Idx);
if (NULL == pstcData)
{
return ErrorInvalidParameter;
}
Uart_ClrStatus(u8Idx,UartTxEmpty);
pstcData->pstcInstance->SBUF =u8Data;
while(FALSE == Uart_GetStatus(u8Idx,UartTxEmpty))
{}
Uart_ClrStatus(u8Idx,UartTxEmpty);
return Ok;
}
******************************************************************************
** \brief UART通道中断处理函数
**
** \param [in] u8Param通道号
**
** \retval 无
**
******************************************************************************/
void Uart_IRQHandler(uint8_t u8Param)
{
stc_uart_instance_data_t *pstcData = NULL;
pstcData = UartGetInternDataPtr(u8Param);
if (NULL == pstcData)
{
return;
} //----------错误帧--------
if(1 == pstcData->pstcInstance->ISR_f.FE)
{
Uart_ClrStatus(u8Param,UartRFRAMEError);
if(NULL != pstcData->stcUartInternIrqCb.pfnRxErrIrqCb)
{
pstcData->stcUartInternIrqCb.pfnRxErrIrqCb();
}
return;//若奇偶校验出错则不进行后续数据处理
} //----------接收--------
if(1 == pstcData->pstcInstance->ISR_f.RI)
{
Uart_ClrStatus(u8Param,UartRxFull);
if(NULL != pstcData->stcUartInternIrqCb.pfnRxIrqCb)
{
pstcData->stcUartInternIrqCb.pfnRxIrqCb();
}
} //----------发送--------
if(1 == pstcData->pstcInstance->ISR_f.TI)
{
Uart_ClrStatus(u8Param,UartTxEmpty); //pstcData->pstcInstance->ISR_f.TI清0
if(NULL != pstcData->stcUartInternIrqCb.pfnTxIrqCb)
{
pstcData->stcUartInternIrqCb.pfnTxIrqCb();
}
}
}
在执行完接收部分,会判断发送完成标志pstcData->pstcInstance->ISR_f.TI是否置位,若此时pstcData->pstcInstance->ISR_f.TI==1,会执行Uart_ClrStatus(u8Param,UartTxEmpty)清0,然后串口发送就会停在while(FALSE == Uart_GetStatus(u8Idx,UartTxEmpty)){};
|