我们简单做一个demo来测试UPD客户端数据传输功能- #define UDP_DEMO_PORT 8090 //本地端口
-
- uint8_t udp_demo_recvbuf[100]; //UDP接收数据缓冲区
- uint8_t udp_demo_sendbuf[50]; //UDP发送数据内容缓冲区
- uint8_t UdpRecelen=0;
- /******************************************************************************
- * 描述 : 创建udp客户端
- * 参数 : 无
- * 返回 : 无
- ******************************************************************************/
- void udp_echo_init(void)
- {
- struct udp_pcb *udp_client_pcb;
-
- /* 为udp客户端分配一个udp_pcb结构体 */
- udp_client_pcb = udp_new();
-
- /* 绑定本地端号和IP地址 */
- udp_bind(udp_client_pcb, IP_ADDR_ANY, UDP_DEMO_PORT);
-
- /* 注册接收回调函数 */
- udp_recv(udp_client_pcb,udp_demo_recv,NULL);
- }
- /******************************************************************************
- * 描述 : 接收回调函数
- * 参数 : -
- * 返回 : 无
- ******************************************************************************/
- void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)
- {
- uint32_t data_len = 0;
- struct pbuf *q;
-
- if(p!=NULL){
- memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE);
-
- /* 遍历整个pbuf链表 */
- for(q=p;q!=NULL;q=q->next){
- //判断要拷贝到UDP_DEMO_RX_BUFSIZE中的数据是否大于
- //UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于
- //的话就只拷贝UDP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
- if(q->len > (UDP_DEMO_RX_BUFSIZE-data_len)){
- memcpy(udp_demo_recvbuf+data_len,q->payload,(UDP_DEMO_RX_BUFSIZE- data_len));
- }
- else memcpy(udp_demo_recvbuf+data_len,q->payload,q->len);
-
- data_len += q->len;
- if(data_len > UDP_DEMO_RX_BUFSIZE) break;
- }
- /* 接收的数据长度 */
- UdpRecelen = data_len;
-
- /* 记录远端主机的IP地址 */
- upcb->remote_ip=*addr;
- /* 记录远端主机的端口号 */
- upcb->remote_port=port;
-
- /* 接收数据处理函数 */
- UDP_ReceData_Handler(upcb,UdpRecelen);
-
- /* 释放缓冲区数据 */
- pbuf_free(p);
- }
- }
- /******************************************************************************
- * 描述 : 发送udp数据
- * 参数 :
- * 返回 : 无
- ******************************************************************************/
- void udp_demo_senddata(struct udp_pcb *upcb,uint8_t *sendbuf)
- {
- struct pbuf *ptr;
-
- /* 分配缓冲区空间 */
- ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)sendbuf),PBUF_POOL);
-
- if(ptr){
- /* 填充缓冲区数据 */
- ptr->payload=(void*)sendbuf;
-
- /* 发送udp数据 */
- udp_send(upcb,ptr);
-
- /* 释放缓冲区空间 */
- pbuf_free(ptr);
- }
- }
- /******************************************************************************
- * 描述 : udp数据处理函数
- * 参数 :
- * 返回 : 无
- ******************************************************************************/
-
- void UDP_ReceData_Handler(upcb,UdpRecelen)
- {
- /* 将接收到的数据再转发出去 */
- udp_demo_senddata(upcb,udp_demo_recvbuf);
-
- /* 也可以做一些判断,在做自己的功能 */
- /* 发送 0x2a 0x01 数据*/
- if(UdpRecelen>=2){
- if((0x01 == udp_demo_recvbuf[1]) && (0x2a==udp_demo_recvbuf[0])){
- //Read BMC version
- printf("Hello LWIP UDP demo");
- }
- memset(udp_demo_sendbuf,0,UDP_DEMO_RX_BUFSIZE);
- UdpRecelen = 0;
- }else{
- UdpRecelen = 0 ;
- }
- }
|