UART entrecortado MSP430

Tengo problemas con el UART en el microcontrolador MSP430FR5969. Estoy enviando unos 85 caracteres 100 veces por segundo para un sistema de adquisición de datos. Estoy usando una velocidad de transmisión de 115200, que debería ser suficiente. Cuando veo la salida en serie en un programa de terminal, obtengo fragmentos de ~4000 caracteres cada pocos cientos de milisegundos. Dado que los datos son sensibles al tiempo, me gustaría que entraran de manera constante.

Aquí están las tripas del código con los detalles de adquisición de datos eliminados.

#include <msp430.h>

unsigned char counter = 0;

int main(void) {
    init();             // Initialize MSP430

    while(1) {
        write_data_to_uart();
    }
}

void init() {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer

    P2SEL0 &= ~(BIT5);           // USCI_A1 UART TX line
    P2SEL1 |=  (BIT5);

    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;

    // Clock System Setup
    // ---------------------------------------------------------------------
    CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
    CSCTL1 = DCOFSEL_4 | DCORSEL;             // Set DCO to 16MHz
    CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;  // Set SMCLK = MCLK = DCO
                                              // ACLK = VLOCLK
    CSCTL3 = DIVA__2 | DIVS__1 | DIVM__2;     // Set all dividers to 1
    CSCTL0_H = 0;                             // Lock CS registers
    // ---------------------------------------------------------------------

    // Configure USCI_A1 for UART mode
    // ---------------------------------------------------------------------
    UCA1CTLW0 = UCSWRST;                       // Put eUSCI in reset
    UCA1CTLW0 |= UCSSEL__SMCLK;                // CLK = SMCLK
    UCA1BR0 = 8;                               // 115200 baud rate
    UCA1BR1 = 0x00;
    UCA1MCTLW |= UCOS16 | UCBRF_10 | 0xF700;
    UCA1CTLW0 &= ~UCSWRST;                     // Initialize eUSCI
}

void write_data_to_uart() {
    char i;
    uart_write_byte(counter);
    counter++;
    for(i = 0; i < 85; i++) {
        uart_write_byte(0x30);
    }
    uart_write_byte(0x0D);                  // Carriage return
    uart_write_byte(0x0A);                  // Line feed
}

void uart_write_byte(char x) {
    while(!(UCA1IFG & UCTXIFG));
    UCA1TXBUF = x;
}

Siento que el problema tiene que ver con una idea errónea de mi parte sobre UART. ¿Hay algún tipo de configuración de temporizador que deba usar para alimentar de manera constante los datos en el búfer de TX?

¿Está utilizando un convertidor de USB a serie? Probablemente se trate de algún tipo de almacenamiento en búfer, tal vez pruebe con uno diferente si puede obtener uno. Supongo que también podría ser el programa terminal, podría valer la pena probar uno diferente.
Vine aquí para decir almacenamiento en búfer en el lado del host, pero @PeterJ ya lo hizo :) ¿Puedes mirar las líneas uart con un osciloscopio o un analizador lógico? Podrías demostrártelo a ti mismo de esa manera.
No sé por qué no pensé en probar eso... ¡ha sido un día largo! Pero parece que hay datos constantes provenientes del microcontrolador; no veo pausas largas. ¡Gracias!
Es posible que deba considerar el control de flujo.

Respuestas (1)

Es posible que lo haya eliminado, pero no veo ningún retraso entre sus llamadas a write_data_to_uart(). ¿Está durmiendo el tiempo suficiente entre sus llamadas?

¿Qué hay en el lado receptor del UART? ¿Un puerto serie real o un convertidor serie USB?

La mejor manera de controlar el ritmo de los datos que salen del uC es escribir sus datos en una ubicación de la memoria, conectarse a una interrupción del temporizador e iniciar una transferencia de DMA usando el DMA de la memoria a UCA1TXBUF. Este método ha causado la menor inestabilidad en el pasado y pude poner uC en un estado de bajo consumo.