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

发布者:keiss2018最新更新时间:2018-04-28 来源: eefocus关键字: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数据发送。


关键字:udp协议  数据接收  发送 引用地址:udp协议的数据接收与发送的代码

上一篇:STM32NET学习笔记 UDP部分
下一篇:调试STM32 UDP功能的一些心得

推荐阅读最新更新时间:2024-03-16 16:00

灵星雨802发送卡级联控制超大LED显示屏方法
   一、硬件准备   1、 一条DVI线(DVI线一头转两头的线)   2、2张灵星雨802发送卡   3、一条十针的排线   二、硬件连接   1、用十针排线把两张发送卡级联起来,如图1。 图1 用十针排线连接两张发送卡   2、802发送卡上各有个红色按键,把其中一个发送卡的按键设置为1,另一张发送卡的按键不变。如图2。 图2 按键设置 3、把两发送卡插入电脑的PCI插口,用DVI一转二的线把显卡的DVI和两发送卡相连,一头的插入显卡的DVI口,两头的分别插入两个发送卡的DVI口。如图3。 图3连接两张发送卡的DVI 接口 三、软件设置   两802发送卡级联后
[电源管理]
灵星雨802<font color='red'>发送</font>卡级联控制超大LED显示屏方法
STM32串口DMA发送中断配置
本文以STM32F1xx的串口1为例,简单呈现下使用DMA中断连续发送的代码 串口DMA配置通常可以分为2个部分: 1.串口配置 2.DMA配置 串口配置 void UART1_Init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
[单片机]
MSP430单片机USART串口发送字符和字符串
在MSP430单片机的官方历程中有使用串口中断发送字符以及字符串的程序,但是移植性不高,我专门写了两个函数,用于发送单个字符合字符串,不需要使用中断,供大家参考。 /********************************************** *程序描述:单片机的P3.4、P3.5作为串口发送字符和字符串 *作者 :Zhenhua Liu *时间 :2017.11.01 23:00 ***********************************************/ #include msp430x14x.h #define uchar unsigned char uchar DATA = hel
[单片机]
STM32F103 CAN中断发送功能的再次讨论
我在之前的一篇博客日志中,写过关于CAN发送功能如何使用,但是当时由于时间匆忙,赶项目,按照对USART中断发送的理解,在数据成功发送出去的情况下,写了那篇误人子弟的日志,在这里向大家道歉,实在不好意思,现在我重新阐述下CAN中断发送原理。 1、USART发送中断与CAN发送中断的区别 USART发送中断,是因为发送缓冲区为空,CAN发送中断的中断源是成功(或者abort)发送一次,正是这种区别误导了我。 2、我之前的CAN中断发送的处理方法是,将数据填充到发送缓冲区,由CAN中断提取进行发送,为了启动CAN的发送,我写了一句话CAN- sTxMailBox .TIR |= 1;就是启动发送,我以为在这以后CA
[单片机]
基于STM32单片机发送字符串的函数
最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。 其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。 //程序功能:利用串口发送一个字符串 // 参数:USARTx USART编号 可取 USART1、USART2、USART3、USART4、 USART5(STM32F103ZET6) str 需要发送的字符串 #include “stm32f10x.h” void Usart_SendString(USART_TypeDef* US
[单片机]
stm32串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口发送方式
1、stm32串口发送占用的时间 答:做嵌入式以来,一直自认为在两个MCU之间的串口通信很占用时间,让我感觉很是不爽。经过一番查找资料后发现并没有我想象的那么糟糕。 串口发送数据: 发送数据在软件层面来看是按照字节来发送的。USARTx- DR = (Data & (uint16_t)0x01FF);CPU只需要把一个字节的数据填充到DR寄存器中就可以了,然后具体的发送过程是由硬件来完成,单字节的发送过程中不消耗CPU。但是为什么我们使用串口来发送连续的数据时为什么还是感觉到这么慢,而且连续发送的过程中CPU不能去做其他任务呢?究其原因是因为我们为保证数据发送的完整性在发送过程中加入了while(USART_GetFlagSt
[单片机]
stm32串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口<font color='red'>发送</font>方式
基于ARM和VxWorks实现自动彩信发送的嵌入式系统
在arm微处理器硬件平台上,应用windriver公司的tornado集成开发环境,实现基于vxworks的自动发送彩信的嵌入式应用系统。该系统使用现有cdma网络,根据设定的参数发送彩信到特定的移动终端用户。   随着嵌入式应用的发展和16/32位risc处理器技术的成熟,以及支持各种高端处理器的嵌入式操作系统的涌现和完善,嵌入式无线设备可以利用cdma网络实现许多新的应用。自动发送彩信的嵌入式系统就是这种新应用之一,在特定的条件下,系统自动发送彩信到指定的移动通信终端;该应用系统是由用户根据要求设定触发条件的自动发送彩信系统,当满足触发条件时,设备会自动控制捕获、压缩图像部件拍摄外部图像,经过模数转换、数字压缩等处理后,经处
[模拟电子]
基于ARM和VxWorks实现自动彩信<font color='red'>发送</font>的嵌入式系统
ABI发布802.15.4供应商排名 TI第四度折桂
日前ABI Research发布了其IEEE 802.15.4供应商排名,德州仪器(TI)连续第四次在IEEE 802.15.4供应商列表中排在首位。在这份最新全球IEEE 802.15.4供应商列表中,Ember公司和Oki Semiconductor分别排在第二和第三位。 供应商列表是ABI Research开发的一个分析工具,可以很清晰了解特定市场的供应商排名情况。ABI Research对销售商的“革新”和“实施能力”等几种重要参数进行评估,并结合公司赢得客户能力、合同金额、全球市场份额、专利、研发开支、产品面市时间、市场敏感度等进行综合考虑。 对于评价具体IEEE 802.15.4芯片供应商,相关标准包括:供应商是否
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved