搜索
bottom↓
回复: 248

嵌入式以太网uIP应用笔记

  [复制链接]

出0入0汤圆

发表于 2013-6-12 14:40:51 | 显示全部楼层 |阅读模式
本帖最后由 xukai871105 于 2013-6-12 15:26 编辑

1.前言
    最近半年的时间一直在学习应用嵌入式以太网。虽然学习的动机仅仅是玩玩,但是以太网真的深深吸引了我。这里我和各位分享一下uIP的使用经验,希望对大家有所帮助。uIP是一个简单好用的嵌入式网络协议栈,易于移植且消耗的内存空间较少,非常适合学习和使用。可以肯定的说uIP是嵌入式以太网学习的好起点,但不一定是终点。毫无疑问的说,uIP的功能远不如LwIP强大,但两者并没有孰优孰劣之分,uIP和LwIP的作者同为Adam Dunkels,LwIP在前uIP在后,uIP经过这几年的发展从IPV4迁移到IPV6,最终可以适用于无线传感网络。总的来说,uIP是一个很好的起点,学好uIP可以迁移到LwIP,也可以迁移到uIPV6。
    下面稍微啰嗦一下,先推荐两本图书。本人喜欢读书,书中的论述比较完整,调理液清晰一些。
1.1推荐图书资料
    《基于IP的物联网架构、技术与应用》。图书的作者之一adam dunkels为uIP和LwIP的作者,虽然uIP在书中只占非常小的一部分,但是这本书的信息量非常大,技术非常新颖。书中提到的PACHUBE即是在论坛打广告乐为物联的原型。
    《嵌入式Internet TCP IP基础、实现及应用》。本书的TCP IP部分介绍的非常详细,书中有实现嵌入式以太网的代码分析。本书的作者也设计了一套功能完善的TCP IP协议栈。结合书中前半部分的基础和中部的实现,会有非常大的收获。

1.2其他网络资料
    第一次有学习嵌入式以太网的冲动便从淘宝上购入ENC28J60模块,卖家提供的源码为国外AVRNET项目的源码。如果耐心一点认真分析AVRNET项目的源代码,并不断修改实践,收获颇丰。顺着ARP、IP、ICMP、UDP、TCP写了几个帖子,算是自己对嵌入式以太网的第一个总结。在这里再次贴一下链接。
http://www.amobbs.com/thread-5519452-1-1.html 【ARP部分】
http://www.amobbs.com/thread-5519494-1-1.html 【IP和ICMP部分】
http://www.amobbs.com/thread-5519530-1-1.html 【UDP部分】
http://www.amobbs.com/thread-5519592-1-1.html 【TCP部分】
    在这一系类帖子中,还欠了一个HTTP的帖子。通过大家的关注度我发现,ARP部分关注的人最少,因为这个离HTTP最远。包括我在内,得到网络模块ENC28J60的第一个反应就是如果实现网页(HTTP)控制LED灯,读取温度湿度数据。现在回过头来看看基础还是非常重要的。呵呵。
2.搭建实验环境
    先讲一下如何搭建实验环境。我个人倾向于把开发板接到路由器上,而调试使用的PC机通过有线或者无线也接到PC机上,先保证开发板和PC机接入同一个路由器。由于uIP不支持DHCP(只能说不直接支持),所以需要保证开发板和PC位于相同的子网,开发板的IP地址、路由器地址和子网掩码都需要手动设定。设定之前最好看看调试PC机的IP地址和路由器(网关)地址。例如调试PC机的IP地址如下图所示。

    之后便可确定路由器的IP地址为192.168.1.1。那么开发板的IP地址可以设定为 192.168.1.2到192.168.1.255。为保证你的调试万无一失,还是建议您访问路由器,确认现在有哪些设备连入了路由器。该步骤的主要功能是避免IP地址重复。
3.硬件和软件说明
    3.1硬件环境:
    奋斗开发板。奋斗开发板上有一片ENC28J60,ENC28J60通过SPI接口控制内部寄存器,并有中断输出接口。STM32通过SPI1和ENC28J60相连。具体接口如下:

    SPI1_MISO@PA6
    SPI1_MOSI@PA7
    SPI1_SCK@PA5
    ENC28J60_CS@PA4
    ENC28J60_INT@PA1(不过本例并没有使用外部中断,不过LwIP中推荐使用外部中断)
    由于SPI上同时挂在其他SPI从设备,所有初始化的过程中需要通过操作CS端口禁止其他SPI从设备。(别小看这步,调试的时候在这步花费了非常多的时间)其他SPI从设备包括SST25VF016,CS端位于PC5;VS1003,CS端口位于PB12。
    3.2其他说明
    串口调试位于UART1。有三个LED灯分别位于PB.5,PD.6和PD.3。如果您的开发板和有存在差别,请按照顺序修改相关IO口,并打开相应RCC时钟。
    3.3软件说明
    工具链为EWARM 5.5(如果是EWARM 6.X请修改相关CMSIS选项)
