SDK Exemple UART Interrupt, how to read more than 8 byte?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SDK Exemple UART Interrupt, how to read more than 8 byte?

1,149 Views
us1
Contributor III

Hi,

I need to read more than 8byte with the SDK Interrupt UART Example, how can I do this?

When I send for example 123456789 I only get back 12345678. How can I edit the code to read after 12345678 the 9?

/* Copyright (c) 2015, Freescale Semiconductor, Inc.

 

#include "board.h"
#include "fsl_lpuart.h"

 

#include "pin_mux.h"
#include "clock_config.h"
/*******************************************************************************
 * Definitions
 ******************************************************************************/
#define DEMO_LPUART LPUART0
#define DEMO_LPUART_CLKSRC kCLOCK_PllFllSelClk
#define DEMO_LPUART_IRQn LPUART0_IRQn
#define DEMO_LPUART_IRQHandler LPUART0_IRQHandler

 

/*! @brief Ring buffer size (Unit: Byte). */
#define DEMO_RING_BUFFER_SIZE 16

 

/*! @brief Ring buffer to save received data. */

 

/*******************************************************************************
 * Prototypes
 ******************************************************************************/

 

/*******************************************************************************
 * Variables
 ******************************************************************************/

 

uint8_t g_tipString[] =
    "Lpuart functional API interrupt example\r\nBoard receives characters then sends them out\r\nNow please input:\r\n";

 

/*
  Ring buffer for data input and output, in this example, input data are saved
  to ring buffer in IRQ handler. The main function polls the ring buffer status,
  if there are new data, then send them out.
  Ring buffer full: (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) == txIndex)
  Ring buffer empty: (rxIndex == txIndex)
*/
uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];
volatile uint16_t txIndex; /* Index of the data to send out. */
volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */

 

/*******************************************************************************
 * Code
 ******************************************************************************/

 

void DEMO_LPUART_IRQHandler(void)
{
    uint8_t data;

 

    /* If new data arrived. */
    if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))
    {
        data = LPUART_ReadByte(DEMO_LPUART);

 

        /* If ring buffer is not full, add data to ring buffer. */
        if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex)
        {
            demoRingBuffer[rxIndex] = data;
            rxIndex++;
            rxIndex %= DEMO_RING_BUFFER_SIZE;
            if (rxIndex==8)
                rxIndex=0;

 


        }
    }
}

 

/*!
 * @brief Main function
 */
int main(void)
{
    lpuart_config_t config;

 

    BOARD_InitPins();
    BOARD_BootClockRUN();
    CLOCK_SetLpuartClock(1U);

 

    /*
     * config.baudRate_Bps = 115200U;
     * config.parityMode = kLPUART_ParityDisabled;
     * config.stopBitCount = kLPUART_OneStopBit;
     * config.txFifoWatermark = 0;
     * config.rxFifoWatermark = 0;
     * config.enableTx = false;
     * config.enableRx = false;
     */
    LPUART_GetDefaultConfig(&config);
    config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
    config.enableTx = true;
    config.enableRx = true;

 

    LPUART_Init(DEMO_LPUART, &config, CLOCK_GetFreq(DEMO_LPUART_CLKSRC));

 

    /* Send g_tipString out. */
    LPUART_WriteBlocking(DEMO_LPUART, g_tipString, sizeof(g_tipString) / sizeof(g_tipString[0]));

 

    /* Enable RX interrupt. */
    LPUART_EnableInterrupts(DEMO_LPUART, kLPUART_RxDataRegFullInterruptEnable);
    EnableIRQ(DEMO_LPUART_IRQn);

 

    while (1)
    {
        /* Send data only when LPUART TX register is empty and ring buffer has data to send out. */
        while ((kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(DEMO_LPUART)) && (rxIndex != txIndex))
        {
            LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);
            txIndex++;
            txIndex %= DEMO_RING_BUFFER_SIZE;
        }
    }
}

Labels (1)
0 Kudos
1 Reply

595 Views
Jonathan_Iglesias
NXP TechSupport
NXP TechSupport

Hello Ulrich Steinlehn,

In the void DEMO_LPUART_IRQHandler(void) function check the condition 

rxIndex %= DEMO_RING_BUFFER_SIZE;
            if (rxIndex==8)
               rxIndex=0;

you can modify the condition for your needs, but always thinking in the capacity of your MCU.

hope this is helpful 

have a great day.

Best Regards.

Jonathan.

0 Kudos