nRF52840 UART TX in Interrupt mode

Hello. I have been further exploring nRF52 UART and got a bit stuck when trying to transmit some data using interrupt mode. I have been reading the Zephyr documentation about the UART Interrupt mode: 
developer.nordicsemi.com/.../uart.html

and exploring the devzone forum for some relevant information. The only relevant post I have managed to find is the following:

devzone.nordicsemi.com/.../issue-using-interrupt-driven-uart-callback-in-nrfconnect-to-transmit-data

I believe it put me on the right track but I still have some questions. I am working on nRF52840DK nrf52840 board.

Full source code:

/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/kernel.h>
#include "stdio.h"
#include "zephyr/drivers/uart.h"
#define LOG_LEVEL 4
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(nrf52_learning);

static const struct device *dev_uart1;

static void app_uart1_init();
static void uart1_irq_receive_handler(const struct device *dev, void *context);
static void uart1_irq_transmit_handler(const struct device *dev, void *context);

static K_SEM_DEFINE(tx_sem, 0, 1); // Semaphore to signal UART data transmitted

static uint8_t *tx_data;
static size_t tx_data_length;

#define RX_BUF_SIZE 64

// Initialize UART1
static void app_uart1_init()
{
	dev_uart1 = DEVICE_DT_GET(DT_NODELABEL(uart1));
	if (!device_is_ready(dev_uart1))
	{
		printk("UART1 is not ready \n");
		return;
	}
	uart_irq_callback_set(dev_uart1, uart1_irq_receive_handler);
	uart_irq_rx_enable(dev_uart1);
}

static void uart1_irq_receive_handler(const struct device *dev, void *context)
{
	uint8_t char_received;
	static uint8_t command_line[RX_BUF_SIZE];
	static int char_counter = 0;

	if (uart_irq_rx_ready(dev))
	{
		int len = uart_fifo_read(dev, &char_received, 1);
		if (len)
		{
			command_line[char_counter] = char_received;
			char_counter++;
			if (char_received == '\n' || char_received == '\r')
			{
				command_line[char_counter] = '\0'; // put null at the end of the string to indicate end of message or end of string
				char_counter = 0;				   // reset the char counter
				printk("UART1 Received = %s \n", command_line);
				memset(&command_line, 0, sizeof(command_line));
			}
		}
	}
}

static void uart1_irq_transmit_handler(const struct device *dev, void *user_data)
{
	ARG_UNUSED(user_data);
	static int tx_data_idx;
	if (!uart_irq_update(dev))
	{
		LOG_ERR("Couldn't update IRQ\n");
		return;
	}
	// METHOD2
	if (uart_irq_tx_ready(dev) && tx_data_idx < tx_data_length)
	{
		LOG_INF("Transmitting data over UART1\n");
		LOG_INF("tx_data_length = %u \n", tx_data_length);
		LOG_INF("tx_data_idx = %u \n", tx_data_idx);
		int tx_send = MIN(CONFIG_UART_1_NRF_TX_BUFFER_SIZE, tx_data_length - tx_data_idx);
		int tx_sent = uart_fifo_fill(dev, (uint8_t *)&tx_data[tx_data_idx], tx_send);
		if (tx_sent <= 0)
		{
			LOG_ERR("Error %d sending data over UART1 bus\n", tx_sent);
			return;
		}

		tx_data_idx += tx_sent;
		if (tx_data_idx == tx_data_length)
		{
			uart_irq_tx_disable(dev);
			tx_data_idx = 0;
			k_sem_give(&tx_sem);
		}
	}
}

int uart_irq_tx(const struct device *dev, const uint8_t *buf, size_t len)
{
	tx_data = buf;
	tx_data_length = len;
	uart_irq_callback_set(dev, uart1_irq_transmit_handler);
	uart_irq_tx_enable(dev);
	k_sem_take(&tx_sem, K_FOREVER);
	return len;
}