4.网卡驱动
    网卡驱动采用ENC28J60。具体可参考论坛中的另一个帖子http://www.amobbs.com/thread-5519381-1-1.html
    需要说明的是ENC28J60的驱动也是参考网上资料的。但是帖子中有若干说明,详细分析了如何使用ENC28J60,需要深入理解两点,第一点如何通过SPI发送命令和数据;第二点理解ENC28J60的缓冲区,在发送以太网和接受以太网数据包的过程中,ENC28J60会帮助用户做些额外的工作,例如发送时自动填充SFD,在读取接收缓冲区数据时会包含若干状态信息,包括数据包长度和CRC校验结果等。如果你比较“速食”可以跳过该部分内容,如果你比较“耐心”可以花点时间看看。其他的以太网驱动芯片包括RF芯片也遵循相同的规律,可以做到触类旁通。
5.一个简单有效的定时器
    TCP通信为了保证可靠性需要采用定时重传等安全机制,所以需要一个简单有效的定时器。设计定时器的方法很多,在这里推荐uIP原作者的timer模块。简单说timer模块的原理类似于MCU硬件中的比较匹配原理,timer模块中有一个全部变量counter,每次MCU发生某个定时器中断时累加1,如果某个任务需要使用定时器服务,在该任务中声明一个timer(在该任务中为全局变量),并记录此时的counter值,在本任务中声明的timer何时发生软件溢出呢?查询现在的counter和被记录的counter的差值,如果差值超过间隔值那么软件定时器timer溢出(类似于发生比较匹配中断),那么任务该做点什么了。软件定时器的主要目的有两个。第一,更新TCP或UDP连接,第二,更新ARP缓冲区(ARP表)。虽然uIP在功能上比LwIP简单的多,但是LwIP也有类似的部分(或者说完全一样)。
    详细代码如下:
  1. #include "timer.h"
  2. #include "stm32f10x_it.h"

  3. /* 全局变量 定时器计数值 */
  4. uint16_t current_clock = 0;

  5. void timer_config(void)
  6. {
  7. /* Systick时钟每s触发一次CLOCK_SECOND次 */
  8. if (SysTick_Config(SystemCoreClock / CLOCK_SECOND))
  9. {
  10. while (1);
  11. }
  12. }

  13. void SysTick_Handler(void)
  14. {
  15. /* 时间标志累加 */
  16. current_clock++;
  17. }

  18. uint16_t clock_time(void)
  19. {
  20. return current_clock;
  21. }

  22. void timer_set(timer_typedef* ptimer,uint16_t interval)
  23. {
  24. /* 设置时间间隔 */
  25. ptimer->interval = interval;
  26. /* 设置启动时间 */
  27. ptimer->start = clock_time();
  28. }

  29. void timer_reset(timer_typedef * ptimer)
  30. {
  31. ptimer->start =ptimer->start + ptimer->interval;
  32. }

  33. int8_t timer_expired(timer_typedef* ptimer)
  34. {
  35. /* 一定要装换为有符号数,进行数学比较时,多使用有符号数 */
  36. if((int16_t)(clock_time() - ptimer->start) >= (int16_t)ptimer->interval)
  37. return 1;
  38. else
  39. return 0;
  40. }
复制代码

