UART seltsames Verhalten mit PIC32

Ich bin neu bei PIC32 MCU, ich habe ein kleines Stück Code geschrieben, um den UART auszuführen.

Die MCU ist der Microchip PIC32MX795F512H , der Code verwendet Interrupts, um den Empfang und die Übertragung auf dem UART- Kanal 5 (UART5) zu handhaben, im Grunde gibt der Code die Benutzereingabe zurück.

Der Code ist fast funktionsfähig nur ein komisches Verhalten: Die ersten 8 Bits werden korrekt zurückgegeben und dann werden 3 Zeichen an die Konsole übertragen.

Die Eingabe ist azertyaund die MCU gibt zurück: azertyaaaa(es fügt hinzu aaa, der Buchstabe a war das erste eingegebene Zeichen) und manchmal azertyaÿÿÿ; dann gibt es für eine Zeicheneingabe die Zeichen und drei andere (nicht zufällig) zurück.

Haupt c

            #include <p32xxxx.h>
            #include <plib.h>
            #include "uart.h" 

            #define GetSystemClock()                (80000000ul)
            #define GetPeripheralClock()                (GetSystemClock()/(1 << OSCCONbits.PBDIV))
            #define GetInstructionClock()               (GetSystemClock())

            #pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
            #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1

            #define US_TO_CT_TICKS      (CPU_CT_HZ/1000000UL)   

            #define UARTCH1 UART5


            /*------------------------- Interruptions -----------------------------------*/


            void __ISR(_UART_5_VECTOR, ipl2) IntUART5Handler(void){


                if(INTGetFlag(INT_SOURCE_UART_RX(UARTCH1)))
                {

                        INTClearFlag(INT_SOURCE_UART_RX(UARTCH1));


                        PutCharacter(UARTGetDataByte(UARTCH1), UARTCH1);

                        mPORTBToggleBits ( BIT_12 );
                }


                if ( INTGetFlag(INT_SOURCE_UART_TX(UARTCH1)) ){

                        INTClearFlag(INT_SOURCE_UART_TX(UARTCH1));

                        PutCharacter(UARTGetDataByte(UARTCH1), UARTCH1);

                        mPORTBToggleBits ( BIT_15); 
                }
            }
            /*---------------------------------------------------------------------------*/

            int main (void){

                    SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

                    ConfUART(UARTCH1); 

                    mJTAGPortEnable(DEBUG_JTAGPORT_OFF);
                    mPORTBClearBits( BIT_15 | BIT_14 | BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
                    mPORTBSetPinsDigitalOut( BIT_15 | BIT_14 | BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );

                    WriteToUART("Test1_Test2_Test3_Test4_Test5\n", UARTCH1);

                return 0;

            }

UART.c

            #include <plib.h>

            #define GetSystemClock()        (80000000ul)
            #define GetPeripheralClock()        (GetSystemClock()/(1 << OSCCONbits.PBDIV))
            #define T_RATE_X                    (9600) 

            void WriteToUART(const char *string, char UARTCH){ 

                while(*string != '\0')
                {
                    while(!UARTTransmitterIsReady(UARTCH));
                    UARTSendDataByte(UARTCH, *string);
                    string++;
                    while(!UARTTransmissionHasCompleted(UARTCH));
                }
            }

            void PutCharacter(const char character, char UARTCH){

                while(!UARTTransmitterIsReady(UARTCH));

                    UARTSendDataByte(UARTCH, character);

                    while(!UARTTransmissionHasCompleted(UARTCH));
            }

            void ConfUART(char UARTCH){

                UARTConfigure           (UARTCH, UART_ENABLE_PINS_TX_RX_ONLY);
                UARTSetFifoMode     (UARTCH, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
                UARTSetLineControl  (UARTCH, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1); /* 8 Bits, Pas de parité, 1 STOP Bits */
                UARTSetDataRate     (UARTCH, GetPeripheralClock(), T_RATE_X);
                UARTEnable              (UARTCH, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

                INTEnable                           (INT_SOURCE_UART_RX(UARTCH), INT_ENABLED);
                INTSetVectorPriority            (INT_VECTOR_UART(UARTCH), INT_PRIORITY_LEVEL_2);
                INTSetVectorSubPriority     (INT_VECTOR_UART(UARTCH), INT_SUB_PRIORITY_LEVEL_0);


                INTConfigureSystem      (INT_SYSTEM_CONFIG_MULT_VECTOR);


                INTEnableInterrupts();

            }

Antworten (2)

Ihre UART-Schreibfunktion ist so aufgebaut, dass sie die Übertragung stoppt, wenn sie ein NULL-Zeichen in Ihrer Zeichenfolge findet ('\0' oder 0x00). Sie beenden Ihre Zeichenfolgen nicht mit Null. Es weiß nicht, wann es aufhören soll zu senden, also macht es weiter und sendet alles, was es findet, bis es ein NULL-Zeichen findet.

Um dies zu beheben, müssen Sie jedes Mal, wenn Sie eine Zeichenfolge senden, '\0' an das Ende davon anhängen.

EDIT: Okay, die PutChar-Funktion behebt das - müssen Sie den Interrupt manuell löschen? Es sieht so aus, als gäbe es zwei Unterquellen, die miteinander ODER-verknüpft sind, um den Haupt-Interrupt zu verursachen - Sie löschen sie, aber müssen Sie auch den Haupt-Interrupt löschen? Das könnte dieses Problem verursachen. Haben Sie Ihre UART-Tx-Leitung sondiert und die Baudrate auf diese Weise überprüft? Das könnte ein Problem sein - wenn Sie eine Taktquelle mit geringer Genauigkeit verwenden, ist die Baudrate möglicherweise nicht genau richtig.

Bearbeiten Sie auch: Sehen Sie, wie Ihr Port jedes Mal umschaltet, wenn er die zusätzlichen Bytes sendet?

Ich habe dies versucht, ich habe die Funktion writetouart entfernt (nur einmal verwendet und nicht wirklich notwendig), aber das Problem bleibt bestehen: Wenn ich die MCU mit dem Code boote, sende ich die Zeichenfolge azerty, die MCU erfasst und gibt sie korrekt zurück, dann am Bei der achten Eingabe werden das Zeichen und 3 andere (die gleich sind) zurückgegeben. Ich bemerke, dass die unerwünschten zurückgegebenen Zeichen die zuvor eingegebenen sind (von Anfang an). Zum Beispiel: Ich sende azerty (ok), azertya (ok), ich sende azertyaz, es gibt azertyazaaa zurück.
Unabhängig davon wird Ihr Code wie gepostet aus diesem Grund nicht funktionieren. Wenn Sie möchten, dass ich den anderen Code debugge, posten Sie ihn.
Aktualisieren Sie Ihre Frage damit! Dieser Code in einem Kommentar ist einfach ein Durcheinander!
Der im Kommentar gepostete Code ist bereits in der Datei UART.c verfügbar. Ich denke, es ist die Funktion PutCharacter, die nicht richtig entworfen wurde.

Korrigieren Sie mich, wenn ich falsch liege, aber es sieht so aus, als ob Sie sich im UART5-Interrupt befinden, aber die UART1-RX- und TX-Flags löschen.