This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Receiving data from UART via a peripheral device

Hi

I am working with a Nordic nrf52840dk using segge and sdk 16.

I am using the nordic UART example in examples/peripheral/uart.

The issue I am having is that my data being sent to this device can not be read from the nordic board.

Below is an example of the code going into my Putty terminal from my UART peripheral device.

1,1183,1,1169
1,1183,1,1169
1,1183,1,1169
1,1183,1,1169
1,1183,1,1169
1,1183,1,1169

This device has 4 wire connections RX,TX,CTS and RTS. My connections are listed below:

Note this is the default.

#define RX_PIN_NUMBER  8
#define TX_PIN_NUMBER  6
#define CTS_PIN_NUMBER 7
#define RTS_PIN_NUMBER 5

The first thing i tried was running the code with no change to see if app_uart_get(&cr) would pull this data. Unfortunately it did not. It does however, pull data that i type into the terminal.

What I want to do is to take this data from the UART(Sensor data) and store it as a variable for handling later on.

I which to know how I can pull this data from the serial connection.

Side note when the device (UART) is plugged in printing from putty does not run. If I unplug the device then printing works fine.  Below is my main code (from example).

int main(void)
{
    uint32_t err_code;

    bsp_board_init(BSP_INIT_LEDS);

    const app_uart_comm_params_t comm_params =
      {
          RX_PIN_NUMBER,
          TX_PIN_NUMBER,
          RTS_PIN_NUMBER,
          CTS_PIN_NUMBER,
          UART_HWFC,
          false,
#if defined (UARTE_PRESENT)
          NRF_UARTE_BAUDRATE_115200
#else
          NRF_UARTE_BAUDRATE_115200
#endif
/*
#if defined (UART_PRESENT)
          NRF_UART_BAUDRATE_115200
#else
          NRF_UARTE_BAUDRATE_115200
#endif
*/
      };

    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,
                         APP_IRQ_PRIORITY_HIGH,
                         //APP_IRQ_PRIORITY_LOWEST,
                         err_code);

    APP_ERROR_CHECK(err_code);

#ifndef ENABLE_LOOPBACK_TEST
    printf("\r\nUART example started.\r\n");

    while (true)
    {
        uint8_t cr;
        while (app_uart_get(&cr) != NRF_SUCCESS);
        while (app_uart_put(cr) != NRF_SUCCESS);

        if (cr == 'q' || cr == 'Q')
        {
            printf(" \r\nExit!\r\n");

            while (true)
            {
                // Do nothing.
            }
        }
    }
#else

    // This part of the example is just for testing the loopback .
    while (true)
    {
        uart_loopback_test();
    }
#endif
}

Parents Reply Children
  • Good question. I assume the baud rate at flow-control configuration is correct for your device?

    Essentially the example you are using is very simple, so it will make a 256 byte buffer, and put received UART data there. Then you pull single byts by calling app_uart_get(). That will return NRF_SUCCESS if there is data, and an error if not (typically NRF_ERROR_NOT_FOUND when there is no data in the buffer). So as long as the device sends data, you should not be stuck in this loop witing for data. Does the UART device always send data, or do you need to do something for it to send? If it always sends data regularly, then you should get some. What exact device is the other UART device?

    One potential issue is if you never do anything later in the application. Do you use the data for anything? If not, the compiler may just discard it during compilation. It should not stick in the loop though, but it might be that it just looks like this if you are debugging a release build? Please make sure to debug with debug builds (without optimization) if you are not already doing so. If you use SES, just select "Debug" instead of "Release" in the build configuration drop-down menu.

  • Note I have been able to receive the data from putty when directly write to the specified pins in my before setup. This printed the data once per second to the terminal at a baud rate of 115200. I have tried in segger with flow-control on and off. The date prints without CTS and RTS connected.

    • The baud rate is the same as the peripheral device
    • The debugger never seems to execute the app_uart_get line therefore, I cant see the error code
    • The UART peripheral does not need a send command, just sends once per second
    • The other UART device is a custom UART device which, I do not know all the technical details of unfortunately

    In regard to no later application code what should I put if the device optimises not to do anything.

    • At the moment I am just looking at the value within the debugger
    • How do I debug without optimisation? 
    • I have just been selecting debug within the toolbar
  • Hi Thomas,

    I see. So the data should be sent. Do you use SES, or another IDE? If you use SES, you can select the debug build configuration from the dropdown before building and debugging. See here:

  • Yes I am using SES. I have tried changing the debugger but, it still did not solve the issue.

  • So I have gotten my hands on a logic analyser and this is what I am sending to the UART pins

    And this is  the Ascii Data as well:

    What do you think I should check next to resolve the issue?

Related