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 }
H Einar,
For some reason today when I run it I get an error NRF_BREAKPOINT_COND.
The following comment is the system can only recover with a reset.
I've tried checked the wiring of the device today and…
Yes, that is correct. If you test the debug build you should see a sensible message in the log, and if there is problems with the logging you can inspect the info struct yourself. I think you will find…
Hi Thomas,
I am happy to hear that it works
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?
Ok I've merged them and get a fatal error. Here is my RTT+ beacon code(main) This works when i remove the line advertising_mod:
int main(void) { uint32_t err_code; char string[MAX_TEST_DATA_BYTES]; char c; int pos; T1_data_1 = 0;T1_data_2 = 0;T2_data_1 = 0;T2_data_2 = 0;T3_data_1 = 0; T3_data_2 = 0;P1_data_1 = 0;P1_data_2 = 0;P2_data_1 = 0;P2_data_2 = 0; // Initialize. timers_init(); leds_init(); power_management_init(); ble_stack_init(); advertising_init(); //hfxo_enable(); log_init(); NRF_LOG_INFO("UART example started."); 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 (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_LOWEST, err_code); APP_ERROR_CHECK(err_code); pos = 0; //UART get code RTT RX code while (true) { // Get next gyte from FIFO while (app_uart_get(&c) != NRF_SUCCESS); string[pos] = c; // Assume that all strings end with \n. If end, print and start over. if (string[pos] == '\n') { string[pos+1] = '\0'; NRF_LOG_INFO("Received string: \"%s\"", string); pos = 0; } else { pos++; } //nrf_delay_ms(1000);//Delay 1 second counter++; idle_state_handle(); data_changed = true; if(data_changed==true) { advertising_mod(counter,T1_data_1,T1_data_2,T2_data_1,T2_data_2,00,00,70,80,70,80);//Only have two temperature sensors data_changed = false; } } }
Here is my other beacon code. This outputs a ble_advert and increments a counter. This can be seen using nrf connect.
int main(void) { bool erase_bonds; T1_data_1 = 0;T1_data_2 = 0;T2_data_1 = 0;T2_data_2 = 0;T3_data_1 = 0; T3_data_2 = 0;P1_data_1 = 0;P1_data_2 = 0;P2_data_1 = 0;P2_data_2 = 0; // Initialize. uart_init(); log_init(); timers_init(); buttons_leds_init(&erase_bonds); power_management_init(); ble_stack_init(); gap_params_init(); gatt_init(); services_init(); advertising_init(); conn_params_init(); bsp_board_led_invert(2); // Start execution. //printf("\r\nUART started.\r\n"); NRF_LOG_INFO("Debug logging for UART over RTT started."); advertising_start(); advertising_mod(counter,00,00,00,00,00,00,70,80,70,80);//Only have two temperature sensors // Enter main loop. for (;;) { nrf_delay_ms(1000); //printf("Test\n\r");//Works if the uart board is disconnected //printf("Test");//Works if the uart board is disconnecte counter ++; idle_state_handle(); data_changed = true; if(data_changed==true) { printf("data changed value is: %d\r\n",data_changed); advertising_mod(counter,T1_data_1,T1_data_2,T2_data_1,T2_data_2,00,00,70,80,70,80);//Only have two temperature sensors data_changed = false; printf("data changed value is: %d\r\n",data_changed); } } }
I need to figure a way to merge them and have them both run.
I see. Generally, you need to debug and see what the fatal error is. If you enable debug builds (Select Debug instead of release from the build target configuration dropdown) and have RTT logging enabled, you will get the error code and location printed in the log. Most of the times this will imediately tell you what the problem is.
I get NRF_FAULT_ID_SDK_ERROR 0x0000000000004001.
This comes from NRF_DRV_UART_EVT_TX_DONE: within the app_uart_fifo.c.
When it runs the m_event_handler
This runs from the line of code:
err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len); APP_ERROR_CHECK(err_code);
FIXED IT
I forgot to start the add before moding it.
I do have another issue. After a short while I do get Fatal error. Was after 27 seconds of reading fine. Any idea what could cause this? Or how to implement a restart feature
It runs from
err_code = sd_ble_gap_adv_stop(m_adv_handle); APP_ERROR_CHECK(err_code);
and sometimes from :
err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK(err_code);
Both of which are within my ad mod code.
What was the error code? That usually tells you what the problem was.
0x0000000000004001.
Also how does it tell me what the error is? I don't have an error code lookup table.
#define NRF_FAULT_ID_SDK_ERROR (NRF_FAULT_ID_SDK_RANGE_START + 1) /**< An error stemming from a call to @ref APP_ERROR_CHECK or @ref APP_ERROR_CHECK_BOOL. The info parameter is a pointer to an @ref error_info_t variable. */
Yes, that is correct. If you test the debug build you should see a sensible message in the log, and if there is problems with the logging you can inspect the info struct yourself. I think you will find An introduction to error handling in nRF5 projects useful.