为什么在串口接收中断函数中打印数据(串口输出数据)会导致出错?
在用华大单片机HC32L110操作时,会出现标题所示的错误,下面是数据手册中的一句话:
then,看下实际工程中的代码(无关代码已经删除,保留关键代码),串口配置为接收中断,输出不用中断方式
串口发送:
en_result_t Uart_SendData(uint8_t u8Idx, uint8_t u8Data)
{
Uart_ClrStatus(u8Idx,UartTxEmpty); //发送完成标志位清零=FALSE
pstcData->pstcInstance->SBUF =u8Data;//要发送的字节
while(FALSE == Uart_GetStatus(u8Idx,UartTxEmpty))//等待发送完成,标志位置位=TRUE
{}
Uart_ClrStatus(u8Idx,UartTxEmpty); //发送完成标志位清零=FALSE
return Ok;
}
接收中断函数:
void UART1_IRQHandler(void)
{
Uart_ClrStatus(1,UartRxFull);//清除接收中断
UartRecvBuff[UartRecvWrite++] = M0P_UART1->SBUF; //保存数据
Uart_SendData(UARTCH1,0x06);//在接收中断后发送一个字节
}
主函数:
while(1)
{
Uart_SendData(UARTCH1,0x02);
}
软件发生错误的过程:主函数发送一个字节时,还未完成就被中断,跳转到中断函数,然后在接收中断函数中又进行了一个字节的发送操作,就会导致出错(如数据手册所言,当一个发送字节还未完成时,又发送了一个字节),结果就是主函数一直在这里等待数据发送成功while(FALSE == Uart_GetStatus(u8Idx,UartTxEmpty)),而它已经发生了错误永远都不可能成功发送了。