I am using nrf52840 DK and communicate with Raspberry Pi 3 through UART port. The Raspberry Pi is used as a gateway. The baud rate is set at 115200 default on both nrf52840 and Raspberry Pi 3. Raspberry Pi 3 is using GPIO14 and GPIO15 and its UART is set up by following the official guide.
Since this is a direct wired connection from nrf52840 and Raspberry Pi 3, it does not involve the soft device. The SDK version is 17.0.2.
I found that there is rather high data error rate during the UART data transmission. For 300 sets of data transmitted from nrf52840 to Raspberry Pi, there are 13-15 set of data dropping one byte. The dropping byte position is not fixed. This is about 4% error, which is too high?
I am using the standard Nordic UART function following the examples.
The following is the UART init function:
static void uart_init(void)
{
ret_code_t err_code;
app_uart_comm_params_t const comm_params =
{
.rx_pin_no = RX_PIN_NUMBER,
.tx_pin_no = TX_PIN_NUMBER,
.rts_pin_no = RTS_PIN_NUMBER,
.cts_pin_no = CTS_PIN_NUMBER,
.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
.use_parity = false,
.baud_rate = UART_BAUDRATE_BAUDRATE_Baud115200
};
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_event_handle,
APP_IRQ_PRIORITY_LOWEST,
err_code);
APP_ERROR_CHECK(err_code);
}
The following is the sending data function:
static void ble_uart_send(uint8_t * p_data, uint16_t data_len)
{
ret_code_t ret_val;
for (uint32_t i = 0; i < data_len; i++)
{
do
{
ret_val = app_uart_put(p_data[i]);
if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
{
NRF_LOG_INFO("app_uart_put failed for index 0x%04x.", i);
}
} while (ret_val == NRF_ERROR_BUSY);
}
// Add two end bytes to identify the ending of the packet
do
{
ret_val = app_uart_put(0xAA);
if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
{
NRF_LOG_INFO("app_uart_put failed\r\n");
}
} while (ret_val == NRF_ERROR_BUSY);
do
{
ret_val = app_uart_put('\n');
if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
{
NRF_LOG_INFO("app_uart_put failed\r\n");
}
} while (ret_val == NRF_ERROR_BUSY);
}