6.uIP基本结构与配置
    6.1 uIP基本结构
    uIP的代码编写需要遵守一定的结构,而且这种结构最好保持稳定(保持不变)。这个结构主要做以下几个部分任务。
    1.获得以太网数据包
    2.处理ARP报文
    3.处理IP报文
    4.定期处理TCP和UDP连接
    5.定期更新ARP缓冲区
  1. /* 引用头文件 *****************************************************************/
  2. #include "stm32f10x.h"
  3. #include <stdio.h>

  4. #include "uip.h"
  5. #include "uip_arp.h"

  6. #include "tapdev.h"
  7. #include "enc28j60.h"

  8. #include "bsp_spi1.h"
  9. #include "bsp_usart.h"
  10. #include "timer.h"

  11. /* 私有数据类型 ***************************************************************/
  12. // BUF指向uIP缓冲区 uip_eth_hdr为以太网首部结构体
  13. // 6字节目标MAC地址 6字节源MAC地址 2字节类型
  14. #define BUF ((struct uip_eth_hdr *)&uip_buf[0])

  15. /* 私有常数宏 *****************************************************************/
  16. /* 私有动作宏 *****************************************************************/
  17. /* 私有变量 *******************************************************************/
  18. /* 私有函数声明 ***************************************************************/
  19. void GPIO_Config(void);
  20. /* 私有函数 ******************************************************************/

  21. int main(void)
  22. {
  23. timer_typedef periodic_timer, arp_timer;
  24. uip_ipaddr_t ipaddr;

  25. /* 设定查询定时器 ARP定时器 */
  26. timer_set(&periodic_timer, CLOCK_SECOND / 2);
  27. timer_set(&arp_timer, CLOCK_SECOND * 10);

  28. GPIO_Config(); /* 禁止SPI其他设备,防止窜扰 */

  29. timer_config(); /* 配置systic作为1ms中断 */
  30. BSP_ConfigSPI1();

  31. tapdev_init(); /* 网卡初始化,ENC28J60,包括MAC地址初始化 */
  32. uip_init(); /* UIP协议栈初始化 */
  33. uip_ipaddr(ipaddr, 192,168,1,15); /* 设置IP地址 */
  34. uip_sethostaddr(ipaddr);
  35. uip_ipaddr(ipaddr, 192,168,1,1); /* 设置默认路由器IP地址 */
  36. uip_setdraddr(ipaddr);
  37. uip_ipaddr(ipaddr, 255,255,255,0); /* 设置网络掩码 */
  38. uip_setnetmask(ipaddr);

  39. example1_init(); /* 用户任务初始化 为TCP echo任务*/
  40. // example2_init();

  41. BSP_ConfigUSART1(); /* 初始化串口 重定义putchar */
  42. printf("\r\nuip start!\r\n"); /* 打印IP地址 */
  43. printf("ipaddr:192.168.1.15\r\n");

  44. printf("eID:xukai871105\r\r"); /* 打印个人信息,呵呵*/
  45. printf("");

  46. while (1)
  47. {
  48. uip_len = tapdev_read(); /* 读取以太网数据包,返回数据长度 */
  49. if(uip_len > 0) /* 收到数据 */
  50. {
  51. if(BUF->type == htons(UIP_ETHTYPE_IP)) /* 收到IP数据包 */
  52. {
  53. uip_arp_ipin();
  54. uip_input();

  55. if (uip_len > 0)
  56. {
  57. uip_arp_out();
  58. tapdev_send();
  59. }
  60. }

  61. else if (BUF->type == htons(UIP_ETHTYPE_ARP)) /* 收到ARP数据包 */
  62. {
  63. uip_arp_arpin();
  64. if (uip_len > 0)
  65. {
  66. tapdev_send();
  67. }
  68. }
  69. }

  70. if(timer_expired(&periodic_timer)) /* 查询定时器是否超时 */
  71. {
  72. timer_reset(&periodic_timer);
  73. GPIOB->ODR ^= GPIO_Pin_5; /* 测试使用,表现为LED灯闪烁 */

  74. for(uint8_t i = 0; i < UIP_CONNS; i++) /* 查询并处理所有TCP连接*/
  75. {
  76. uip_periodic(i);
  77. if(uip_len > 0)
  78. {
  79. uip_arp_out();
  80. tapdev_send();
  81. }
  82. }

  83. #if UIP_UDP
  84. for(uint8_t i = 0; i < UIP_UDP_CONNS; i++) /* 查询并处理所有UDP连接*/
  85. {
  86. uip_udp_periodic(i);
  87. if(uip_len > 0)
  88. {
  89. uip_arp_out();
  90. tapdev_send();
  91. }
  92. }
  93. #endif /* UIP_UDP */
  94. if (timer_expired(&arp_timer)) /* ARP定时是否溢出 */
  95. {
  96. timer_reset(&arp_timer);
  97. uip_arp_timer();
  98. }
  99. }
  100. }
  101. }
复制代码
做几点简单说明

    1.#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
    指向uIP缓冲区,强制类型转化为uip_eth_hdr结构体,uip_eth_hdr即为以太网首部结构,6字节目标MAC地址 6字节源MAC地址 2字节类型。
    2. tapdev_init();tapdev_read();tapdev_send();
    三个函数为以太网操作函数,只有tapdev_read有返回值,其他函数即无输入参数也无返回参数。这三个函数便是ENC28J60操作的三个封装,ENC28J60发送或接收直接操作uIP的两个全局变量uip_buf和uip_len。
    具体代码如下:
  1. #include "tapdev.h"
  2. #include "uip.h"
  3. #include "uip_arp.h"

  4. #include "enc28j60.h"

  5. // MAC地址
  6. struct uip_eth_addr uip_mac;
  7. static unsigned char ethernet_mac[6] = {0x00,0x14,0x0B,0x3F,0x04,0xB1};
  8. void tapdev_init(void)
  9. {
  10. enc28j60_init(ethernet_mac); /*初始化enc28j60 赋值MAC地址*/
  11. for (uint8_t i = 0; i < 6; i++)
  12. {
  13. uip_mac.addr[i] = ethernet_mac[i];
  14. }
  15. uip_setethaddr(uip_mac); /* 设定uip mac地址*/
  16. }

  17. uint16_t tapdev_read(void)
  18. {
  19. return enc28j60_packet_receive(uip_buf,1500);
  20. }
  21. void tapdev_send(void)
  22. {
  23. enc28j60_packet_send(uip_buf,uip_len);
  24. }
