UART 経由で他のデバイスと通信しています。デバイスにコマンドを送信して、特定の情報を要求しています。使用可能な回答が得られるまで、コマンドを繰り返します。
私が抱えている問題は、静的で既知の文字列の長さを扱っているときに、私が使用する ISR が正常に機能することです。しかし、この場合、受信している文字列の長さはいつでも異なる可能性があります。たとえば、デバイスにエラーがあるかどうかによって異なります。したがって、最初の 5 つのリクエストで、予期した長さよりも短いまたは長いエラー文字列が返されたとします。試行 6 では、予想される長さの文字列が生成されますが、(ソフトウェア) バッファーが何らかの形で破損しているようです。フレーミングの問題のように、バイトが正しい場所にありません。
これは、現在の ISR です。
void UART1RXInterrupt() iv IVT_ADDR_U1RXINTERRUPT {
uart_rd2[LoopVar0] = UART1_Read();
LoopVar0++;
if (LoopVar0 >= q) //Fill array until certain lenght
{
LoopVar0 = 0;
ready0 = 1;
}
if (U1STA.OERR = 1)
{
U1STA.OERR = 0;
U1STA.FERR = 0;
}
U1RXIF_bit = 0;
}
そして、メインコードでそれを処理する方法:
UART1_Write_Text("A"); //Command
if (ready0 == 1)//Data received
{
if (uart_rd2[0] == 0x4F && uart_rd2[1] == 0x4B) //Check message ID
{
//Found answer that I was looking for
}
ready0 = 0;
}
else
delay_ms(2000); //Wait and try again
}
この状況をより適切に処理するには、コードをどのように設定する必要がありますか?