Hello devzone,
I am using Nordic's NUS(Nordic uart service) example and i changed pin configuration to according to our custom board.
TX_done callback working fine but there is a problem with RX_done callback it is not triggering once in a while
here is a code snippet regarding the problem
static const struct device *uart = DEVICE_DT_GET(DT_NODELABEL(uart0)); static struct k_work_delayable uart_work; K_SEM_DEFINE(nus_write_sem, 0, 1); struct uart_data_t { void *fifo_reserved; uint8_t data[UART_BUF_SIZE]; uint16_t len; }; static void uart_cb(const struct device *dev, struct uart_event *evt, void *user_data) { ARG_UNUSED(dev); static size_t aborted_len; struct uart_data_t *buf; static uint8_t *aborted_buf; static bool disable_req; switch (evt->type) { case UART_TX_DONE: // LOG_DBG("UART_TX_DONE"); // if ((evt->data.tx.len == 0) || // (!evt->data.tx.buf)) { // return; // } // if (aborted_buf) { // buf = CONTAINER_OF(aborted_buf, struct uart_data_t, // data); // aborted_buf = NULL; // aborted_len = 0; // } else { // buf = CONTAINER_OF(evt->data.tx.buf, // struct uart_data_t, // data); // } // k_free(buf); // buf = k_fifo_get(&fifo_uart_tx_data, K_NO_WAIT); // if (!buf) { // return; // } // if (uart_tx(uart, buf->data, buf->len, SYS_FOREVER_MS)) { // LOG_WRN("Failed to send data over UART"); // } break; case UART_RX_RDY: LOG_DBG("UART_RX_RDY"); buf = CONTAINER_OF(evt->data.rx.buf, struct uart_data_t, data); buf->len += evt->data.rx.len; if (disable_req) { return; } // TODO: newly added // if (evt->data.rx.buf[buf->len - 1] == '\n') if ((evt->data.rx.buf[buf->len - 1] == '\n') || (evt->data.rx.buf[buf->len - 1] == '\r')) { disable_req = true; uart_rx_disable(uart); data_from_host = 1; memset(host_data, '\0', sizeof(host_data)); memcpy(host_data, evt->data.rx.buf, (strlen(evt->data.rx.buf) - 2)); } break; case UART_RX_DISABLED: LOG_DBG("UART_RX_DISABLED"); disable_req = false; //TODO:Commenting newly buf = k_malloc(sizeof(*buf)); if (buf) { buf->len = 0; } else { LOG_WRN("Not able to allocate UART receive buffer"); k_work_reschedule(&uart_work, UART_WAIT_FOR_BUF_DELAY); return; } uart_rx_enable(uart, buf->data, sizeof(buf->data), UART_RX_TIMEOUT); break; case UART_RX_BUF_REQUEST: LOG_DBG("UART_RX_BUF_REQUEST"); buf = k_malloc(sizeof(*buf)); if (buf) { buf->len = 0; uart_rx_buf_rsp(uart, buf->data, sizeof(buf->data)); } else { LOG_WRN("Not able to allocate UART receive buffer"); } break; case UART_RX_BUF_RELEASED: LOG_DBG("UART_RX_BUF_RELEASED"); buf = CONTAINER_OF(evt->data.rx_buf.buf, struct uart_data_t, data); if (buf->len > 0) { k_fifo_put(&fifo_uart_rx_data, buf); } else { k_free(buf); } break; case UART_TX_ABORTED: LOG_DBG("UART_TX_ABORTED"); if (!aborted_buf) { aborted_buf = (uint8_t *)evt->data.tx.buf; } aborted_len += evt->data.tx.len; buf = CONTAINER_OF(aborted_buf, struct uart_data_t, data); uart_tx(uart, &buf->data[aborted_len], buf->len - aborted_len, SYS_FOREVER_MS); break; default: break; } } static void uart_work_handler(struct k_work *item) { struct uart_data_t *buf; buf = k_malloc(sizeof(*buf)); if (buf) { buf->len = 0; } else { LOG_WRN("Not able to allocate UART receive buffer"); k_work_reschedule(&uart_work, UART_WAIT_FOR_BUF_DELAY); return; } uart_rx_enable(uart, buf->data, sizeof(buf->data), UART_RX_TIMEOUT); } static int uart_init(void) { int err; struct uart_data_t *rx; if (!device_is_ready(uart)) { LOG_ERR("UART device not ready"); return -ENODEV; } rx = k_malloc(sizeof(*rx)); if (rx) { rx->len = 0; } else { return -ENOMEM; } k_work_init_delayable(&uart_work, uart_work_handler); err = uart_callback_set(uart, uart_cb, NULL); if (err) { return err; } return uart_rx_enable(uart, rx->data, sizeof(rx->data), UART_RX_TIMEOUT); }
and am using NRF connect sdk (v2.3.0)