复制代码
  6.2 uIP配置部分
    IP地址配置:
    IP地址设置包括,本地IP地址,网关地址和子网掩码。具体代码如下:
    MAC地址配置:
    MAC的地址较为特殊,由于ENC28J60本身没有唯一的EUI-48(俗称MAC地址)地址,所以EUI-48地址需要手动配置。该地址不但应用于ENC28J60也应用于uIP。相关代码在上一小节已说明。   
  6.3 uip-conf.h部分
        uip-conf部分说明三点
        1.如果不熟悉请保留默认参数,例如UIP_CONF_MAX_CONNECTIONS等
        2.如果设置UIP_CONF_LOGGING为1,请添加void uip_log(char *m){}
        3.必须包含用户任务头文件,且放在该头文件的最后。例如添加#include "example1.h"。这样做的主要目的便是定义uip_tcp_appstate_t和UIP_APPCALL两个关键参数。
        具体代码如下

  1. #ifndef __UIP_CONF_H
  2. #define __UIP_CONF_H

  3. #include <inttypes.h>

  4. typedef uint8_t u8_t;
  5. typedef uint16_t u16_t;
  6. typedef unsigned short uip_stats_t;

  7. /* 最大TCP连接数 */
  8. #define UIP_CONF_MAX_CONNECTIONS 10
  9. /* 最大端口监听数 */
  10. #define UIP_CONF_MAX_LISTENPORTS 10
  11. /* uIP 缓存大小*/
  12. #define UIP_CONF_BUFFER_SIZE 1500
  13. /* CPU字节顺序 */
  14. #define UIP_CONF_BYTE_ORDER UIP_LITTLE_ENDIAN
  15. /* 日志开关 */
  16. #define UIP_CONF_LOGGING 1
  17. /* UDP支持开关*/
  18. #define UIP_CONF_UDP 0
  19. /* UDP校验和开关 */
  20. #define UIP_CONF_UDP_CHECKSUMS 1
  21. /* uIP统计开关 */
  22. #define UIP_CONF_STATISTICS 1

  23. // 加入用户任务头文件
  24. #include "example1.h"

  25. #endif
复制代码
7.案例1——最简单的TCP echo程序
    先来一个最简单的TCP程序。uIP作为server,IP地址为192.168.1.15。PC机做client,IP地址为192.168.1.10X。
    1.在网络调试助手中,选择以太网通信种类为client(表示PC机为Client),IP地址输入192.168.1.15,端口号输入1234。最后点击连接。
    2.在发送区域输入任意内容,点击发送数据。
    3.观察返回结果,是否和发送数据相同。
    为了实现该功能新建example1.c和example1.两个文件。代码如下
  1. #ifndef __EXAMPLE1_H
  2. #define __EXAMPLE1_H

  3. #include "uipopt.h"

  4. // 应用程序状态 如果不使用可以定义为int或者其他类型
  5. typedef int uip_tcp_appstate_t;
  6. // 定义应用程序 并指定UIP_APPCALL宏定义
  7. void example1_appcall(void);
  8. #ifndef UIP_APPCALL
  9. #define UIP_APPCALL example1_appcall
  10. #endif
  11. void example1_init(void);

  12. #endif
复制代码

  1. #include "example1.h"
  2. #include "uip.h"
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdint.h>

  6. void example1_init(void)
  7. {
  8. uip_listen(HTONS(1234));
  9. }

  10. void example1_appcall(void)
  11. {
  12. if( uip_newdata() )
  13. {
  14. // 输出远程IP和端口号
  15. printf("remote ip addr:%d.%d.%d.%d\r\n",
  16. (uip_conn->ripaddr[0]) & 0X00ff,
  17. (uip_conn->ripaddr[0]) >> 8,
  18. (uip_conn->ripaddr[1]) & 0X00ff,
  19. (uip_conn->ripaddr[1]) >> 8
  20. );
  21. printf("remote ip port:%d\r\n",HTONS(uip_conn->rport));
  22. // TCP ECHO
  23. uip_send(uip_appdata,uip_len);
  24. }
  25. }
复制代码
实验结果如下图所示。

     代码做如下分析

    1.uip_listen(HTONS(1234));侦听1234端口,
    2.uip_newdata()即查询uip_buf中是否有新数据,如果返回1的话,任务需要做些什么了。
    3.uip_send(uip_appdata,uip_len);uip_send为发送数据包函数
    4.uip_appdata指向用户数据,所谓用户数据即TCP负载数据,例如网络调试助手发送xukai871105,那么uip_appdata指向xukai871105.
    5.uip_len为用户数据长度,若串口调试助手发送xukai871105,那么uip_len为11。

8.wireshark网络包分析
    程序虽然简单,但是TCP通过过程还是可以好好分析一下的。通过wireshark软件抓取整个通信过程。

    其中192.168.1.102为调试PC机(下文简称PC机),192.168.1.15为uIP嵌入式开发板(下文简称uIP)。

===================================================
1.建立连接阶段
【36】PC机向uIP发送SYN,表示请求连接(点击网络调试助手的连接按钮)
【37】uIP向PC机返回ACK,同时发送SYN(注意若接收到SYN标志,必须返回ACK)
【38】PC机向uIP发送应答ACK,表示该次TCP连接成功。
===================================================
2.数据交换阶段(负载数据包假定为1234)
【51】PC机向uIP发送1234,标志位PSH+ACK,表示该数据包需要立即处理,并需要应答
【52】uIP向PC机返回1234,标志位PSH+ACK,表示该数据包需要立即处理,并需要应答
【53】PC机返回应答,表示PC机接收到echo数据包。
此时数据交换完成,若在网络调试助手再次点击发送,便重复51到53部分。
===================================================
3.关闭连接部分
【65】PC机要求停止连接,发送FIN标志。(点击网络调试助手的关闭按钮)
【66】uIP返回FIN+ACK,表示同意结束本次TCP连接。
【67】PC机发送ACK,表示收到了uIP的FIN。(至此,TCP连接完全结束)
===================================================
9.案例2——uip_poll中发送数据
    uip中发送数据包要稍微复杂一些。若使用uIP如果不做特殊处理的话,只能在uIP用户任务中发送以太网数据包,而不能在其他的任务中发送。虽然有人说这是uIP的bug,不过我并不认同。在多个uIP示例代码中,均定义了用户任务本身状态,例如任务处于发送状态还是接受状态,任务有独立的发送缓冲区或接收缓冲区并记缓冲区的大小。

    设计一个简单的任务说明uip_poll的应用。
    1.uIP作为server,IP地址为192.168.1.15,侦听端口端口为1234,PC机通过网络调试助手连接uIP。
    2.建立连接之后,uIP主动发送10个数据包,数据包之前间隔1S。

    3.发送完数据包只收,uIP主动关闭连接。
    详细代码请查看工程附件。
    实验结果,uIP向PC机连续发送10次数据,并最后主动终止连接

