搜索
bottom↓
回复: 27

uIP 中的 UDP 作为 接收方 的 配置

[复制链接]

出0入0汤圆

发表于 2009-11-21 18:42:48 | 显示全部楼层 |阅读模式
.小弟一个项目,要用单片机从网络中接收大量的数据  。按老大的说法,TCP 太慢,要用 UDP 方式。

搜索了以下,找到了 uIP ,接着就开始移植,TCP 方式 出奇的方便,没几下,就调出来了,但是 UDP 模式却怎样也不成功。

看一些网上一些例程,UDP初始化一般是用这样的代码

    uint16_t udpipaddr[2];
    uip_ipaddr(udpipaddr, 131,188,3,221);
    ntp_conn = uip_udp_new((u16_t*)udpipaddr, 37);


回调函数一般是类似这样

     if (uip_poll())
        {
            uip_appdata[0] = 'X';
            uip_appdata[1] = 0;
            uip_udp_send(1);
           。。。。。。。。
         }


但是这好像是作为主机,向其他设备发送数据。可我要得是接收别处发来数据。我问过我的一位同事,他是做这个项目的上位机部分,也就是 用UDP方式发送数据,按他的说法,他会向指定的一个IP和端口发送数据。

那我就晕了,我用 uIP 在 单片机上应该怎样接收它发来的数据,由于是接收方,所以应该不是像上面代码那样主动建立连接吧,那因该怎么样呢?Uip 的文档好像没有提供相应的说明。在这个项目中,好像应该是上位机作为主机,由它来建立连接,然后向我发送数据。那我的 uIP 因该怎样初始化呢?回调函数应该怎样写呢?找了好久,好像都是用UDP作为放送数据,很少看到有接收数据的。如果像 TCP 那样,直接监听一个端口就好了。接收方是不是一定要知道发送方的 IP 地址和端口号呢?能不能我把下位机的 IP和端口号固定,然后上位机直接向这个IP和端口发数据经行呢?

这几天都在搞这个东西,现在好迷惑。希望大家能给点建议,先谢谢大家了。

我的硬件平台是 atmega32 + enc28j60 .

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-11-22 21:18:21 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2009-11-22 21:30:27 | 显示全部楼层
你的例程好象是发送的

接收这样设置

UdpPcb = udp_new();
udp_bind(UdpPcb,IP_ADDR,port);       // 绑定本地IP地址
udp_recv(UdpPcb,UDP_Receive,NULL);   // 设置数据接收时的回调函数

出0入0汤圆

发表于 2010-2-26 11:04:46 | 显示全部楼层
请问楼主现在搞好了吗??我也在做类似的东西 加我QQ:343069192 大家交流交流

出0入0汤圆

发表于 2010-4-22 15:40:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-2 11:53:54 | 显示全部楼层
单片机里面udp数据包的基础上没有协议的话,就在mac的驱动的接收数据函数里面直接判断协议(udp)端口(port),使得话放到数据缓冲池,函数返回
不是的话就直接返回接收到的数据给上层程序
不用把udp协议做出来
发送udp数据的话也可以自己封udp包,直接写道mac中发送

出0入0汤圆

发表于 2011-1-14 17:34:27 | 显示全部楼层
gei hou

出0入0汤圆

发表于 2011-1-26 13:25:19 | 显示全部楼层
struct uip_udp_conn *myudp_conn;
void myudp_init(void)
{
    uip_ipaddr_t ipaddr;//定义IP类型变量
    uip_ipaddr(ipaddr, 192,168,1,116);   //远程IP为192.168.1.116
    if(myudp_conn != NULL)
    {
      uip_udp_remove(myudp_conn);//如果连接已经建立,则删除之
    }
   
    myudp_conn = uip_udp_new(&ipaddr, HTONS(1000));//建立到远程ipaddr,端口为1000的连接
    if(myudp_conn != NULL)
    {
        uip_udp_bind(myudp_conn, HTONS(2000));//绑定本地端口为2000,也就是2000-->1000 发数据
    }
}

void myudp_send(char *str,short n)
{

   char   *nptr;  
   nptr = (char *)uip_appdata;      
   memcpy(nptr, str, n);
   uip_udp_send(n);   //发送n个数据
}
void newdata()
{
    char   *nptr;
    short len;
    len = uip_datalen();//读取数据长度
    nptr = (char *)uip_appdata; //取得数据起始指针
    if(len<4)myudp_send("Please check the command!\n",26);
    else if(strncmp(nptr,"getname",7)==0)myudp_send("My name is Johnny.\n",19);
    else myudp_send("Unkown command!\n",16);
}
/*---------------------------------------------------------------------------*/
/** \internal
* The main UDP function.
*/
/*---------------------------------------------------------------------------*/
void myudp_appcall(void)
{
   if(myudp_conn->rport == HTONS(1000))
   {
     /*if(uip_poll()) {
       myudp_send("hello\n",6);//定时时间到,发hello
     }*/
     if(uip_newdata()) //如果指定IP的指定端口发来数据
     {
       newdata();     
     }
   }
}
最后需要定义一个宏
#define UIP_UDP_APPCALL myudp_appcall
放在uip.h

出0入0汤圆

发表于 2011-7-23 21:59:55 | 显示全部楼层
学习了,不错。mark

出0入0汤圆

发表于 2011-9-15 10:22:56 | 显示全部楼层
【7楼】 xieyx77
积分:2
派别:
等级:------
来自:
******************************
网上说udp上面有bug,请问其它地方修改了吗?