int main(void)
{
	app_uart1_init();
	while (1)
	{
		k_msleep(1000);
		uart_irq_tx(dev_uart1, "Hello from UART1\n", 17);
	}
}

prj.conf:

# nothing here
CONFIG_GPIO=y
CONFIG_SERIAL=y

CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_NRFX_UARTE1=y
CONFIG_UART_1_INTERRUPT_DRIVEN=y

CONFIG_LOG=y
CONFIG_LOG_MODE_IMMEDIATE=y


And in my nrf52840dk_nrf52840.overlay I have uart1 status changed to "okay": 

arduino_serial: &uart1 {
	status = "okay";
};

My questions:

Question1:

In my uart1_irq_transmit_handler I have the following logic:

static void uart1_irq_transmit_handler(const struct device *dev, void *user_data)
{
	ARG_UNUSED(user_data);
	static int tx_data_idx;
	if (!uart_irq_update(dev))
	{
		LOG_ERR("Couldn't update IRQ\n");
		return;
	}
	// METHOD2
	if (uart_irq_tx_ready(dev) && tx_data_idx < tx_data_length)
	{
		LOG_INF("Transmitting data over UART1\n");
		LOG_INF("tx_data_length = %u \n", tx_data_length);
		LOG_INF("tx_data_idx = %u \n", tx_data_idx);
		int tx_send = MIN(CONFIG_UART_1_NRF_TX_BUFFER_SIZE, tx_data_length - tx_data_idx);
		int tx_sent = uart_fifo_fill(dev, (uint8_t *)&tx_data[tx_data_idx], tx_send);
		if (tx_sent <= 0)
		{
			LOG_ERR("Error %d sending data over UART1 bus\n", tx_sent);
			return;
		}

		tx_data_idx += tx_sent;
		if (tx_data_idx == tx_data_length)
		{
			uart_irq_tx_disable(dev);
			tx_data_idx = 0;
			k_sem_give(&tx_sem);
		}
	}
}