10.总结
    1.掌握嵌入式以太网需要较多的背景知识,只能在实践的过程中一点一滴积累。回过头来想想自己的学习嵌入式以太网的经历,多数时间多是在急躁和失望中度过。唯有耐心与细致并不断学习基础知识才可以把问题解决,最终把想法变成现实

    2.uIP功能简单,但是易于使用。如果觉得uIP在实际中难以发挥作用的话,还有LwIP作为补充。虽然两者存在功能上的差异,但是TCP连接还是那几个——SYN、ACK、PSH、FIN标志位。LwIP提供套接字通信,这使得嵌入式以太网应用和PC机上的以太网应用变得极为相似。

    3.由于TCP协议属于运输层协议,TCP传输的内容本身并没有含义,这些被传输的数据需要被赋予含义才可以使用。从工业控制来说,MODBUS协议可以应用与TCP协议(本帖子是对modbus tcp的铺垫),并可以实现完善的检测与控制功能。从其他应用来说,嵌入式系统可以提供HTTP通信、提供web service应用,通过解析JSON格式等手段实现更广泛的应用。

    最后感谢大家的关注,我一定继续努力。若有描述错误的地方请指出,定当更正。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

 楼主| 发表于 2013-6-12 15:27:53 | 显示全部楼层
自己写顶一个,没想到写完这么累啊!

出0入0汤圆

发表于 2013-6-12 16:34:19 | 显示全部楼层
发帖好认真啊,看见过你的帖子,每次都好详细,佩服!

出0入0汤圆

发表于 2013-6-12 17:12:03 | 显示全部楼层
学习uIP的好资料,谢谢楼主分享自己的探索经验

出0入0汤圆

发表于 2013-6-12 17:27:14 | 显示全部楼层
顶楼主经验分享

出0入0汤圆

发表于 2013-6-12 17:37:33 | 显示全部楼层
谢谢楼主经验分享                                                                                                                                             

出0入0汤圆

发表于 2013-6-12 18:00:23 | 显示全部楼层
四个字:楼主好人.

出0入4汤圆

发表于 2013-6-12 18:44:09 | 显示全部楼层
较好,有空慢慢看。

出0入0汤圆

发表于 2013-6-12 19:45:22 | 显示全部楼层
不错 楼主做事很用心。

出0入0汤圆

发表于 2013-6-12 19:49:08 | 显示全部楼层
谢谢楼主经验分享   

出0入0汤圆

发表于 2013-6-12 19:52:52 | 显示全部楼层
mark!!!!!!!!

出0入0汤圆

发表于 2013-6-12 19:55:40 | 显示全部楼层
楼主出品必属精品。收藏。。。

出0入0汤圆

发表于 2013-6-12 20:09:05 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2013-6-12 20:42:00 | 显示全部楼层
ENC28J60 这货特别耗电,我的电路板用AMS1117供电,结果用不了几分钟甚至不到1分钟就可能死机,AMS1117和ENC28J60 都很烫,拆掉这个ENC28J60 芯片,好像就不死机了。

出0入0汤圆

发表于 2013-6-12 20:44:05 | 显示全部楼层
楼主的帖子总是很精良

出0入0汤圆

发表于 2013-6-12 20:45:03 | 显示全部楼层
uip已有模式为客户端模式,解析接收到的数据帧,获得远端ARP和IP信息,然后回复数据。

而uip的主动上传这个部分,折腾了好一段时间才弄出来,

出0入0汤圆

发表于 2013-6-12 20:52:25 | 显示全部楼层
本帖最后由 mint 于 2013-6-12 20:58 编辑

顶楼主~~~
看了楼主之前的帖子,解剖了一个类似的开源TCP/IP(STM32),有机会和楼主多多交流~~~
http://blog.csdn.net/fovwin/article/category/1398794

传个《基于IP的物联网架构、技术与应用》的英文版,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-6-12 20:57:43 | 显示全部楼层
谢谢楼主经验分享  

出0入0汤圆

发表于 2013-6-13 07:49:03 来自手机 | 显示全部楼层
谢谢,楼主厉害

出0入0汤圆

发表于 2013-6-13 08:00:31 来自手机 | 显示全部楼层
不错,很用心的总结

出0入0汤圆

