我想基于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协议的数据接收与发送的代码的更多相关文章

  1. 局域网内通过UDP协议进行传输接受数据——AsyncUdpSocket

    在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还是非常能够胜任的. ...

  2. C#,COM口,接收,发送数据

    这里写一种,COM口的数据接收,发送方法. 1.COMHelper类 /// <summary>初始化串行端口</summary> private SerialPort _se ...

  3. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  4. 网络编程(UDP协议-聊天程序)

    网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...

  5. 基于UDP协议的控制台聊天程序(c++版)

    本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...

  6. Android为TV端助力 UDP协议

    废话不多说.直接上代码! 一. 接收端 1.创建UDP连接 public void init() { try { //开关的作用 isRunning = true; DatagramSocket mU ...

  7. python六十八课——网络编程之UDP协议

    1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...

  8. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  9. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

随机推荐

  1. Array.prototype鲜为人知的事实

    // constructor 属性是每个具有原型的对象的原型成员. // 这包括除 Global 和 Math 对象之外的所有内部 JavaScript 对象. // constructor 属性包含 ...

  2. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](九)

    前言 童鞋们,大家好 我是专注.NET开发者社区建设的实践者Rector. 首先,为自己间隔了两个星期五再更新本系列文章找个不充分的理由:Rector最近工作,家庭的各种事务所致,希望大家谅解. 本文 ...

  3. MonogoDB 查询小结

    MonogoDB是一种NoSQL数据库 优点: 1.数据的存储以json的文档进行存储(面向文档存储) 2.聚合框架查询速度快 3.高效存储二进制大对象 缺点: 1.不支持事务 2.文件存储空间占用过 ...

  4. linux上的组管理

    上一次我们谈了CentOS上的用户管理,现在我们再来谈下CentOS上的用户组管理. groupadd创建一个新的组 用法如下: groupadd [选项] groupname 常用选项: -f 强制 ...

  5. 转载-Oracle ORACLE的sign函数和DECODE函数

    原文地址:http://www.cnblogs.com/BetterWF/archive/2012/06/12/2545829.html 转载以备用 比较大小函数 sign 函数语法:sign(n) ...

  6. document.activeElement 过滤选择文件弹窗导致的页面失焦

    在线考试页面,常常需要检测用户是否作弊. 一般是监听页面是否失焦的方式,而失焦的方式有很多种,比如QQ弹窗,切换页面,切换程序,input文件上传选择文件等 选择文件是正常情况,这种情况下需要过滤 本 ...

  7. (python基础)时间辍time、时间元组localtime、时间格式化strftime

    可以直接将下方代码运行查看结果:#!/usr/bin/python# coding=utf-8import time # 引入time模块# 时间戳:# 每个时间戳都以自从1970年1月1日午夜(历元 ...

  8. 安卓中圆角背景图被拉伸的解决方案——.9.png

    举个例子: 从网上找了一张图片 如果我们直接用这张蓝色的图来做登录按钮的背景.将这个图片设为背景以后 我们可以发现四个角全部变形了,一点也不美观.针对此问题,我们通过.9图来解决. 首先我们先了解一下 ...

  9. 关于git post-receive 钩子

    登录 git服务器 进入你项目所在git文件夹 cd /var/opt/gitlab/git-data/repositories/liangyuquan/yfg.git cd hooks vim po ...

  10. Jenkins持续集成-自动化部署脚本的实现

    要实现Jenkins端的持续集成,其实在CI服务配置端很容易,难点呢?就是如何实现自动化的部署.我的脚本设计就是为了解决以下难题: 难点一.如何使得自动化部署脚本更通用 我用的脚本,依赖依赖一个配置文 ...