This code has been copied from the other relevant post I have found on the devzone forum. I am not fully understanding what is the purpose of tx_data_idx and tx_send? It seems to be quite complex and unnecessary. Additionally, I do not understand why check for transmission complete using the following condition:

		tx_data_idx += tx_sent;
		if (tx_data_idx == tx_data_length){
		...
		...
		...

Under which conditions tx_data_idx would not be equal to tx_data_length?

I have tried to simplify this function and came up with something like that:

static void uart1_irq_transmit_handler(const struct device *dev, void *user_data)
{
	ARG_UNUSED(user_data);
	static int tx_data_idx;
	if (!uart_irq_update(dev))
	{
		LOG_ERR("Couldn't update IRQ\n");
		return;
	}

	// METHOD1

	if (uart_irq_tx_ready(dev))
	{
		int tx_sent = uart_fifo_fill(dev, (uint8_t *)tx_data, tx_data_length);

		if (tx_sent <= 0)
		{
			LOG_ERR("Error %d sending data over UART1 bus\n", tx_sent);
			return;
		}

		while (uart_irq_tx_complete(dev) != 1)
		{
			LOG_INF("Wait for UART1 data transmition complete\n");
		}
		LOG_INF("UART1 data transmitted\n");
		uart_irq_tx_disable(dev);
		k_sem_give(&tx_sem);
	}
}

As you can see from the function above, I am not using tx_data_idx or tx_send, and I am detecting whether the transition is complete using the following condition:

		while (uart_irq_tx_complete(dev) != 1)
		{
			LOG_INF("Wait for UART1 data transmition complete\n");
		}
		LOG_INF("UART1 data transmitted\n");
		uart_irq_tx_disable(dev);
		k_sem_give(&tx_sem);

Although I am not sure if that makes sense. If there is a problem with the transmission, it will just get stuck in infinite while loop so that is probably not the most appropriate method to detect end of transmission.

 

Anyways, I have flashed the board (I have tried both methods mentioned above) and both seem to work fine from the first glance. I have connected Saleae logic analyzer to monitor RX/TX pins and I can see that there is data being sent every 1 second which is what I expected to see:

Question2:

Apart from the uart1_irq_transmit_handler, I also have the receive handler uart1_irq_receive_handler which I was hoping to use for data reception. So one handler is used for data transmission and the other one for the data reception.

However, that does not seem to work. In order to try data reception, I have simply shorted RX/TX pins, so whatever is being sent will be received. After shorting those 2 pins, I can see on the Logic analyzer that the data has been sent/received once:

But after that, it feels like UART1 transmit no longer works. It does not even transmit any data even when I disconnect RX/TX pins from each other. In order to fix this, I need to reboot the device and then the transmission works again until I short it. What could be wrong ?

 

Parents
  • Hi Lukas,

    Vidar does not remember specifics of the case that you linked in your initial question. And I do not know the context of those threads. I cannot answer specifically why those code snippets have that logic when it comes from outside Nordic solutions. I was hoping that Vidar who was looking at the other thread have some context but he does not.

    Where did you get this code snippet from? Can't you ask these questions in that same post as this is relevant to those threads?

  • Hi Lukas,

    I tried your code snippet with some changes.  I also do not know what is the use of tx_data_idx.The code does not look very optimal. This does not seem to be production quality. Unfortunately we do not seem to have any dedicated sample that is using the peripheral in interrupt mode apart from what is being used with other features like ble_hci_uart.Most of them are using UART0 as the interrupt driven port and they seems to be working. I have not tested changing them to use uart1 port instead of uart0.

    There is some issue in the code and shorting the TX/RX pin like you said break the flow like you mentioned. 

    I need to find more time to test this as the code you mentioned is not official from us (hence I cannot create any internal ticket to allocate time immediately)

  • Thanks for looking at this.

    I would suggest you try this project. This is the project that I work on and thats where I posted the code snippets from
    https://github.com/krupis/nrf52_learning/tree/uart0_uart1_interrupt

    You can easily flash this to nRF52540DK to check UART0 and UART1 yourself and it will become clear to you what is the problem that I am trying to solve.

    What I want to achieve is very simple:

    I want to get the UART1 and UART0 working properly (receive and transmit) in interrupt mode. 

    UART0 I use for logging and sending custom commands the device

    UART1 I plan to connect to an external device and I need to be able to receive/transmit various length messages but as I shown above currently I cannot get the transmit/receive to work properly on UART1 :)

    For some reason, I am convinced that the issue lies within incorrect implementation of uart1_irq_transmit_handler becuase I could not find any proper sample projects where it has been shown how to correctly transmit data over the UART in interrupt mode.

  • Hello. I have made some progress regarding this. I have made some changes in the code and uploaded latest code to the project in the github repository I have linked previously.

    The full code:

    /*
     * Copyright (c) 2012-2014 Wind River Systems, Inc.
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    #include <zephyr/kernel.h>
    #include "stdio.h"
    #include "zephyr/drivers/uart.h"
    #define LOG_LEVEL 4
    #include <zephyr/logging/log.h>
    LOG_MODULE_REGISTER(nrf52_learning);
    
    static const struct device *dev_uart0;
    static const struct device *dev_uart1;
    
    static void app_uart0_init();
    static void uart0_irq_handler(const struct device *dev, void *context);
    
    static void app_uart1_init();
    static void uart1_irq_handler(const struct device *dev, void *context);
    
    static K_SEM_DEFINE(tx_sem, 0, 1); // Semaphore to signal UART data transmitted
    
    static uint8_t *tx_data;
    static size_t tx_data_length;
    
    #define RX_BUF_SIZE 64
    
    static void app_uart0_init()
    {
    	dev_uart0 = DEVICE_DT_GET(DT_NODELABEL(uart0));
    	if (!device_is_ready(dev_uart0))
    	{
    		return;
    	}
    
    	uart_irq_callback_set(dev_uart0, uart0_irq_handler);
    	uart_irq_rx_enable(dev_uart0);
    }
    
    static void uart0_irq_handler(const struct device *dev, void *context)
    {
    	uint8_t char_received;
    	static uint8_t command_line[RX_BUF_SIZE];
    	static int char_counter = 0;
    
    	while (uart_irq_update(dev) && uart_irq_is_pending(dev))
    	{
    		if (uart_irq_rx_ready(dev))
    		{
    			int len = uart_fifo_read(dev, &char_received, 1);
    			if (len)
    			{
    				command_line[char_counter] = char_received;
    				char_counter++;
    				if (char_received == '\n' || char_received == '\r')
    				{
    					command_line[char_counter] = '\0'; // put null at the end of the string to indicate end of message or end of string			   // reset the char counter
    					LOG_INF("UART0_RX(%u): %s \n", char_counter, command_line);
    					char_counter = 0;
    					memset(&command_line, 0, sizeof(command_line));
    				}
    			}
    		}
    	}
    }
    
    // Initialize UART1
    static void app_uart1_init()
    {
    	dev_uart1 = DEVICE_DT_GET(DT_NODELABEL(uart1));
    	if (!device_is_ready(dev_uart1))
    	{
    		printk("UART1 is not ready \n");
    		return;
    	}
    	uart_irq_rx_disable(dev_uart1);
    	uart_irq_tx_disable(dev_uart1);
    
    	uart_irq_callback_set(dev_uart1, uart1_irq_handler);
    	uart_irq_rx_enable(dev_uart1);
    }
    
    
    static void uart1_irq_handler(const struct device *dev, void *context)
    {
    	uint8_t char_received;
    	static uint8_t command_line[RX_BUF_SIZE];
    	static int char_counter = 0;
    
    	if (!(uart_irq_rx_ready(dev) || uart_irq_tx_ready(dev)))
    	{
    		LOG_DBG("spurious interrupt");
    	}
    
    	if (uart_irq_tx_ready(dev))
    	{
    		int tx_sent = uart_fifo_fill(dev, (uint8_t *)tx_data, tx_data_length);
    
    		if (tx_sent <= 0)
    		{
    			LOG_ERR("Error %d sending data over UART1 bus\n", tx_sent);
    			return;
    		}
    
    		while (uart_irq_tx_complete(dev) != 1)
    		{
    			LOG_INF("Wait for UART1 data transmition complete\n");
    		}
    		LOG_INF("UART1 data transmitted\n");
    		uart_irq_tx_disable(dev);
    		k_sem_give(&tx_sem);
    	}
    
    	if (uart_irq_rx_ready(dev))
    	{
    		int len = uart_fifo_read(dev, &char_received, 1);
    		if (len)
    		{
    			LOG_INF("UART1 data received: %c\n", char_received);
    			command_line[char_counter] = char_received;
    			char_counter++;
    			if (char_received == '\n' || char_received == '\r')
    			{
    				command_line[char_counter] = '\0'; // put null at the end of the string to indicate end of message or end of string
    				LOG_INF("UART1_RX(%u): %s \n", char_counter, command_line);
    				char_counter = 0; // reset the char counter
    
    				memset(&command_line, 0, sizeof(command_line));
    			}
    		}
    	}
    }
    
    
    int uart_irq_tx(const struct device *dev, const uint8_t *buf, size_t len)
    {
    	tx_data = buf;
    	tx_data_length = len;
    	uart_irq_tx_enable(dev);
    	k_sem_take(&tx_sem, K_FOREVER);
    	return len;
    }
    
    int main(void)
    {
    	app_uart0_init();
    	app_uart1_init();
    	while (1)
    	{
    		k_msleep(5000);
    		uart_irq_tx(dev_uart1, "Hello from UART1\n", 17);
    	}
    }

    As you can see from the code above, I have put tx and rx handlers into a single function (uart1_irq_handler). Previously I had 2 different interrupt handlers which is probably not correct.

    I can now short 2 UART1 pins together and I will be able to receive part of the message. See the serial temrinal logs below:


    I have send 17 bytes as shown below:

    	while (1)
    	{
    		k_msleep(5000);
    		uart_irq_tx(dev_uart1, "Hello from UART1\n", 17);
    	}

    But only received 7 bytes. I am happy that I have managed and currently working on solving this issue. Perhaps you will have some insights  :) 

  • zazas321 said:
    As you can see from the code above, I have put tx and rx handlers into a single function (uart1_irq_handler). Previously I had 2 different interrupt handlers which is probably not correct.

    Thanks for the info. Yes having two callbacks is not the right way to do it.

    I have looked into the last commit you made and it looks neat and correct. Thanks for posting the code here which will be helpful to others aswell :) 

  • The commit that you have linked is a different branch (only for testing/receiving messages via the UART0) and that works fine since its quite straight forward.

    Please look at UART0_UART1_Interrupt which is a different branch.

    I still have not yet managed to get the UART1 working properly (see the logs above, I am only able to receive part of the message). I will connect the logic analyzer to monitor RX/TX lines

    UPDATE

    After monitoring the RX/TX lines using logic analyzer everything seems fine:

    I am currently debugging to figure out what could be the issue with the UART1 receive:

    I have found a very simillar post (Limited to reading 8 bytes per transmission on uart_fifo_read() Function ) but it does not seem to be solved.

    Could it be that there is an issue with using uart_fifo_read ?


    I have tested it with different length data. For example, if I try to send 4 bytes:

    uart_irq_tx(dev_uart1, "Hel\n", 4);

    Everything seems fine:
    [00:01:45.050,109] [1B][0m<inf> nrf52_learning: tx_sent: 4[1B][0m
    [00:01:45.070,495] [1B][0m<inf> nrf52_learning: Data to be sent length = 4[1B][0m
    [00:01:45.092,285] [1B][0m<inf> nrf52_learning: UART1 data transmitted
    [1B][0m
    [00:01:45.113,830] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.135,192] [1B][0m<inf> nrf52_learning: UART1 data received: H
    [1B][0m
    [00:01:45.156,738] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.178,131] [1B][0m<inf> nrf52_learning: UART1 data received: e
    [1B][0m
    [00:01:45.199,676] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.221,038] [1B][0m<inf> nrf52_learning: UART1 data received: l
    [1B][0m
    [00:01:45.242,584] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.263,946] [1B][0m<inf> nrf52_learning: UART1 data received: 
    
    [1B][0m
    [00:01:45.285,461] [1B][0m<inf> nrf52_learning: UART1_RX(4): Hel



    However, anything above 7 bytes will not be properly received:

    *** Booting nRF Connect SDK v2.5.1 ***
    [00:00:05.364,227] [1B][0m<inf> nrf52_learning: tx_sent: 9[1B][0m
    [00:00:05.369,720] [1B][0m<inf> nrf52_learning: Data to be sent length = 9[1B][0m
    [00:00:05.376,617] [1B][0m<inf> nrf52_learning: UART1 data transmitted
    [1B][0m
    [00:00:05.383,270] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.389,739] [1B][0m<inf> nrf52_learning: UART1 data received: H
    [1B][0m
    [00:00:05.396,392] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.402,832] [1B][0m<inf> nrf52_learning: UART1 data received: e
    [1B][0m
    [00:00:05.409,484] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.415,954] [1B][0m<inf> nrf52_learning: UART1 data received: l
    [1B][0m
    [00:00:05.422,607] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.429,077] [1B][0m<inf> nrf52_learning: UART1 data received: l
    [1B][0m
    [00:00:05.435,729] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.442,199] [1B][0m<inf> nrf52_learning: UART1 data received: o
    [1B][0m
    [00:00:05.448,852] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.470,214] [1B][0m<inf> nrf52_learning: UART1 data received: 1
    [1B][0m
    [00:00:05.491,760] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.513,122] [1B][0m<inf> nrf52_learning: UART1 data received: 2
    [1B][0m


    I would really appreciate if you could take a look at this. Perhaps this is a bug ?

Reply
  • The commit that you have linked is a different branch (only for testing/receiving messages via the UART0) and that works fine since its quite straight forward.

    Please look at UART0_UART1_Interrupt which is a different branch.

    I still have not yet managed to get the UART1 working properly (see the logs above, I am only able to receive part of the message). I will connect the logic analyzer to monitor RX/TX lines

    UPDATE

    After monitoring the RX/TX lines using logic analyzer everything seems fine:

    I am currently debugging to figure out what could be the issue with the UART1 receive:

    I have found a very simillar post (Limited to reading 8 bytes per transmission on uart_fifo_read() Function ) but it does not seem to be solved.

    Could it be that there is an issue with using uart_fifo_read ?


    I have tested it with different length data. For example, if I try to send 4 bytes:

    uart_irq_tx(dev_uart1, "Hel\n", 4);

    Everything seems fine:
    [00:01:45.050,109] [1B][0m<inf> nrf52_learning: tx_sent: 4[1B][0m
    [00:01:45.070,495] [1B][0m<inf> nrf52_learning: Data to be sent length = 4[1B][0m
    [00:01:45.092,285] [1B][0m<inf> nrf52_learning: UART1 data transmitted
    [1B][0m
    [00:01:45.113,830] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.135,192] [1B][0m<inf> nrf52_learning: UART1 data received: H
    [1B][0m
    [00:01:45.156,738] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.178,131] [1B][0m<inf> nrf52_learning: UART1 data received: e
    [1B][0m
    [00:01:45.199,676] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.221,038] [1B][0m<inf> nrf52_learning: UART1 data received: l
    [1B][0m
    [00:01:45.242,584] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:01:45.263,946] [1B][0m<inf> nrf52_learning: UART1 data received: 
    
    [1B][0m
    [00:01:45.285,461] [1B][0m<inf> nrf52_learning: UART1_RX(4): Hel



    However, anything above 7 bytes will not be properly received:

    *** Booting nRF Connect SDK v2.5.1 ***
    [00:00:05.364,227] [1B][0m<inf> nrf52_learning: tx_sent: 9[1B][0m
    [00:00:05.369,720] [1B][0m<inf> nrf52_learning: Data to be sent length = 9[1B][0m
    [00:00:05.376,617] [1B][0m<inf> nrf52_learning: UART1 data transmitted
    [1B][0m
    [00:00:05.383,270] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.389,739] [1B][0m<inf> nrf52_learning: UART1 data received: H
    [1B][0m
    [00:00:05.396,392] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.402,832] [1B][0m<inf> nrf52_learning: UART1 data received: e
    [1B][0m
    [00:00:05.409,484] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.415,954] [1B][0m<inf> nrf52_learning: UART1 data received: l
    [1B][0m
    [00:00:05.422,607] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.429,077] [1B][0m<inf> nrf52_learning: UART1 data received: l
    [1B][0m
    [00:00:05.435,729] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.442,199] [1B][0m<inf> nrf52_learning: UART1 data received: o
    [1B][0m
    [00:00:05.448,852] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.470,214] [1B][0m<inf> nrf52_learning: UART1 data received: 1
    [1B][0m
    [00:00:05.491,760] [1B][0m<inf> nrf52_learning: uart_fifo_read len: 1[1B][0m
    [00:00:05.513,122] [1B][0m<inf> nrf52_learning: UART1 data received: 2
    [1B][0m


    I would really appreciate if you could take a look at this. Perhaps this is a bug ?

Children
No Data
Related