发表于 2013-6-13 08:25:45 | 显示全部楼层
学习了 感谢分享~

出0入0汤圆

发表于 2013-6-13 09:06:23 | 显示全部楼层
感谢楼主无私的分享!

出0入0汤圆

 楼主| 发表于 2013-6-13 09:09:06 | 显示全部楼层
mint 发表于 2013-6-12 20:52
顶楼主~~~
看了楼主之前的帖子,解剖了一个类似的开源TCP/IP(STM32),有机会和楼主多多交流~~~
http://bl ...

CSDN上面的那个例子分析的非常清楚!不知能否在本论坛转载一下!
大家一起学习一下!

出0入0汤圆

 楼主| 发表于 2013-6-13 09:09:44 | 显示全部楼层
蓝胖子 发表于 2013-6-12 20:42
ENC28J60 这货特别耗电,我的电路板用AMS1117供电,结果用不了几分钟甚至不到1分钟就可能死机,AMS1117和EN ...

请问有上面更好的推荐吗??

出0入0汤圆

发表于 2013-6-13 09:11:01 | 显示全部楼层
楼主好人啊 网络部分看完楼主的帖子大概有所了解了
谢谢

出0入0汤圆

发表于 2013-6-13 09:16:07 | 显示全部楼层
相当深入和详细的帖子,感谢楼主付出,佩服这种态度

出0入0汤圆

发表于 2013-6-13 09:47:02 | 显示全部楼层
非常感谢楼主经验分享                                                                                                                                             

出0入0汤圆

发表于 2013-6-13 10:18:30 | 显示全部楼层
xukai871105 发表于 2013-6-13 09:09
请问有上面更好的推荐吗??

当然有,在使用一段时间后你还会发现ENC28J60还存在诸多的硬件BUG,不知道现在的修正了没;推荐DM9000

出0入0汤圆

发表于 2013-6-13 11:02:32 来自手机 | 显示全部楼层
好东东,谢谢楼主辛苦了。俺要好好学一下。

出0入0汤圆

发表于 2013-6-13 12:30:53 来自手机 | 显示全部楼层
好帖,收藏了…
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端

出0入0汤圆

 楼主| 发表于 2013-6-13 13:01:44 | 显示全部楼层
arm7tdmi 发表于 2013-6-12 18:00
四个字:楼主好人.

感谢您的评论!希望对大家有帮助吧,我第一次看uIP的时候也是看的头都晕了。要是还没有用过uIP的话,希望看完这个帖子可以不晕一些!
呵呵!

出0入0汤圆

发表于 2013-6-13 18:25:12 | 显示全部楼层
xukai871105 发表于 2013-6-13 09:09
CSDN上面的那个例子分析的非常清楚!不知能否在本论坛转载一下!
大家一起学习一下! ...

这是我看了你的之后,加入了《TCP/IP协议栈》的内容~~~
大家不嫌弃的话就贴过来吧~~~

出70入0汤圆

发表于 2013-6-13 20:25:10 | 显示全部楼层
最近项目用到udp,学习下!

出0入0汤圆

发表于 2013-6-14 08:56:10 | 显示全部楼层
好人就是你

出0入0汤圆

发表于 2013-6-14 15:06:32 | 显示全部楼层
mark一下 晚上看看怎么样

出0入0汤圆

发表于 2013-6-15 08:31:48 | 显示全部楼层
在学着用lwip,也了解下,学习

出0入17汤圆

发表于 2013-6-15 08:58:12 | 显示全部楼层
好帖,讲的很详细~~~~~~~

出0入0汤圆

发表于 2013-6-15 10:26:15 | 显示全部楼层
学习  UIP

出0入0汤圆

发表于 2013-6-27 12:09:17 | 显示全部楼层
收藏经验

出0入0汤圆

发表于 2013-6-27 12:45:13 | 显示全部楼层
好帖,学习了。。

出0入0汤圆

发表于 2013-7-6 15:43:01 | 显示全部楼层
写的太好了,谢谢楼主.我也要用一下uip.

出0入0汤圆

发表于 2013-7-7 08:56:53 来自手机 | 显示全部楼层
好详细,技术高手

出0入0汤圆

 楼主| 发表于 2013-7-7 16:59:27 | 显示全部楼层
czg94215 发表于 2013-7-6 15:43
写的太好了,谢谢楼主.我也要用一下uip.

uIP还是很好用的,相比于LwIP简单一些,上手可以快一点!

出0入0汤圆

 楼主| 发表于 2013-7-7 16:59:49 | 显示全部楼层
chenfzg 发表于 2013-7-7 08:56
好详细,技术高手

夸奖了,慢慢积累的结果!

出0入0汤圆

发表于 2013-7-8 19:21:43 | 显示全部楼层
今天把头看痛了,还好明白是怎么一个回事了

出0入0汤圆

 楼主| 发表于 2013-7-8 20:49:40 | 显示全部楼层
czg94215 发表于 2013-7-8 19:21
今天把头看痛了,还好明白是怎么一个回事了

真的非常抱歉,把你看头疼了。
其实把复杂的东西说简单明了,真的非常困难。

出0入0汤圆

