This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Continuously package send on UART

Dear , 

I am using nrf 9160 DK, 

and trying to send a package of data to UART.  

For example my package is: "LONGITUDEx:10.123456,LATITUDE:59.012324,UTC:20190513095612"

I tried to use: uart_fifo_fill(struct device *dev, const u8_t *tx_data, int size) to send.

But I got the problem, the package is too long ( longer than u8_t ?!), so i just send 32bytes of my package: "LONGITUDE1:10.123456,LATITUDE:59"

I tried to split to 2small packages and send without delay between them. Result: only 1 package is sent! I lost another one

split to 2small packages, and added a delay between them,  and send. It sent  

I don't want the delay between them. I want to send a continuous package (more than 32bytes). How can I do it? Can you help me.

My code: 

static u8_t uart_buf[1024];
static K_FIFO_DEFINE(fifo_uart_tx_data);
static K_FIFO_DEFINE(fifo_uart_rx_data);
struct uart_data_t {
	void  *fifo_reserved;
	u8_t    data[1024];
	u16_t   len;
};

/********************************************/
void uart_cb(struct device *x)
{
	uart_irq_update(x);
	int data_length = 0;

	if (uart_irq_rx_ready(x)) {
                data_length = uart_fifo_read(x, uart_buf, sizeof(uart_buf));
		uart_buf[data_length] = 0;
	}
	printk("%s", uart_buf);

       	if (uart_irq_tx_ready(x)) {
               
        	struct uart_data_t *buf =
			k_fifo_get(&fifo_uart_tx_data, K_NO_WAIT);
		u16_t written = 0;

		/* Nothing in the FIFO, nothing to send */
		if (!buf) {
			uart_irq_tx_disable(x);
			return;
		}

		while (buf->len > written) {
			written += uart_fifo_fill(x,
						  &buf->data[written],
						  buf->len - written);
		}

		while (!uart_irq_tx_complete(x)) {
			/* Wait for the last byte to get
			 * shifted out of the module
			 */
		}

		if (k_fifo_is_empty(&fifo_uart_tx_data)) {
			uart_irq_tx_disable(x);
		}

		k_free(buf);
	
		
	}

       
}

void main (void)
{

     
        struct device *uart_send= device_get_binding("UART_2");
        uart_irq_callback_set(uart_send, uart_cb);
	printk("Testing1: \n");              
        uart_fifo_fill(uart_send, "LONGITUDE1:10.123456,LATITUDE:59.012324,UTC:20190513095612\r" ,sizeof("LONGITUDE:10.123456,LATITUDE:59.012324,UTC:20190513095612\r"));
        k_sleep(100);
        
        printk("Testing2: \n");
        uart_fifo_fill(uart_send, "LONGITUDE2:10.123456,LATITUDE:5" ,sizeof("LONGITUDE:10.123456,LATITUDE:5"));
        uart_fifo_fill(uart_send, "9.012324,UTC:20190513095612\r" ,sizeof("9.012324,UTC:20190513095612\r"));
      

        k_sleep(100);
        printk("Testing3: \n");
        uart_fifo_fill(uart_send, "LONGITUDE3:10.123456,LATITUDE:5" ,sizeof("LONGITUDE:10.123456,LATITUDE:5"));
        k_sleep(1);
        uart_fifo_fill(uart_send, "9.012324,UTC:20190513095612\r" ,sizeof("9.012324,UTC:20190513095612\r"));
             
        printk("Done testing\n"); 

	while (1) {
		k_cpu_idle();
                
	}
     
	
}

Thanks so much 

Hng

Related