Hello, iam using MCXA153 board , how can i read 20byte of data and how much byte i read in this?
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pin_mux.h"
#include "board.h"
#include "fsl_lpuart.h"
#include "fsl_clock.h"
#include "fsl_reset.h"
#include <stdbool.h>
#include <stdio.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define DEMO_LPUART LPUART0
#define DEMO_LPUART_CLK_FREQ (BOARD_DEBUG_UART_CLK_FREQ)
#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;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
/* 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 (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)
{
demoRingBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= DEMO_RING_BUFFER_SIZE;
printf("Received: %x\n", data);
}
}
SDK_ISR_EXIT_BARRIER;
}
/*!
* @brief Main function
*/
int main(void)
{
lpuart_config_t config;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
/*
* 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, DEMO_LPUART_CLK_FREQ);
/* 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))
{
tmprxIndex = rxIndex;
tmptxIndex = txIndex;
if (tmprxIndex != tmptxIndex)
{
LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);
txIndex++;
txIndex %= DEMO_RING_BUFFER_SIZE;
}
}
}
}
Hello @syedhashmiraza
Please use the accurate demo "Lpuart_interrupt" without any modification. If there is still a problem, please record a video demonstrating all your steps. Thanks.
BR
Alice
hello, when iam using printf they recieved only 5 byte my question is using printf i want to read 20 byte
hello , i take 115200 baud rate in this buad rate printing only 4 byte when i change my baud rate to 300 its printing 20 byte value but my question is i want to read and print 20 byte value using 115200 baud rate and this is my code
#include "pin_mux.h"
#include "board.h"
#include "fsl_lpuart.h"
#include "fsl_clock.h"
#include "fsl_reset.h"
#include <stdbool.h>
#include <stdio.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define DEMO_LPUART LPUART0
#define DEMO_LPUART_CLK_FREQ (BOARD_DEBUG_UART_CLK_FREQ)
#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;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
/* 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 (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)
{
demoRingBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= DEMO_RING_BUFFER_SIZE;
printf("Received: %x\n", data);
}
}
SDK_ISR_EXIT_BARRIER;
}
/*!
* @brief Main function
*/
int main(void)
{
lpuart_config_t config;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
/*
* 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, DEMO_LPUART_CLK_FREQ);
/* 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))
{
tmprxIndex = rxIndex;
tmptxIndex = txIndex;
if (tmprxIndex != tmptxIndex)
{
LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);
txIndex++;
txIndex %= DEMO_RING_BUFFER_SIZE;
}
}
}
}
Hello @syedhashmiraza
I still recommend that you use the UART SDK demo. If you still prefer to use your own code, please attach the entire project, which should be directly run on the MCUXpresso IDE. I will help you check it. Thank you.
BR
Alice
hello iam working on mcxa153 mcu and in this iam reciving only 4 byte but i want to read 15 byte of data this is my code
hello iam working on mcxa153 mcu and in this iam reciving only 4 byte but i want to read 15 byte of data this is my code
Hello @syedhashmiraza
Sorry, I can not run your code on my side successfully, because it lacks the definition of some functions. And again, the SDK demo of " Lpuart_interrupt " can completely achieve the function of reading 15 bytes. Could you please test it first? You can find this demo under path:
"SDK_2_16_100_FRDM-MCXA153.zip\boards\frdmmcxa153\driver_examples\lpuart\interrupt"
Best Regards,
Alice
Hello @syedhashmiraza
Recommend you first refer to the lpuart demos under SDK. Then based on the demo to development. You can receive as many as you want. Just call receive API more times.
BR
Alice
hello i tried this one but still iam reciving 5 bytes my question is i ant to read more than 20 bytes off data
Hello @syedhashmiraza
I have tested this demo on my side, it can received any number of bytes.
In this example, one lpuart instance connect to PC, the board will send back all characters that PC send to the board. So you just need send 20 bytes on PC, then it can received them and send back to PC. I tested with 20 bytes, result as below:
BR
Alice
hello can you send a code?
Hello @syedhashmiraza
Sorry could you please describe your requirements detail.
Do you want me send characters not number to test? If yes, I tested on my side. It also can work well. As below.
BR
Alice
hello, when iam using printf they recieved only 5 byte my question is using printf i want to read 20 byte
yes, but when i print i recivecd only 5 bytes
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pin_mux.h"
#include "board.h"
#include "fsl_lpuart.h"
#include "fsl_clock.h"
#include "fsl_reset.h"
#include <stdbool.h>
#include <stdio.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define DEMO_LPUART LPUART0
#define DEMO_LPUART_CLK_FREQ (BOARD_DEBUG_UART_CLK_FREQ)
#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;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
/* 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 (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)
{
demoRingBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= DEMO_RING_BUFFER_SIZE;
printf("Received: %x\n", data);
}
}
SDK_ISR_EXIT_BARRIER;
}
/*!
* @brief Main function
*/
int main(void)
{
lpuart_config_t config;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
/*
* 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, DEMO_LPUART_CLK_FREQ);
/* 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))
{
tmprxIndex = rxIndex;
tmptxIndex = txIndex;
if (tmprxIndex != tmptxIndex)
{
LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);
txIndex++;
txIndex %= DEMO_RING_BUFFER_SIZE;
}
}
}
}