This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

NCS uart can't to receive data continuously

Hello,

NCS1.9.1,  VSCode,  nRF52840,

from link UART Driver – Nordic Developer Academy (nordicsemi.com)

uart can't to receive data continuously,

receiving evt->data.rx.offset will Increasing,

when rx_buf[128]  is exhausted, will got evt  

UART_RX_BUF_RELEASED
UART_RX_DISABLED
it will lost data,even call uart_rx_enable(dev, rx_buf, sizeof(rx_buf), 1000); again
  
is it a bug or missing some step?

#include <zephyr.h>
#include <device.h>
#include <drivers/gpio.h>
#include <sys/util.h>
#include <sys/printk.h>
#include <inttypes.h>
#include "uart.h"
#include "stdlib.h"
#include <drivers/uart.h>

const struct device *uart=NULL;
static uint8_t rx_buf[128] = {0}; //A buffer to store incoming UART data
static uint8_t tx_buf[] =  {"uart started\n\r"};
static uint8_t tem_show_buf[128] =  {0};

const struct uart_config uart_cfg = {
		.baudrate = 115200,
		.parity = UART_CFG_PARITY_NONE,
		.stop_bits = UART_CFG_STOP_BITS_1,
		.data_bits = UART_CFG_DATA_BITS_8,
		.flow_ctrl = UART_CFG_FLOW_CTRL_NONE
	};

static void uart_cb(const struct device *dev, struct uart_event *evt, void *user_data)
{
	switch (evt->type) {
		case UART_TX_DONE:
			printk("Tx sent %d bytesn\n", evt->data.tx.len);
		break;
		case UART_TX_ABORTED:
			printk("Tx aborted\n");
		break;
		case UART_RX_RDY:
		{
			int l=evt->data.rx.len;
			memcpy(tem_show_buf,evt->data.rx.buf+evt->data.rx.offset,l);tem_show_buf[l]=0;
			printk("Received data:[%d]%s   len:%d bytes\n", evt->data.rx.offset,tem_show_buf,l);
		}break;
		case UART_RX_BUF_REQUEST:
			// uint8_t *buf;
			// err = k_mem_slab_alloc(&uart_slab, (void **)&buf, K_NO_WAIT);
			// __ASSERT(err == 0, "Failed to allocate slab");

			// err = uart_rx_buf_rsp(uart, buf, BUF_SIZE);
			// __ASSERT(err == 0, "Failed to provide new buffer");
			printk("UART_RX_BUF_REQUEST\n");
		break;
		case UART_RX_BUF_RELEASED:
			// k_mem_slab_free(&uart_slab, (void **)&evt->data.rx_buf.buf);
			printk("UART_RX_BUF_RELEASED\n");
		break;
		case UART_RX_DISABLED:
			uart_rx_enable(dev, rx_buf, sizeof(rx_buf), 1000);
			printk("UART_RX_DISABLED\n");
		break;
		case UART_RX_STOPPED:
			printk("UART_RX_STOPPED\n");
		break;
		default:
		break;
	}
}

int uart_init()
{
	uart= device_get_binding(DT_LABEL(DT_NODELABEL(uart0)));
	if (uart == NULL) {
		printk("Could not find  %s!\n\r", DT_LABEL(DT_NODELABEL(uart0)));
		return;
	}

	int err = uart_configure(uart, &uart_cfg);
	if (err == -ENOSYS) {
		return -ENOSYS;
	}
	err = uart_callback_set(uart, uart_cb, NULL);
	if (err) {
		return err;
	}

	uart_rx_enable(uart ,rx_buf,sizeof rx_buf,1000);	

	return 0;
}

   

Best regards

  • Hi Dear

    You should not change example code so hard!

    		case UART_RX_BUF_REQUEST:
    			// uint8_t *buf;
    			// err = k_mem_slab_alloc(&uart_slab, (void **)&buf, K_NO_WAIT);
    			// __ASSERT(err == 0, "Failed to allocate slab");
    
    			// err = uart_rx_buf_rsp(uart, buf, BUF_SIZE);
    			// __ASSERT(err == 0, "Failed to provide new buffer");
    			printk("UART_RX_BUF_REQUEST\n");
    		break;
    		case UART_RX_BUF_RELEASED:
    			// k_mem_slab_free(&uart_slab, (void **)&evt->data.rx_buf.buf);
    			printk("UART_RX_BUF_RELEASED\n");

    This is crime!:))))

    Please use this sample

    v1.9.1\nrf\samples\peripheral\lpuart\

  • Hi,

    thanks,i didn't expect your reply to be so fast.

    from lpuart correct

      

    Best regards

Related