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协议进行传输接受数据——AsyncUdpSocket
在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还是非常能够胜任的. ...
- C#,COM口,接收,发送数据
这里写一种,COM口的数据接收,发送方法. 1.COMHelper类 /// <summary>初始化串行端口</summary> private SerialPort _se ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 网络编程(UDP协议-聊天程序)
网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...
- 基于UDP协议的控制台聊天程序(c++版)
本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...
- Android为TV端助力 UDP协议
废话不多说.直接上代码! 一. 接收端 1.创建UDP连接 public void init() { try { //开关的作用 isRunning = true; DatagramSocket mU ...
- python六十八课——网络编程之UDP协议
1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
随机推荐
- .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础
基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...
- 用js实现2048小游戏
用js实现2048小游戏 笔记仓库:https://github.com/nnngu/LearningNotes 1.游戏简介 2048是一款休闲益智类的数字叠加小游戏.(文末给出源代码和演示地址) ...
- ElasticSearch安装中遇到的一些问题
前段时间部署ElasticSearch,现把安装中遇到的一些问题和注意细节与大家分享一下. 系统:CentOS7.2 0.安装JDK 8,配置环境变量 官网下载地址:http://www.oracle ...
- 《算法导论》Chapter 4 Divide-and-Conquer的学习笔记
Introduction Divide-and-Conquer的三个步骤: Divide the problem into a number of subproblems that are small ...
- MySQL学习记录(不断更新)
MySQL设置数据集为UTF8仍无法输入中文的解决办法: 我们的机器默认为gbk,因此可在进入数据库之前,使用以下这条语句将默认编码改为gbk,注意没有单引号,也不要用分号. mysql -uroot ...
- java windows自动化-mail自动发邮件
本文旨在让测试人员了解如何发邮件 发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:1java代码来做下面即 ...
- elasticsearch例子(crud + 分页)
概述 基于elasticsearch2.3.3写的入门demo,含有创建index,删除index,录入数据,查询.以及分页,并且使用流行的ik分词器.测试方式:使用 JNUIT TEST 来运行. ...
- bootloader总体操作设计
bootloarder设计蓝图(不想做设计师的程序员不是好程序员):bootloarder的作用:将linux内核启动起来设计方法:模仿u-bootu-boot:支持多种嵌入式cpu的bootloar ...
- LeetCode - 627. Swap Salary
Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m v ...
- 音乐之声——midi制作原理
实际发出声音需要4项必备的条件 1 发生的装置 Sequencer 把sequencer想成CD播放机 (plays) 2 要演奏的乐曲 Sequence sequence就好像是单曲 ...