udp协议的数据接收与发送的代码

我想基于lwIP协议中的UDP协议,用单片机做一个服务器,接受电脑的指令然后返回数据。以下是我的代码
/****************************************************
*函数功能:初始化udp,选定通信端口,建立连接机制
****************************************************/
void Udp_Api_init(void)
{
  err_t err;
  struct udp_pcb *UDPpcb;

  /* create a new UDP PCB structure  */
  UDPpcb = udp_new();
  if (!UDPpcb)
  {  /* Error creating PCB. Out of Memory  */
    return;
  }

  /* Bind this PCB to port 99  */
  err = udp_bind(UDPpcb, IP_ADDR_ANY, service_port);
  if (err != ERR_OK)
  {    /* Unable to bind to port  */
    return;
  }

  //通知协议栈当99端口有连接请求时调用recv_callback_udp
  udp_recv(UDPpcb, recv_callback_udp, NULL);
}

 void recv_callback_udp(void *arg,struct udp_pcb *upcb, struct pbuf *pkt_buf,
                        struct ip_addr *addr,u16_t port)
{
  struct ip_addr dAddr = *addr;
  u8 data[5]={1,2,3,4,5};
  u8 *pValiData;
  
  struct pbuf *p ;
  struct ip_addr ipaddr;
  struct udp_pcb *UDPpcb1;

  pValiData=pkt_buf->payload;           
  

  if( pkt_buf != NULL )
       {
          if(*pValiData > 0x05)   //接收到的指令码大于5,返回原指令
            udp_sendto( upcb , pkt_buf , &dAddr , port ) ;
  else
  {
          p = pbuf_alloc(PBUF_RAW,sizeof(data),PBUF_RAM);  //根据将要发送的数据大小开辟pbuf
                  p->payload=(void *)data;
  
                  IP4_ADDR(&ipaddr,192,168,1,2); 
                  UDPpcb1 = udp_new(); 
                  udp_bind(UDPpcb1,IP_ADDR_ANY,service_port);  //绑定本地IP 地址     
                  udp_connect(UDPpcb1,&ipaddr,1000); 
                  udp_send(UDPpcb1,p);
      //udp_remove(upcb);
            //udp_sendto( upcb , pkt_buf , &dAddr , port ) ;
   }
     }
     pbuf_free(pkt_buf);
}
实验结果:在发送指令大于5时,单片机返回数据5;但是当指令小于5时,没有返回值,且串口显示“HardFault_Handler”
            这是为什么呢???????????

 

 

 

 

 

 

 

void UDPceshi_recv(void *arg,struct udp_pcb *upcb, struct pbuf *pkt_buf,
                        struct ip_addr *addr,u16_t port)
  {
  struct ip_addr dAddr = *addr;
//  u8 data[5]={1,2,3,4,5};
 u8 *pValiData;
//  
//  struct pbuf *p ;
  struct ip_addr ipaddr;
  struct udp_pcb *UDPpcb;

  pValiData=pkt_buf->payload;           
  

  if( pkt_buf != NULL )
       {
        
          //if(*pValiData > 0x05)   //接收到的指令码大于5,返回原指令
   //         udp_sendto( upcb ,pValiData , &ipaddr , 70 ) ;
//  else
//  {
//          p = pbuf_alloc(PBUF_RAW,sizeof(data),PBUF_RAM);  //根据将要发送的数据大小开辟pbuf
                //  p->payload=(void *)data;
  
                 // IP4_ADDR(&ipaddr,192,168,1,125); 
                  UDPpcb= udp_new(); 
                  udp_bind(UDPpcb,IP_ADDR_ANY,60);  //绑定本地IP 地址     
                  udp_connect(UDPpcb,&ipaddr,1000); 
                //  udp_send(UDPpcb1,p);
      //udp_remove(upcb);
            udp_sendto( upcb , pkt_buf , &dAddr , port ) ;
   }

     pbuf_free(pkt_buf);
//    else
//    {
//      udp_remove(upcb);
//    }
}

 

 

 

 

{
 // uint8_t i=0;
  struct ip_addr destAddr = *addr;
  if(p != NULL)                          /* 如果收到的数据不为空   */            
  {
  
    //pbuf_copy_partial(p, UDPData, p->len, 0);       
    udp_sendto(upcb,p,&destAddr,port);                    /* 将收到的数据再发送出去 */           

    pbuf_free(p);                       /* 释放缓冲区数据 */
  }
}
 

 

我用PC机周期性地通过UDP给lm3s8962发数据,lm3s8962处理完后,再通过UDP发送给PC机。

无论PC机的周期设为多大,发现lm3s8962只能收到一半pc机发送的数据。

 

假如我分别创建两个UDP socket,一个用于UDP数据接收,一个用于UDP数据发送。接收和发送都正常。

 

请问下各位大侠,这是什么原因?先谢过了。

 

代码如下:

 

void UDPNetInit(void)
{
     struct ip_addr ipaddr1;
     IP4_ADDR(&ipaddr1,192,168,0,125);
    //
    // Start listening for incoming TFTP requests.
    //
    UDPpcb = udp_new();
    udp_recv(UDPpcb, UDPDataRecv, NULL);
    udp_bind(UDPpcb,IP_ADDR_ANY,UDPPRO_PORT);   /* 绑定本地IP地址 */
    udp_connect(UDPpcb,&ipaddr1,UDPPRO_PORT); /* 连接远程主机 */

}

UDPDataRecv函数用于UDP数据接收,在另外一个地方调用udp_send()作为UDP数据发送。

 

 

