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
  • 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?

  • Not sure what happened overnight, think it was a case that yesterday one of my wires was loss. Meaning that the problem yesterday wasn't the real problem, sorry about that.

    Also my parity is set to 0 in the code:

    // <o> NRFX_UART_DEFAULT_CONFIG_PARITY  - Parity
     
    // <0=> Excluded 
    // <14=> Included 
    
    #ifndef NRFX_UART_DEFAULT_CONFIG_PARITY
    #define NRFX_UART_DEFAULT_CONFIG_PARITY 0
    #endif
    

    Unfortunately I do not have a datasheet for the sensor as its custom without a document about the setup. However, I do know the terminal putty settings which,  receives the data : baud rate 115200, 8 data bits, 1 stop bit, parity none and flow control works if enabled or not.

  • I hate to say this but, I've wired it up again and now its back in the loop state. (waiting on app_uart_get) again. I am not sure why but the error is go again. I just unwired and rewired it up. I've selected some better leads and its now just holding on the app_uart_get again.

    Any idea how to fix the issue of not reading the uart?

  • Hi,

    Let me know if you have another DK, then I can send you a code snippet that runs on that side that emulates the sensor. This way we can have the exact same setup, and hopefully, that will make it easier to understand what the problem is.

  • Hi Einar, Claire said she would send me one, but I do have another DK its the same type of board.

  • So I got an arduino and output serial data. I only connected TX and RX pins, when I run the app_uart_get line, it does get the data. 

    When I connect my UART peripheral device with 2 connections I get the NRF breakpoint error again. If I disconnect the RX pin then I goes back to looping on the app_uart_get.

Reply Children
  • In my arduino code iam only connecting the pin defined as TX in the code. And i do receive my data in the com port in the arduino code

  • Ok I think I found the route cause.

    In my arduino code if I send a string the nordic board via uart with one pin connected the RX pin it receives that data fine.

    Sending more than 4 characters causes a crash

    Which is an issue as my sensor board sends commas to differentiate the messages.

    If more that 4 ascii characters are sent I get error code: 0X00004001

  • Hi Thomas,

    Odd. There should not be a limit of 4 characters anywhere, and I am not able to reproduce it. I put together two examples that you can use to see how this should work. It is a Tx (uart_tx_with_rtt_logging.zip) and an Rx (uart_rx_with_rtt_logging.zip) example, both for the nRF52840 DK.

    • They use RTT logging, so you don't have to debug. Just run both from SES and observe the output.
    • You can change the length of the string by modifying STRING_LENGTH on line 77 in the Tx example.
    • You can enable flow control by setting the UART_HWFC define in both examples accordingly and hooking up the two extra wires.
    • The example also enables HFXO clock since not using it can cause problems if you have bad luck, and there is a significant difference in clocks between the UART modules. This might be relevant for the sensor as well.

    Photo of setup without flow control, using the pin configuration described previously (RX_PIN_NUMBER=26, TX_PIN_NUMBER=27):

    Please let me know if this works on your side. Then you can try looking at the difference between the Tx module here and your sensor. In what way does the behavior differ?

  • Ok Einar, I'll have a crack at that and get back to you. Thanks for the code and testing.

  • Ok Einar in the TX and RX code example i used your setup and did get the sent and received data correctly. Then I used my sensor and it can receive the data. Well it at least prints to the RTT viewer. So I think that means I can use this data.

    One issue though which, is a separate issue is that I need to use the RX code in the ble folder as I'll need to read the uart data then output it to a bluetooth advert.

    I've got the code to output a ble advert. I just need to merge it with the uart get code you provided. 

    My question is will this code (RX) work if I copy and paste it into my ble_beacon example?

Related