历史上的今天
返回首页

历史上的今天

今天是:2025年04月28日(星期一)

正在发生

2018年04月28日 | udp协议的数据接收与发送的代码

2018-04-28 来源:eefocus

于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数据发送。


推荐阅读

史海拾趣

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

FTCAP Fischer & Tausche Capacitor Group公司的发展故事

故事一:德国制造的坚持

FTCAP Fischer & Tausche Capacitor Group自成立以来,始终坚守在德国本土进行电容器的生产和研发。这一决策源于公司对产品质量的不懈追求。在电子行业,德国制造以其精湛的工艺和严格的质量控制而闻名,FTCAP也不例外。通过缩短研发与生产之间的距离,FTCAP能够确保高效的生产流程和与客户的紧密协作,从而快速响应市场需求,提供高质量的产品。

故事二:多样化的产品线

FTCAP的产品线涵盖了从薄膜电容器到铝电解电容器的广泛范围,满足了不同行业对电容器的多样化需求。公司不仅生产标准规格的电容器,还根据客户的特定需求提供定制化的解决方案。这种灵活性和创新性使得FTCAP在竞争激烈的电子市场中脱颖而出,赢得了众多客户的信赖和好评。

故事三:技术创新与产品升级

近年来,FTCAP不断投入资源进行技术创新和产品升级。例如,公司推出的Enlight Energy Cap系列薄膜电容器,经过重新设计后,不仅性能更加优越,还增加了“Enlight”这一附加属性,进一步提升了产品的市场竞争力。此外,FTCAP还致力于提高电容器的能效和可靠性,以满足日益严格的环保和能效标准。

故事四:行业内的替代解决方案

凭借超过70年的电容器研发和生产经验,FTCAP在行业内建立了良好的声誉。当一些客户面临竞争对手产品无法满足其需求时,FTCAP能够提供定制化的电容器作为替代解决方案。这些定制产品不仅性能优越,而且能够完美匹配客户的设备和应用场景,帮助客户解决燃眉之急。

故事五:团队建设与企业文化

FTCAP的成功离不开其优秀的团队和独特的企业文化。公司注重员工的培训和发展,鼓励员工创新思维和团队合作。在FTCAP,员工们不仅拥有专业的技能和知识,还具备高度的责任感和使命感。他们共同努力,为公司的发展贡献自己的力量。此外,FTCAP还定期举办各种团建活动,增强员工之间的凝聚力和归属感,营造了一个和谐、积极的工作氛围。

Catalyst公司的发展小趣事

Catalyst公司在电子行业的初创期,以其独特的创新理念和前瞻性的技术布局,奠定了坚实的基础。公司创始团队由一群对电子行业充满热情的工程师和科学家组成,他们共同致力于研发高效、稳定的电子产品。通过不断的技术研发和市场调研,Catalyst成功推出了一系列具有竞争力的产品,逐步在市场中崭露头角。

Heatron公司的发展小趣事

在20世纪初,随着电子工业的蓬勃发展,对高效、可靠电加热元件的需求日益增长。Heatron公司凭借其深厚的技术积累,成功研发出了一种新型的高密度单头电热管,该产品在耐高温、耐腐蚀性能上实现了重大突破。这一技术成果迅速获得了市场的广泛认可,不仅提升了Heatron在电加热器市场的地位,还推动了整个电子行业相关应用的技术进步。

BALLUFF公司的发展小趣事

BALLUFF公司的历史可以追溯到1921年,由格布哈德·巴鲁夫(Gebhard Balluff)创建的一家机械修理厂开始。这家修理厂起初规模较小,但巴鲁夫凭借其对机械技术的精湛理解和不懈追求,逐渐将业务发展壮大。他通过不断的技术创新和产品升级,使得修理厂逐渐转型为一家专注于生产精密部件、车件和铣件的企业。这一转变不仅奠定了BALLUFF公司的工业基础,也为其日后在传感器领域的崛起打下了坚实基础。

Equator Technologies公司的发展小趣事