时间: 2024-10-26 05:51:58

udp协议的数据接收与发送的代码的相关文章

《Android智能穿戴设备开发指南》——第6章,第6.3节使用UDP协议传递数据

6.3 使用UDP协议传递数据 Android智能穿戴设备开发指南 Java为我们提供了DatagramSocket对象作为基于UDP协议的Socket,可以使用DatagramPacket代表DatagramSocket发送或接收的数据报.本节将详细讲解使用UDP协议传递数据的内容. 6.3.1 使用DatagramSocket进行数据交互 DatagramSocket本身只是码头,不能产生I/O流,其唯一的功能是接收和发送数据报.Java语言使用DatagramPacket代表数据报,Dat

UDP协议下数据的传输分析

最近在做项目的时候发现了一个严重问题,可能不光是我多人在使用 win32 socket 进行开发的时候也会遇到的问题.首先我分析的模块是 我项目中文件传输的部分,我做的是一个基于UDP协议的一个局域网通信软件,里面有一个文件传输的模块 ,起初的时候我也完成了文件传输的功能,以为这就可以了,其实我在做的时候忽略了很多细节部分,比如数据应该如何传输 ,一次最多发送多少数据 以及如何控制同步问题 .这些问题我都没有详细去追究,直到最近我去某公司面试的时候,那位很牛逼的大哥跟我说了一句,"你知道wind

发送数据-UDP数据包的发送顺序怎么确定?

问题描述 UDP数据包的发送顺序怎么确定? 我用UDP发送数据包,在连续发送的情况下,接收端怎么确定我的发送顺序? 有什么方法,还是在发送的时候要先添加序号? 解决方案 UDP 是无顺序的,先发的包不一定会先到,所以最好还是自己在协议中增加包的编号. 接收处理时,按无序的逻辑进行,这样就能正常完成数据的接收. 否则,就换 TCP 协议吧,它的顺序是可以保证的. 解决方案二: 自己编号自己编号自己编号 解决方案三: UDP没顺序,自己需要定义协议等来完成组包

大数据-一个程序中,TCP协议用的muduo网络库,UDP协议可以用boos.asio吗?

问题描述 一个程序中,TCP协议用的muduo网络库,UDP协议可以用boos.asio吗? 通过TCP协议接收数据,解析好,在用UDP协议转发. UDP转发是后面增加的,muduo网路库不支持Udp协议,自己用socket api写,担心大数据,多并发的时候不可靠.请问大神有什么建议? 解决方案 这个当然可以,只要协议格式客户端,服务端之间处理好. 解决方案二: udp确实不可靠,要解决可以自己实现一套超时和重发机制,比如说每个数据包打上标号,发送方和接收方处理好重发,如果对数据质量要求高的话

java使用Socket类接收和发送数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 连接服务器 发送和接收数据 关闭网络连接 一.连接服务器 在

Socket 接收和发送数据的深刻理解.

今天仔细研究了一下关于TCP/UDP接收和发送数据的具体实现和下层接收数据的缓冲区,原理UDP从数据缓冲区中接收数据的方式和TCP从缓冲区中读取数据的方式是不同的,UDP接收缓冲区中也会依次保存接收到的数据,如果缓冲区满了则再接收的数据就会丢失,UDP接收数据和发送数据的次数应该是相同的,UDP不管你每次接收的数据的多少,只要你接收了一次数据那么就相当于接收了发送端某次发送的数据,而不管你接收的多少,本次的数据都将清空,注意:这里说的是本次的数据.再具体点比如:发送端连续两次发送了3个字节的数据

跪求安卓客户端如何接收Ubuntu系统过来的结构体协议,还有应该怎么发送过去

问题描述 跪求安卓客户端如何接收Ubuntu系统过来的结构体协议,还有应该怎么发送过去 安卓客户端怎么接受C语言写的结构体协议,应该怎么发送到服务器端进行数据交互 解决方案 如果是直接序化 c 的结构体,就要了解 c 结构体的内存布局.还有内存大小端问题 如果在安桌端用的是 java / c# 等.来反序化原始的 c结构内存数据,有点烦人. 建议选用 protobuf ans1 等格式化 解决方案二: 两边约定好就可以,或者序列化成json,xml. 解决方案三: 现在这个问题,,已经解决了,,

手机应用怎么接收蓝牙设备发送出来的数据?如体温计,血压计?有串口,该怎么实现?哪位大神指导一下思路?

问题描述 手机应用怎么接收蓝牙设备发送出来的数据?如体温计,血压计?有串口,该怎么实现?哪位大神指导一下思路? 哪位大神指导一下该如何通过蓝牙串口接收蓝牙设备传输的数据?如体温计,血压计等蓝牙硬件设备 解决方案 蓝牙设备相当于网络通讯,但是不同的设备有自己不同的协议,需要看对应的手册. 串口比较简单,用串口调试助手之类的工具看下,就可以搞清楚协议.手机本身没有串口,需要用pc转发. 建议你连传感器连下位机都自己设计.

网络编程-JAVA udp协议 服务器端无法接受数据

问题描述 JAVA udp协议 服务器端无法接受数据 我用UDP协议,写了客服端和服务器端的demo,可是服务器端一直无法receive DatagramPacket. 我在防火墙和360等杀毒软件都关的情况下,任然无法解决. 服务器代码: ```public static void main(String[] args) throws IOException { // TODO Auto-generated method stub DatagramSocket ds = new Datagra