OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6393|回复: 5

做过udp移植的同志帮我看看

[复制链接]

14

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2013-1-19
在线时间
0 小时
发表于 2013-3-10 00:23:07 | 显示全部楼层 |阅读模式
tcpip的传输速度由于回馈机制 到时分包传输速度没法提高多少 所以改移植udp但是参考网上的那几篇文章 我用uip移植的 
主函数主要好是:先初始化 u
        ip_init(); //uIP初始化 这里
UDPConnect();
        uip_polling();
if(key==1||flag)//KEY1按下,TCP Client 请求发送数据
{
UdpSend("123",3);
                }
void uip_polling(void)
{
u8 i;
static struct timer periodic_timer, arp_timer;
static u8 timer_ok=0;  
if(timer_ok==0)//仅初始化一次
{
timer_ok = 1;
timer_set(&periodic_timer,CLOCK_SECOND/2);  //创建1个0.5秒的定时器 
timer_set(&arp_timer,CLOCK_SECOND*10);   //创建1个10秒的定时器 
}  
uip_len=tapdev_read(); //从网络设备读取一个IP包,得到数据长度.uip_len在uip.c中定义
if(uip_len>0) //有数据
{   
//处理IP数据包(只有校验通过的IP包才会被接收) 
if(BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包? 
{
uip_arp_ipin(); //去除以太网头结构,更新ARP表
uip_input();   //IP包处理
//当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0
//需要发送的数据在uip_buf, 长度是uip_len  (这是2个全局变量)    
if(uip_len>0)//需要回应数据
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}
}else if (BUF->type==htons(UIP_ETHTYPE_ARP))//处理arp报文,是否是ARP请求包?
{
uip_arp_arpin();
  //当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf, 长度是uip_len(这是2个全局变量)
  if(uip_len>0)
tapdev_send();//需要发送数据,则通过tapdev_send发送  
}
}else if(timer_expired(&periodic_timer)) //0.5秒定时器超时
{
timer_reset(&periodic_timer); //复位0.5秒定时器 
//轮流处理每个TCP连接, UIP_CONNS缺省是40个  
for(i=0;i<UIP_CONNS;i++)
{
uip_periodic(i); //处理TCP通信事件  
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
if(uip_len>0)
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}
}
#if UIP_UDP //UIP_UDP 
//轮流处理每个UDP连接, UIP_UDP_CONNS缺省是10个
for(i=0;i<UIP_UDP_CONNS;i++)
{
uip_udp_periodic(i); //处理UDP通信事件
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
if(uip_len > 0)
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}
}
#endif 
//每隔10秒调用1次ARP定时器函数 用于定期ARP处理,ARP表10秒更新一次,旧的条目会被抛弃
if(timer_expired(&arp_timer))
{
timer_reset(&arp_timer);
uip_arp_timer();
}
}
}


然后是udp文件
void UdpSend(char *str,unsigned short len)
{
   char   *nptr;  
   nptr = (char *)uip_appdata;      
   memcpy(nptr, str, len);
  
   uip_udp_send(len);   //发送数据

}
/*---------------------------------------------------------------------------*
*函数名:UdpNewData
*功能:接收数据后的处理函数
*形参:无
*返回:无
*---------------------------------------------------------------------------*/
void UdpNewData()
{
   unsigned char  ReceiveData[64];
//   unsigned char  SendData[64];
   short len;
   len = uip_datalen(); //读取数据长度
   if(len>64)
    len = 64;
   memcpy(ReceiveData,uip_appdata,len);
 //  ReceiveData="nihaome";

   if(ReceiveData[0] == 0x30)
   {
    memcpy(uip_appdata,ReceiveData,len);
uip_udp_send(len);
   }

//   UdpSend(SendData,strlen(SendData));
}
/*---------------------------------------------------------------------------*
*函数名:UdpAppcall
*功能:回调函数
*形参:无
*返回:无
*---------------------------------------------------------------------------*/
void UdpAppcall(void)
{
    if(uip_udp_conn->rport == HTONS(1400)) //8000端口发来数据
    {
      if(uip_newdata()) //如果收到数据
      {
        UdpNewData();     
      }
    }

}


void UDPConnect(void)
{
struct uip_udp_conn *c;
uip_ipaddr_t ipaddr;
uip_ipaddr(&ipaddr,192,168,1,104); //设置IP为192.168.1.103
// uip_connect(&ipaddr,htons(1400)); //端口为1400 
LCD_ShowString(30,20,200,16,16,"udp  ");
uip_udp_new(&ipaddr,HTONS(12345));
  if(c != NULL) 
{
LED1=!LED1;
   uip_udp_bind(c, HTONS(12344));
}
}
可以ping同 但是发不了数据 不知道为什么 在UDPConnect(void)里的if(c!=NULL)进不去 不知道是为什么 收不到数据 也发不出去数据 不知道哪里有问题 

    
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2013-3-22
在线时间
0 小时
发表于 2013-3-22 17:00:50 | 显示全部楼层
http://mcu-web.taobao.com 有zigbee 无线电压、温湿度、继电器实验 zigbee自组网实验 stm32开发板 enc28j60以太网 web服务器
回复 支持 反对

使用道具 举报

14

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2013-1-19
在线时间
0 小时
 楼主| 发表于 2013-3-23 14:26:30 | 显示全部楼层
回复【2楼】qianrushistm32:
---------------------------------
谢谢 不过已经移植成功 可以接受发送数据 150kb的数据2秒左右即可  不知道速度算不算快
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-10-19
在线时间
0 小时
发表于 2013-10-19 10:06:47 | 显示全部楼层
回复【3楼】人生如茶:
---------------------------------
您好!我在Openedv开源电子网上看到你发的一篇关于UIP实现UDP的帖子,看到你说已经实现了,我也正在做这个,找了很多资料,目前还没实现,不知道你当时实现的代码还在不?能不能发我一份参考一下,谢谢!我的邮箱:zhaoxr90@163.com
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2019-11-16
在线时间
0 小时
发表于 2014-12-7 16:45:23 | 显示全部楼层
借鉴了楼主的代码,顺便提一下,楼主说的无法发送的原因其实很简单,UDPConnect函数的if(c != NULL) 这句话的c变量在前面没有赋值。如果uip_udp_new(&ipaddr,HTONS(12345));这句话改为c=uip_udp_new(&ipaddr,HTONS(12345));就可以了。
回复 支持 反对

使用道具 举报

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2132
金钱
2132
注册时间
2014-11-18
在线时间
215 小时
发表于 2015-1-3 14:14:03 | 显示全部楼层
回复【5楼】showwei2004:
--------------------------------
你好,我最近也在搞这个udp的移植,能不嫩参考下你的代码呢?谢谢!
我邮箱937990986@qq.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 12:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表