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

Using uart and mcumgr to send a packet

Hello!

I'm trying to send a mcumgr packet over uart between the nrf9160dk_nrf9160 and the nrf9160dk_nrf5284.

To do this I have a SMP srv and a shell on both MCUs.

The echo is sent from 9160 using the code below. It seems like the packet is fully recieved on the 52840 however the when calling smp_shell_process
the packet is not correctly processed. It always stops with the comment (in seial_util.c)

/* Payload longer than indicated in header. */

The payload is consistently 2 bytes longer than indicated in the header.

What am I missing?

the sending looks like this:

struct mcumgr_packet{
struct mgmt_hdr hdr;

uint8_t payload[payload_size];//currently 45
};
int set_mgmt_hdr_echo(struct mcumgr_packet* mp){ //pointer to mcumgr_packet which hdr will be set to echo
mp->hdr.nh_op=2;
mp->hdr._res1=0;
mp->hdr.nh_flags=0;
mp->hdr.nh_len=payload_size;
mp->hdr.nh_group=0;
mp->hdr.nh_seq=0;
mp->hdr.nh_id=0;
return 0;
}
static int mcumgr_pipe_echo_handler(const struct shell* shell,size_t argc, char **argv, void *data){
shell_print(shell, "echoing %s", argv[1]); //argv[0]= echo, argv[1] echotext

struct mcumgr_packet mcumgr_packet={0};
set_mgmt_hdr_echo(&mcumgr_packet);

int argv_size = strlen(argv[1]);

if(argv_size <= payload_size){
memcpy(&mcumgr_packet.payload,argv[1],argv_size); //cp argv[1] into payload
mcumgr_packet.hdr.nh_len = argv_size;
}
else{
memcpy(&mcumgr_packet.payload,argv[1],payload_size); //simple failsafe
}
int k = uart_mcumgr_send(&mcumgr_packet,sizeof(mcumgr_packet.hdr)+mcumgr_packet.hdr.nh_len);
shell_print(shell, "Return code: %d, %d\n",k,sizeof(mcumgr_packet));
return 0;

receiving looks like this:

NET_BUF_POOL_DEFINE(basseng,5,256,CONFIG_NET_BUF_USER_DATA_SIZE,NULL);
struct smp_shell_data recieved_mcumgr_packet;

uart_mcumgr_recv_fn *mcumgr_cb_fn(struct uart_mcumgr_rx_buf *rx_buf){
size_t offset=0;
while(offset<rx_buf->length){
offset += smp_shell_rx_bytes(&recieved_mcumgr_packet,&rx_buf->data+offset,rx_buf->length-offset);
printk("offset: %d",offset);
}
printk("From 91: %d, %d, %d\n",offset,rx_buf->length,sizeof(rx_buf->data));
uart_mcumgr_free_rx_buf(rx_buf);
return 0;
}
 
void main(void)
{
recieved_mcumgr_packet.buf_pool=&basseng;

smp_shell_init();

img_mgmt_register_group();
os_mgmt_register_group();
fs_mgmt_register_group();
stat_mgmt_register_group();
printk("Hello 52!\n");
uart_mcumgr_register(mcumgr_cb_fn);
printk("pipe: registered\n");
while (true)
{
smp_shell_process(&recieved_mcumgr_packet);
k_sleep(K_MSEC(200));
}
}
Parents Reply Children
Related