How to creat and initsializtion this struct for send data using UDP
struct pbuf *p;
I using this code.
struct netif fsl_netif0; struct udp_pcb * pcb; ip_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw; #define PORT_M 9000 void eth_lwip_init () { lwip_init(); IP4_ADDR(&fsl_netif0_ipaddr, 192,168,70,110); IP4_ADDR(&fsl_netif0_netmask, 255,255,255,0); IP4_ADDR(&fsl_netif0_gw, 192,168,70,1); netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, NULL, ethernetif_init, ethernet_input); netif_set_default(&fsl_netif0); { uint32_t dt = 0; ENET->MSCR = 0x26<<1; PHY_DRV_Read (0,0,0x1f, &dt); dt |= (1<<7); PHY_DRV_Write (0, 0, 0x1f, dt ); OSA_TimeDelay(1000); } // get new pcb pcb = udp_new(); if (pcb == NULL) { LWIP_DEBUGF(UDP_DEBUG, ("udp_new failed!\n")); return; } //bind to any IP address on port //IP_ADDR_ANY if (udp_bind(pcb, &fsl_netif0_ipaddr, PORT_M) != ERR_OK) { LWIP_DEBUGF(UDP_DEBUG, ("udp_bind failed!\n")); return; } netif_set_up(&fsl_netif0); // set udp_echo_recv() as callback function // for received packets udp_recv(pcb, udp_echo_recv, NULL); /// test message { uint8_t i; err_t err_if; struct pbuf *p; struct udp_hdr* u_hdr; // extern struct udp_pcb *pcb; uint8_t data[8] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x0, 0x0, 0x0 }; p = pbuf_alloc(PBUF_TRANSPORT, 8, PBUF_RAM); u_hdr = (struct udp_hdr *)p->payload; u_hdr->src=(uint16_t) fsl_netif0_ipaddr; u_hdr->dest = PORT_M; u_hdr->len = sizeof(struct udp_hdr) + sizeof(data); for (i=0; i<sizeof(data); i++) { ((char*)u_hdr)[sizeof(struct udp_hdr) + i] = (char)data[i]; } u_hdr->chksum = inet_chksum( &u_hdr, 8UL); err_if = udp_send ( pcb, p ); if (err_if != ERR_OK) { printf ("Error udp_sendto = %d\n", err_if); } pbuf_free (p); } }
How to send data fo udp packets?
Hello,
If you look at KSDK 1.3 examples, you will find the lwip_udpecho_demo_freertos_frdmk64f project that echoes udp data.
In this example, you will notice that netconn_send() function is used to send the data over UDP:
/**
* Send data over a UDP or RAW netconn (that is already connected).
*
* @param conn the UDP or RAW netconn over which to send data
* @param buf a netbuf containing the data to send
* @return ERR_OK if data was sent, any other err_t on error
*/
err_t
netconn_send(struct netconn *conn, struct netbuf *buf)
{
struct api_msg msg;
err_t err;
LWIP_ERROR("netconn_send: invalid conn", (conn != NULL), return ERR_ARG;);
LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %"U16_F" bytes\n", buf->p->tot_len));
msg.function = do_send;
msg.msg.conn = conn;
msg.msg.msg.b = buf;
err = TCPIP_APIMSG(&msg);
NETCONN_SET_SAFE_ERR(conn, err);
return err;
}
You only need to use conn pointer as NETCONN_UDP:
static void udpecho_thread(void *arg)
{
static struct netconn *conn;
static struct netbuf *buf;
char buffer[100];
err_t err;
LWIP_UNUSED_ARG(arg);
netif_set_up(&fsl_netif0);
conn = netconn_new(NETCONN_UDP);
LWIP_ASSERT("con != NULL", conn != NULL);
netconn_bind(conn, NULL, 7);
while (1)
{
err = netconn_recv(conn, &buf);
if (err == ERR_OK)
{
if(netbuf_copy(buf, buffer, buf->p->tot_len) != buf->p->tot_len)
{
LWIP_DEBUGF(UDPECHO_DBG, ("netbuf_copy failed\r\n"));
}
else
{
buffer[buf->p->tot_len] = '\0';
err = netconn_send(conn, buf);
if(err != ERR_OK)
{
LWIP_DEBUGF(UDPECHO_DBG, ("netconn_send failed: %d\r\n", (int)err));
}
else
{
LWIP_DEBUGF(UDPECHO_DBG, ("got %s\r\n", buffer));
}
}
netbuf_delete(buf);
}
}
}
You can also look for udpecho_thread to see how connection is established, receiving and sending data over UDP.
I hope this can help you!
Best Reards,
Isaac
----------------------------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
----------------------------------------------------------------------------------------------------------------------------------------