分享

在stm32上采用ENC28J60 uip1.0实现udp通信的笔记

 败败0619 2012-03-25

在stm32上采用ENC28J60+uip1.0实现udp通信的笔记
一、移植中要做的修改(相当简单):
1、修改tapdev.c 中的tapdev_init(),tapdev_read(),tapdev_send();
void tapdev_init(void)
{
 Enc28j60Init(mac_addr);
}
unsigned int tapdev_read(void)
  {
    return Enc28j60PacketReceive(uip_buf, UIP_BUFSIZE );
  }
void tapdev_send(void)
{
 Enc28j60PacketSend(uip_buf, uip_len);
}
2、uip.h中的必要的配置及数据类型的定义;
3、uip.h中定义两个宏UIP_APPCALL(),UIP_UDP_APPCALL();
二、关于UIP_APPCALL(),UIP_UDP_APPCALL()
这两个宏定义为应用程序的两个函数.uip_udp_appcall()在uip_process中被调用两次,一次是在uip_input时,被调用以供用户提取有用的udp数据,uip_appdata该向长度为uip_len的udp数据包;另一次是在uip_process(UIP_UDP_TIMER)或者uip_process(UIP_UDP_SEND_CONN)时被调用,用来打包用户要发送的数据,只要在将数据填充到uip_appdata指针处,然后调用uip_udp_send(len),就可以完成数据的发送.


uip在udp通信时显得非常的不方便.
先从接收数据开始,在设备准备接收外部数据前,必须得先与对方建立一个连接,也就是将对方的IP信息赋给连接表,uip_input()完成接收的数据的解析,而只有当收到数据的来源与主机有连接的时候,数据包才会被接受,响应UIP_UDP_APPCALL();不禁的问一下,我要收数据,我是客户端,我如何知道主机的IP?难道这些东西都得约定好,固定不变?要这样当然也是可以的,但是通常情况似乎不是这样.所以,要程序移植时,这项功能的修改是必要的.
在发送方面,uip的udp发送要在uip_udp_appcall()中作出响应,而且也是以连接为通信基础.这似乎不符合我们的程序设计要求,把发送函数写为udp_sendto(addr,rport,lport)肯定更方便.所以,本人对程序进行修改,在uip_udp_appcall()中响应接收,将接收到的数据保存在缓冲中,然后交给程序进行功能解析,当要发送响应时,调用udp_sendto().
三、uip不方便使用中断执行tapdev_read();
由于接收与发送共用缓冲区,决定了它不可能在保证执行效率下,使用中断接收.要使用中断,你得为uip_buf另添buf区.


应用中只用到了uip的udp部分,该部分已经调试完成,应用层实现了uip_udp_read(),uip_udp_sendto()两个函数,调用方便;
通过测试,性能并不完美,ping响应时间<=1ms,出错率在1/500左右,有待更多优化,欢迎交流、指教。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多