您的位置:首页 > 理论基础 > 计算机网络

udp协议的数据接收与发送的代码 分类: VC++ 网络基础 2014-02-25 08:15 700人阅读 评论(0) 收藏

2014-02-25 08:15 991 查看
我想基于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数据发送。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