发表于 2013-7-9 13:48:17 | 显示全部楼层
为什么我按照楼主你的样子移植过后,不能ping通呢. 用你的例子就可以ping通, 我 把你的程序也改成SPI2接口了.  调 试的时候也能进入uip_arp_arpin(); .enc28j60驱动和你的一模一样

出0入4汤圆

发表于 2013-7-9 15:19:44 | 显示全部楼层
mark mark mark

出0入0汤圆

发表于 2013-7-9 15:35:57 | 显示全部楼层
非常牛的帖子,谢谢分享!

出0入0汤圆

发表于 2013-7-9 17:26:34 | 显示全部楼层
楼主好人在吗. 我的uip不工作原来是开了tim1的PWM.关掉就能ping通了. 但是连接很慢,不像你的一点连接 就马上能连接上. 不知道是怎么回事.

出0入0汤圆

发表于 2013-7-9 17:28:21 | 显示全部楼层
make一下!!!!!

出0入0汤圆

发表于 2013-7-9 21:22:35 | 显示全部楼层
好贴,收藏

出0入4汤圆

发表于 2013-7-10 14:11:16 | 显示全部楼层
请楼主提供个可用的proteus 7.10 sp0,谢谢

出0入0汤圆

 楼主| 发表于 2013-7-10 15:55:44 | 显示全部楼层
czg94215 发表于 2013-7-9 17:26
楼主好人在吗. 我的uip不工作原来是开了tim1的PWM.关掉就能ping通了. 但是连接很慢,不像你的一点连接 就马 ...

检查一下你的定时器的时间,10ms溢出周期还是100ms溢出周期

顺便检查网络,路由器是不是在疯狂的ARP

出0入0汤圆

 楼主| 发表于 2013-7-10 15:57:07 | 显示全部楼层
dadian 发表于 2013-7-10 14:11
请楼主提供个可用的proteus 7.10 sp0,谢谢

我手头有atmega32 uip的例子,可以编译通过,但是带入proteus仿真总是问题,会停在一个地方!

如果你坚持要,我一定给你,你可以帮我检查原因!

出0入0汤圆

发表于 2013-7-11 12:33:15 | 显示全部楼层
MARK~~~~~~

出0入4汤圆

发表于 2013-7-11 15:11:37 | 显示全部楼层
xukai871105 发表于 2013-7-10 15:57
我手头有atmega32 uip的例子,可以编译通过,但是带入proteus仿真总是问题,会停在一个地方!

如果你坚 ...

正在看你发的一系列帖子,想学学这个,找个东西测试下。

出0入0汤圆

发表于 2013-7-11 15:24:40 | 显示全部楼层
学习uIP先要看看这个帖子!

出0入0汤圆

发表于 2013-7-11 16:11:21 | 显示全部楼层
楼主好人,感谢分享

出0入0汤圆

发表于 2013-7-11 23:28:51 来自手机 | 显示全部楼层
学习           

出0入0汤圆

发表于 2013-7-11 23:45:31 来自手机 | 显示全部楼层
楼主好人

出0入0汤圆

发表于 2013-7-11 23:53:32 | 显示全部楼层
我想学习Uip的SMTP发邮件协议,楼主有没有计划要研究?

出0入0汤圆

 楼主| 发表于 2013-7-12 08:21:11 | 显示全部楼层
ldw 发表于 2013-7-11 23:53
我想学习Uip的SMTP发邮件协议,楼主有没有计划要研究?

这个倒是没有,后面专注于Restful相关内容!
利用uIP或者LwIP和云平台形成互动!

出0入0汤圆

发表于 2013-7-12 09:30:50 | 显示全部楼层
不错 学习

出0入0汤圆

发表于 2013-7-13 00:06:51 | 显示全部楼层
我只懂皮毛啊 ,学习学习!

出0入0汤圆

 楼主| 发表于 2013-7-13 12:11:30 | 显示全部楼层
Zigbee2012 发表于 2013-7-13 00:06
我只懂皮毛啊 ,学习学习!

为什么你的ID是zigbee2012,zigbee现在还弄吗!

出0入0汤圆

发表于 2013-7-13 13:22:09 | 显示全部楼层
xukai871105 发表于 2013-7-13 12:11
为什么你的ID是zigbee2012,zigbee现在还弄吗!

在,也是懂点 呵呵

出0入0汤圆

发表于 2013-7-13 17:32:11 | 显示全部楼层
顶起,学习了                                                           

出200入0汤圆

发表于 2013-7-13 21:26:27 | 显示全部楼层
不错,学习

出0入0汤圆

 楼主| 发表于 2013-7-13 22:18:44 | 显示全部楼层
jsntzxh 发表于 2013-7-13 21:26
不错,学习

感谢支持!
等了那么久,怎么还没有裤子啊!
我认真经营,努力回答问题!有的时候网友们提问我回答不出来,有几次弄到深夜。

出0入0汤圆

发表于 2013-7-22 09:35:34 | 显示全部楼层
mark,mark,mark,帮你顶一个。

出0入0汤圆

发表于 2013-7-22 11:18:51 | 显示全部楼层
谢谢楼主经验分享   uip

出0入0汤圆

发表于 2013-7-23 23:30:23 | 显示全部楼层
好贴,mark一下,最近正在看

