0

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
          }

この状況をより適切に処理するには、コードをどのように設定する必要がありますか?

4

1 に答える 1

0

割り込みルーチンLoopVar0 >= qで、キュー インデックスをリセットしLoopVar0 = 0、フラグを設定ready0 = 1して main() でキュー データを処理します。問題は、キューが main() で処理される前に新しい割り込みが処理されると、キューの内容が上書きされることです。キューの開始が終了と等しくない場合は常に main() で処理する循環キューを実装します。これにより、すべての受信データを処理する時間が得られます。

于 2013-09-10T20:10:50.030 に答える