在XX年代中期,Equator迎来了一个重要的转折点——被Pixelworks公司收购。Pixelworks是一家在显示图像处理领域具有领先地位的公司,其产品线广泛,包括用于各种显示设备的图像处理芯片和软件。与Pixelworks的合并使Equator获得了更广阔的市场和资源支持,加速了其技术和产品的发展。合并后,Equator继续专注于视频处理技术的研发,并与Pixelworks共同推出了多款创新产品。

Emmoco公司的发展小趣事

随着产品质量的不断提升和技术的不断创新,Emmoco开始积极拓展市场。公司制定了详细的市场拓展计划,通过参加国际展会、举办技术研讨会等方式,不断提高品牌知名度和影响力。同时,Emmoco还积极与国内外知名企业建立合作关系,共同开拓市场,实现互利共赢。这些举措使得Emmoco的市场份额不断扩大,品牌影响力逐渐增强。

问答坊 | AI 解惑

用AT89C51单片机做一个倒车雷达的毕业设计

我打算用AT89C51的单片机做一个倒车雷达的毕业设计,大家有没有好的设计方案? 软件的设计,硬件的设计。 我邮箱:lovew230@163.com…

查看全部问答>

跳槽前要想清楚的六件事

跳槽,职场人士既熟悉而又陌生的词汇,可谓是职场上的热门话题。说它熟悉,那是因为有很多人有跳槽的经历;说它陌生,那是因为有很多人听过,但没实践过。职场人士为什么喜欢跳槽?根据帝王职业顾问的研究,无外乎三个方面的原因:一是,非常不喜欢 ...…

查看全部问答>

谁有这几个贴片元件的规格书

一块板子上,有几个贴片二极管,标示为: A,F1,F5,K2。黑色,尺寸类似0805 找不到规格书,谁能帮忙一下 先谢谢了…

查看全部问答>

wince 6.0 sd卡驱动睡眠唤醒

现在wince6.0的sd卡驱动的睡眠唤醒的过程模拟了一个sd card拔出和sd card插入的过程。 也就是说按下睡眠键的时候,sd card存在于卡套中,驱动会做一个sd card拔出的模拟过程;当机器唤醒的时候sd 驱动监测到卡在,就模拟一个卡插入的过程。这样的 ...…

查看全部问答>

如何改变镜像的名称"VXWORKS"

Tornado 生成VXWORKS镜像的名称都为“VXWORKS”,有没有可能改成其他的名字?…

查看全部问答>

请问怎么控制Ce4.2系统的任务栏的显示和关闭?

   遇到一些使用ce4.2的一体机,有的机的方案把任务栏完全锁死,运行 explorer不会出来任务栏,也有的能出来,但一直在最下文隐藏,请问有没办法把任务栏调出来显示,显示后,又有什么办法能把它完全关闭(不是隐藏)应该是关闭explorer进程?…

查看全部问答>

wince 下串口问题!请大侠赐教

ce4.2下串口1,2都好了,串口3只能发出去不能收,串口4打开失败。谁能帮我分析下可能的问题吗? 我已经根据网上提示在debug.c文件里添加了一句关闭调试串口的语句。 platform.reg文件里中: 前面范围一段如下: [HKEY_LOCAL_MACHINE\\Drivers\\ ...…

查看全部问答>

在IAR环境下,植入UCOS之后可以在线调试不?

                                 在IAR环境下,植入UCOS之后可以在线调试不?…

查看全部问答>

模电知识

问题:为什么说“只有当Aup(s)小于3时,即分母中s的一次项系数大于零,电路才能稳定工作,而不产生自激振荡。”?请各位大侠帮忙讲解一下。Aup(s)是P点的电压增益…

查看全部问答>

MSP430的PC指针如何修改

目前在做IAP升级,将升级程序从外部E2PROM导入RAM后,需要修改PC指针指向RAM空间的首地址。求问:修改PC值该咋办?用C语言咋实现?IAR好像不支持嵌入汇编。不胜感激!…

查看全部问答>