出0入0汤圆

发表于 2011-9-15 13:44:41 | 显示全部楼层
ding!
我现在也是uip1.0的udp不通讯哈!

出0入0汤圆

发表于 2011-9-16 00:11:32 | 显示全部楼层
为什么我现在能发送数据给PC机。但是接收不到PC机发送过来的数据!

出0入0汤圆

发表于 2011-9-16 10:53:51 | 显示全部楼层
顶!
我现在udp通讯发送数据是成功,但是接受数据一直不成功哈!》。

出0入0汤圆

发表于 2011-9-28 21:15:03 | 显示全部楼层
回复【13楼】microcreat
-----------------------------------------------------------------------

udp主动连接的程序能发给我一份看看吗?252655388@qq.com

出0入0汤圆

发表于 2011-12-20 19:57:54 | 显示全部楼层
回复【2楼】sufeila
-----------------------------------------------------------------------

你这个是LWIP的吧,他想用UIP做

出0入0汤圆

发表于 2011-12-21 07:45:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-17 19:40:20 | 显示全部楼层
我下位机通过UDP发送数据,可PC总是接受不到

出0入0汤圆

发表于 2012-2-29 09:57:02 | 显示全部楼层
我现在的是下位机可以接收到PC发过来udp数据,下位机也可以给PC发udp数据,但是重新上电的时候,只能PC先给下位机发一次UDP数据后,下位机的UDP数据才能发给PC,我想让下位机一上电就能给PC发送数据,应该怎么弄呢?是固定IP还是在发送的时候绑定IP和端口呢?

出0入0汤圆

发表于 2012-5-14 22:50:01 | 显示全部楼层
我也想实现19楼的功能,现在主动发送放在udp接收循环里面,第一次发arp包,第二次就能发udp数据了,但是当加个if语句就不行了,

出0入0汤圆

发表于 2012-5-14 22:51:22 | 显示全部楼层
if(标志位)   //在串口中断里置位
{
发送();
}
一直在发arp请求包,但是 PC机不回应.

出0入0汤圆

发表于 2012-5-17 00:49:13 | 显示全部楼层
做好了没,希望分享一下思路

出0入0汤圆

发表于 2012-11-15 10:13:47 | 显示全部楼层
我也在做,分享下思路。

出0入0汤圆

发表于 2012-12-20 13:51:00 | 显示全部楼层
UDP 不用UIP 也很好做 ,接收用中断,发送主动,直接对数据打包封装就可以,但是TCP 就麻烦 现在正在搞

出0入0汤圆

发表于 2012-12-21 14:03:56 | 显示全部楼层
uip的UDP  无法接收 也无法发送  TCP倒是很顺利,求解  :

出0入0汤圆

发表于 2012-12-21 15:41:36 | 显示全部楼层
本帖最后由 orzorzorzorz 于 2012-12-21 15:53 编辑

/*******************************************************************************
*        函数名: udp_app_init
*        输  入: 无
*        输  出: 无
*        功能说明:设置需要监听的UDP端口,这个函数在 uip_init() 以后调用。
*******************************************************************************/
void udp_app_init(void)
{
//服务器
        /* 开始监听UDP端口LPORT */
        //uip_listen(HTONS(LPORT));
        uip_listen(HTONS(g_NetPara.udpserverport));
    uip_udp_bind(&uip_udp_conns[0], HTONS(g_NetPara.udpserverport));

//客户端
    uip_ipaddr_t addr;
    struct uip_udp_conn *c;
    uip_ipaddr(addr,g_NetPara.udpdstipaddr[0],g_NetPara.udpdstipaddr[1],g_NetPara.udpdstipaddr[2],g_NetPara.udpdstipaddr[3]);
    c = uip_udp_new(&addr, HTONS(g_NetPara.udpdstport));
    if(c != NULL) {
        uip_udp_bind(c, HTONS(1999));
    }

    tcpudp_sendlen = 0;
    tcpudp_sendflag = 0;
}

/*******************************************************************************
*        函数名: udp_app_call
*        输  入: 无
*        输  出: 无
*        功能说明:这是一个回调函数
        在h文件中,我们定义UIP_UDP_APPCALL的宏等于udp_app_call
*                当uip事件发生时,UIP_UDP_APPCALL函数会被调用。
*                例如: 当一个UDP连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件
*******************************************************************************/
void udp_app_call(void)
{
    //服务器模式
    if (uip_udp_conn->lport == (HTONS(g_NetPara.udpserverport)))
    {
            if (uip_newdata())//接收到一个新的UDP数据包,准备需要发送数据
            {
                    udp_newdata();
            }
    }

    //客户端模式
    if(uip_udp_conn->rport == (HTONS(g_NetPara.udpdstport)))
    {
        if (uip_poll())
        {
            if(tcpudp_sendflag)
            {
                tcpudp_sendflag = 0;
                uip_send(tcpudp_buf, tcpudp_sendlen);
            }
        }
        else if (uip_newdata())
        {
            udp_newdata();
        }   
    }
}

出0入0汤圆

发表于 2013-8-22 22:52:48 | 显示全部楼层
看完了,还是没弄明白

出0入0汤圆

发表于 2013-8-25 10:17:34 | 显示全部楼层
orzorzorzorz 发表于 2012-12-21 15:41
/*******************************************************************************
*        函数名: udp_app_i ...

请问,我现在用vc6.0编写一个UDP接受程序就可以了,接收到的程序在vc里直接存在txt里,接收stm32发出来的数据,你这个程序可以用吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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