出0入0汤圆

发表于 2013-7-24 07:19:29 来自手机 | 显示全部楼层
收藏了,谢谢

出0入0汤圆

发表于 2013-7-24 07:22:08 | 显示全部楼层
学习,谢谢了

出0入0汤圆

发表于 2013-7-24 07:47:29 来自手机 | 显示全部楼层
好贴,记好留名

出0入4汤圆

发表于 2013-7-24 08:18:19 | 显示全部楼层
强烈建议再出LWIP移植教程,哈哈!

出0入0汤圆

 楼主| 发表于 2013-7-24 10:18:56 | 显示全部楼层
dadian 发表于 2013-7-24 08:18
强烈建议再出LWIP移植教程,哈哈!

强烈建议有效!

出0入0汤圆

发表于 2013-7-24 10:25:59 | 显示全部楼层
楼主真用心,顶一个

出0入0汤圆

发表于 2013-7-24 11:09:22 | 显示全部楼层
好贴  受益匪浅  正要搞这个 用的DM9000

出0入0汤圆

发表于 2013-7-24 13:31:42 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2013-7-24 14:41:30 | 显示全部楼层
正在学习stm32f107,楼主的资料很好

出0入4汤圆

发表于 2013-7-24 15:08:24 | 显示全部楼层
likfire0109 发表于 2013-7-24 14:41
正在学习stm32f107,楼主的资料很好

我也在用F107,但是没有用自带的网络控制器。学习中。。。

出0入0汤圆

发表于 2013-7-24 16:54:45 | 显示全部楼层
非常喜欢,楼主写的东西太好了,越来越佩服你了。

出0入0汤圆

 楼主| 发表于 2013-7-24 16:56:19 | 显示全部楼层
gchs2012 发表于 2013-7-24 16:54
非常喜欢,楼主写的东西太好了,越来越佩服你了。

不用把我捧上天的,其实关于uIP我还是有很多部分没有搞清楚,还是需要认真学习的!
大家一起努力!

出0入0汤圆

发表于 2013-7-24 17:27:21 | 显示全部楼层
xukai871105 发表于 2013-7-24 16:56
不用把我捧上天的,其实关于uIP我还是有很多部分没有搞清楚,还是需要认真学习的!
大家一起努力! ...

嗯,我也是最近不是太忙就看了看,学习学习,有个奋斗的开发板,可以实践实践!

出0入0汤圆

发表于 2013-7-24 17:53:28 | 显示全部楼层
这个一定要关注

出0入0汤圆

发表于 2013-8-6 19:56:57 | 显示全部楼层
mark
                                 

出0入0汤圆

发表于 2013-8-6 21:30:27 | 显示全部楼层
很好的帖子,收藏了

出0入18汤圆

发表于 2013-8-6 22:15:26 | 显示全部楼层
顶帖收藏之

出0入0汤圆

发表于 2013-8-6 23:34:26 | 显示全部楼层
楼主威武!记得刚开始学UIP时就是楼主指点了方向,在这里一并表示感谢!!!

出0入0汤圆

发表于 2013-8-6 23:40:53 | 显示全部楼层
感谢楼主的分享。学习了

出0入0汤圆

发表于 2013-8-7 16:15:47 | 显示全部楼层
不错

出0入0汤圆

发表于 2013-8-8 11:43:45 | 显示全部楼层
很奇怪,移植你程序,找不到你工程里边的tcpip_output();

出0入0汤圆

发表于 2013-8-9 11:01:12 | 显示全部楼层
好贴,楼主每次出的都是精品,估计每个都是自己敲的吧。在学习中·············

出0入0汤圆

 楼主| 发表于 2013-8-9 17:03:08 | 显示全部楼层
苹果520 发表于 2013-8-9 11:01
好贴,楼主每次出的都是精品,估计每个都是自己敲的吧。在学习中············· ...

都是自己实践的结果,只是现在工作很忙,时间和精力少了很多!

出0入0汤圆

发表于 2013-8-11 09:17:41 来自手机 | 显示全部楼层
mar…
顶一个…

出0入0汤圆

发表于 2013-8-15 15:21:33 | 显示全部楼层
xukai871105 发表于 2013-6-13 13:01
感谢您的评论!希望对大家有帮助吧,我第一次看uIP的时候也是看的头都晕了。要是还没有用过uIP的话,希望 ...

LZ您好,谢谢您的分享!
我想问一下,TCP简单定时器这块,current_clock这个变量是一直加吗?怎么没有清零呢?超过了uint16_t 数据类型不是要溢出了吗?
菜鸟的问题,勿喷啊。。。

出0入0汤圆

发表于 2013-8-15 15:51:32 | 显示全部楼层
很好,谢谢楼主无私奉献

出0入0汤圆

 楼主| 发表于 2013-8-15 20:08:53 | 显示全部楼层
wangkangming 发表于 2013-8-15 15:21
LZ您好,谢谢您的分享!
我想问一下,TCP简单定时器这块,current_clock这个变量是一直加吗?怎么没有清 ...

current_clock 不断累加 如果是0xFFFF的话,再加1就溢出了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-17 04:49

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

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