3

問題

  • 外部ソースがこれらの 4 バイトを送信します0x2A, 0x42, 0x78, 0x25
  • PIC32 UART は int を生成しません
  • 外部ソースはもう 1 バイトを送信します
  • 次に、PIC32 UARTは int を生成します。
  • その int には0x25、前の送信からのバイトのみが表示されます
  • つまり、最初の 3 つが消える
  • ときどき (おそらく 5% の確率で) UART は 4 バイトすべてを適切に生成します。

【金曜夕方のデバッグ結果】

別のエコー ルーチンを作成しました。取得したものを読み取り、書き戻すだけです。

リリースモードでビルドしました(ここで別のアドバイスに基づいて)

同じ番号を 25 回送信し、何を返すかを確認するルーチンを作成しました。

その後、値を inc して 25 回送信し、ループします。

結果はこのメッセージの最後に追加されます。

最初の null バイトが返されません。さまざまな要因に基づいて、現時点ではそれについて心配することはありません。

次の5ラウンド、私はすべてを完全に取り戻しています

関連するすべてのソース コードを含めようとしますが、テキストの壁でないことを願っています。これを理解するためにさらにコードが必要な場合は、質問してください。

これは、問題の UART の初期化コードです。私は含めることができます

  //*****************************************************************//
  void initUART1(void)   // UART1 for MCU1/2 communication
  {
   U1MODE=0;                     //// Mode Register, Manual DS61168D page 180
   U1MODEbits.FRZ=0;
   U1MODEbits.SIDL=0;
   U1MODEbits.IREN=0;
   U1MODEbits.RTSMD=0;

   U1MODEbits.UEN=0b00;           //// Just TX/RX, No CTS/RTS

   U1MODEbits.WAKE=1;
   U1MODEbits.LPBACK=0;
   U1MODEbits.ABAUD=0;
   U1MODEbits.RXINV=0;
   U1MODEbits.BRGH=1;
   U1MODEbits.PDSEL=0b00;
   U1MODEbits.STSEL=0;

   U1STA=0;
   U1STAbits.ADM_EN=0;
   U1STAbits.UTXINV=0;
   U1STAbits.URXEN=1;
   U1STAbits.UTXBRK=0;
   U1STAbits.UTXEN=1;
   U1STAbits.ADDEN=0;
   U1STAbits.OERR=0;     
                                 //// Status register, Manual DS61168D page 183

   //U1BRG=21;                    ////  21 for 921600 (80 MIPS)
     U1BRG=172;                   //// 172 for 115200 (80 MIPS)

   IFS0bits.U1RXIF=0;
   IPC6bits.U1IP=5;
   IPC6bits.U1IS=3;
   IEC0bits.U1RXIE=1;

   U1MODEbits.ON=1;
  }


  //*****************************************************************//

これは、この特定の UART を処理する割り込みサービス ルーチンです。

  //*********************************************************//
  void __ISR(_UART1_VECTOR, ipl5) IntUart1Handler(void)   //MCU communication port
  {     
    if(INTGetFlag(INT_SOURCE_UART_RX(UART1)))  //if it's a rx interrupt
    {
       U1RxBuf=UARTGetDataByte(UART1);

    switch (CmdRecording)
    {
     case 0:
           if(U1RxBuf=='*')
           {
            CmdRecording=1;  //set the cmd recording flag
            Command_U1[0]=U1RxBuf;
            TimeOut=1;  //time out=1 means the timeout for MCU1 command receiver is enabled
            initT3(0x0100);  //time out=0 means the timeout for MCU1 command receiver is enabled
           }
           else
         {
          putcharUART1('$');
          putcharUART1('e');
          putcharUART1('2');
          putcharUART1('%');
         }
           break;
     case 1:
           CmdRecording=2;  //set the cmd recording flag
           Command_U1[1]=U1RxBuf;
           break;
     case 2:
           CmdRecording=3;  //set the cmd recording flag
           Command_U1[2]=U1RxBuf;
           break;
     case 3:
           CmdRecording=0;  //reset the cmd recording flag
           Command_U1[3]=U1RxBuf;
           if(U1RxBuf=='%') //if this is the last command byte
           {
                if((Command_U1[1]=='O'))
            {
               CMD_Err=0;      //clear error
             CMD_OK=1;      //send cmd OK;
            }
              else if((Command_U1[1]=='e'))
            {
               CMD_OK=0;      //clear OK
             CMD_Err=1;     //send cmd Err;
            }
            else
            Command_flag=1;
           }
           else
           {
            Command_flag=0;
           }

           disableT3(0);  //the command receiving is done, disable the time out #0 (command receving time out)
           TimeOut=0;  //the command receiving is done, disable the time out

           break;
     default:
           break;
    }
     INTClearFlag(INT_SOURCE_UART_RX(UART1));
    }

    if ( INTGetFlag(INT_SOURCE_UART_TX(UART1)) )  //if it's a tx interrupt
    {
        INTClearFlag(INT_SOURCE_UART_TX(UART1));
    }
  }

  //***********************************************//

これは、「エコー」システムを介してバイトを実行したときに見たデータです。つまり、1 を読み取り、1 を書き込むルーチンです。

PIC-32 は 80 MHz で動作しており、UART は 115200 bps を実行しているため、速度については心配していません。

  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 
  02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 
  03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 
  04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 
  05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05
4

1 に答える 1

5

UART にはおそらく 4 バイトの FIFO があり、FIFO がいっぱいになるまで割り込みを生成しないようです。私はその部分に精通していませんが、多くの場合、特定の FIFO レベルで、または n 文字のタイムアウト後に割り込みを生成するように UART をプログラムして、フルでない FIFO のデータを読み取ることができます。さらに、この場合、ISR は単純に 1 文字を読み取るのではなく、FIFO が空になるまでループする必要があります。

于 2013-03-07T18:50:28.737 に答える