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
}

  • Hi,

    It is not entirely clear to me, but the serial terminal on the PC is via the onboard debugger, right (USB connector on the left of the board)? If you are using that (or have the debugger enabled in general so that IF OFF is not asserted, then you should use different pins for the external UART device. In other words, connect the UART pins between the nRF and another device to some available GPIO pins, and update the pin number defines.

  • Thanks for your response, I am using the onboard usb connector (the one in the top-middle of the board). This is where my putty serial terminal connects to. Jlink CDC UART PORT(COM5)

    I have tried redefining the pinouts to:

    #define RX_PIN_NUMBER  NRF_GPIO_PIN_MAP(0,3)//8
    #define TX_PIN_NUMBER  NRF_GPIO_PIN_MAP(0,28)//6
    #define CTS_PIN_NUMBER NRF_GPIO_PIN_MAP(0,4)//7
    #define RTS_PIN_NUMBER NRF_GPIO_PIN_MAP(0,29)//5

    I have then connected my device to those pinout.

    However, I now no longer see that information (from the uart device) to putty, nor can I use a printf command and see the result.

    When I  run this through the dubugger after running the APP_UART_FIFO_INIT and checking the error code it goes to NRF_BREAKPOINT_COND;

    I then get this in the call stack area of the debugger.

    What other details do you need to help resolve this issue?

  • Hi Thomas,

    I want to start by checking if my understanding is correct. You use UART for two things:

    • Command-line / logging interface with a PC
    • Communicating with an external device

    Do you have these enabled at the same time? If so, you need to use two UART peripherals and configure a separate set of pins etc. for both. If this is not the case, then please explain in a bit more detail what you are doing (perhaps with a drawing?)

  • Hi Einar,

    I am using both command line with a PC and communicating with an external device. 

    However, I only want to receive data from the external UART device and do not need command line logging as well.

    I have a single UART peripheral device that I want to connect to the NRF52840 device and, I want to read its data as shown above.

    But the device outputs data straight to the putty terminal and, I can't find a way to read it.

    Then I decided to print to the terminal using the Nordic board. I can see a response from data i type in but, not from the UART board.

    Below is an image of my setup:

    Thanks

  • Hi Thomas,

    The thing here is that you are connecting the sensor to the same pins that the nRF uses for UART with the PC. And this is why you see the data on the UART terminal on your PC. This is probably not what you want to do.

    You write that you "do not need command-line logging as well", and in that case, you should just disable the logging module in sdk_config.h. But your drawing shows that you use it with a terminal, so I am not sure?

    In any case, the point is that you should not use pin 5-8 for the UART connection with your sensor since that is connected to the debugger (which acts as a UART-USB bridge here). Use some other available pins, and configure the UART driver appropriately.

    If you do want to communicate with both the sensor and a UART terminal via USB (as the drawing shows), then you need to use two UART peripherals. That is no problem since the nRF52840 has two UART peripherals. Alternatively, you can use RTT for logging (if needed), and just use UART for communicating with the sensor. This is probably the simplest, since you can just take a UART example and change the pins, and you are ready.

Related