Author Topic: UART reading more than 8byte, how?  (Read 2913 times)

0 Members and 1 Guest are viewing this topic.

Offline ulixTopic starter

  • Regular Contributor
  • *
  • Posts: 87
  • Country: de
UART reading more than 8byte, how?
« on: October 19, 2016, 05:08:24 pm »
Hi,

I want to send and read some AT Commands from a ESP8266 Modul with a NXP KL82Z Board.
(I'm using Kinetis Design Studio and the SDK for KL82Z)

Here is some example code, which I'm trying to edit. But I don't get it to read more than 8byte, for example when sending 12345678 it works. But when I get over 8 byte, the additional bytes are lost. I only got it to read it and then get stuck in code.
How could I check if there is additional data?
 
Code: [Select]
#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;



        }
    }
}

/*!
 * @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;
        }
    }
}

Thank you, would be very thankful for any help.


« Last Edit: October 19, 2016, 06:38:04 pm by ulix »
 

Online cv007

  • Frequent Contributor
  • **
  • Posts: 826
Re: UART reading more than 8byte, how?
« Reply #1 on: October 19, 2016, 05:43:02 pm »
A quick look - seems to be wrong
            rxIndex %= DEMO_RING_BUFFER_SIZE;
            if (rxIndex==8)
                rxIndex=0;

(probably forgot to remove those last 2 lines)

« Last Edit: October 19, 2016, 05:47:26 pm by cv007 »
 

Offline rstofer

  • Super Contributor
  • ***
  • Posts: 9890
  • Country: us
Re: UART reading more than 8byte, how?
« Reply #2 on: October 19, 2016, 06:22:06 pm »
You can avoid the modulo arithmetic if your circular buffers have a length that is a binary multiple

#define RING_LENGTH = 32
#define RING_MASK    = RING_LENGTH - 1
ringptr = (ringptr + 1) & RING_MASK;

 

Offline ulixTopic starter

  • Regular Contributor
  • *
  • Posts: 87
  • Country: de
Re: UART reading more than 8byte, how?
« Reply #3 on: October 19, 2016, 06:37:07 pm »
A quick look - seems to be wrong
            rxIndex %= DEMO_RING_BUFFER_SIZE;
            if (rxIndex==8)
                rxIndex=0;

(probably forgot to remove those last 2 lines)

Yes, this was some try....
 

Offline ulixTopic starter

  • Regular Contributor
  • *
  • Posts: 87
  • Country: de
Re: UART reading more than 8byte, how?
« Reply #4 on: October 19, 2016, 08:14:18 pm »
 :-+
thanks rstofer, I got it working! Perfekt, thanks!
 

Offline Bruce Abbott

  • Frequent Contributor
  • **
  • Posts: 627
  • Country: nz
    • Bruce Abbott's R/C Models and Electronics
Re: UART reading more than 8byte, how?
« Reply #5 on: October 21, 2016, 07:42:17 pm »
You can avoid the modulo arithmetic if your circular buffers have a length that is a binary multiple
But why would you when  modulo works in all cases, and generates the same machine code?

source: -
     rxIndex++;
     rxIndex %= RING_BUFFER_SIZE;

disassembly:-
     add r2, r2, #1
     and r2, r7


source:-
#define RING_MASK RING_BUFFER_SIZE-1
     rxIndex = (rxIndex + 1) & RING_MASK;

disassembly:-
    add r2, r2, #1
    and r2, r7
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf