2

これまでに機能していること:

  • USB コンバータを搭載した PC から Click-Board RS485 を搭載した PIC32MX にバイトを送信する
  • UART5 はデータの受信に使用され、これらのデータは UART4 を介して送り返され、ターミナルで読み取られます。
  • バイトは正しくエコーされていますが、

問題:

  • 「<0>」や 0x01 などの追加のガベージ バイトが PIC32 によって受信されます (私の PIC32 で既にデバッグしました)。
  • 割り込みでデータをエコーするためにprintfを使用すると、受信されるバイト数が少なくなります(ただし、とにかくいくらか)

ここに私のコードがあります:

void init() {
        SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

        /************************ UART5 for RS485 *********************************/
        UARTConfigure(UART_MODULE_ID, UART_ENABLE_PINS_TX_RX_ONLY);
        //UARTSetFifoMode(UART_MODULE_ID, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
        UARTSetFifoMode(UART_MODULE_ID, UART_INTERRUPT_ON_RX_NOT_EMPTY);
        UARTSetLineControl(UART_MODULE_ID, UART_DATA_SIZE_8_BITS | UART_PARITY_EVEN | UART_STOP_BITS_1);
        UARTSetDataRate(UART_MODULE_ID, GetPeripheralClock(), 19200);
        UARTEnable(UART_MODULE_ID, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

        // Configure UART RX Interrupt
        INTEnable(INT_SOURCE_UART_RX(UART_MODULE_ID), INT_ENABLED);
        INTSetVectorPriority(INT_VECTOR_UART(UART_MODULE_ID), INT_PRIORITY_LEVEL_2);
        INTSetVectorSubPriority(INT_VECTOR_UART(UART_MODULE_ID), INT_SUB_PRIORITY_LEVEL_0);

        /************************* UART4 - for debugging **************************/
        UARTConfigure(UART4, UART_ENABLE_PINS_TX_RX_ONLY);
        UARTSetLineControl(UART4, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
        UARTSetDataRate(UART4, GetPeripheralClock(), 19200);
        UARTEnable(UART4, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_TX));

        // Enable multi-vector interrupts
        INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
        INTEnableInterrupts();}

void __ISR(_UART_5_VECTOR, ipl2) IntUart5Handler(void) {
        volatile UINT state;
        unsigned char received;

        // Is this an RX interrupt?
        if (INTGetFlag(INT_SOURCE_UART_RX(UART_MODULE_ID))) {

            INTClearFlag(INT_SOURCE_UART_RX(UART_MODULE_ID));

            state = UARTGetLineStatus(UART_MODULE_ID);

            if (UART_DATA_READY & state > 0
                    && (state & (UART_OVERRUN_ERROR |
                    UART_PARITY_ERROR |
                    UART_FRAMING_ERROR |
                    UART_OVERRUN_ERROR)) == 0) { 
                received = UARTGetDataByte(UART_MODULE_ID);

                printf("%c", received);

            } 
        }

        // We don't care about TX interrupt
        if (INTGetFlag(INT_SOURCE_UART_TX(UART_MODULE_ID))) {
            INTClearFlag(INT_SOURCE_UART_TX(UART_MODULE_ID));
        }
    }

void _mon_putc(char c) {
            while (!UARTTransmitterIsReady(UART4));
            UARTSendDataByte(UART4, c);
            while (!UARTTransmissionHasCompleted(UART4));
        }

plib-Example のように PPSOutput を配置しませんでした。それは問題になるでしょうか?標準ピンを使用するため、ここでのマッピングは必要ないと思いますか?

どうにかして、あなたが私を助けてくれることを願っています。私は本当にイライラして一生懸命努力しましたが、なぜこれらの追加のバイトを受け取るのかわかりません。


編集:問題を解決しました:

ここで解決策を見つけました: http://www.edaboard.com/thread195556.html

事実は、データが利用可能になるまで待つ必要があるということです! 次の行を追加すると、完全に機能します!

        while(!UARTReceivedDataIsAvailable(UART_MODULE_ID));
        received = UARTGetDataByte(UART_MODULE_ID);
4

0 に答える 0