我正在使用 UART 与 dsPIC x16 微控制器通信我的 C# 应用程序。我想发送/接收固定大小的帧,并尝试通过以下方式对其进行管理:
if(readFrame)
{ IEC0bits.U1RXIE=0; //turn off the U1RX interrupts
readFrame = false;
while(indexer < 8 )
{
while(!U1STAbits.URXDA);
modbusBuffer[indexer]=U1RXREG;
indexer++;
}
if(indexer == 8)
{
modbusRecvTask(modbusBuffer);
indexer=0;
}
IEC0bits.U1RXIE=1; //turn on U1RX interrupts
}
void _ISR_NAP _U1RXInterrupt()
{
if(IFS0bits.U1RXIF)
{
IFS0bits.U1RXIF = 0; //set the interrupt flag to false
if(U1STAbits.OERR==1) //check overload error
{
U1STAbits.OERR=0; //clear error flag
}
else
{
readFrame = true;
}
}
}
问题是它仅适用于第一个接收到的帧。之后,程序再次进入接收器中断并将标志 readFrame 设置为 true,即使没有发送任何字节并且卡在队列中:
while(!U1STAbits.URXDA);
我已经阅读了一些清除 UART 读取缓冲区的建议,以防止程序再次进入 ISR,但我找不到解决方法。