首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑

关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑

作者头像
杨奉武
发布2018-04-18 11:24:50
6610
发布2018-04-18 11:24:50
举报
文章被收录于专栏:知识分享知识分享

---恢复内容开始---

这几天做STM32的ENC28J60网络通信模块,自己在原子哥的代码上进行修改测试,,发现一个问题,电脑和板子进行通信的时候总隔一段时间板子就死机了.

使用自己的就不会死机,,不知道原因.....

直接源码

struct netbuf *recvbuf;//接收buf
struct pbuf *q;    

err_t recv_err;//接收数据返回信息

u32 data_len = 0; //客户端接收数组的长度

u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE]; //TCP客户端接收数据缓冲区
memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零

自己修改后的,,其实还没优化好,,先这样吧!不影响下面的叙述

struct netbuf *recvbuf;//接收buf
struct pbuf *q;    

err_t recv_err;//接收数据返回信息

u32 data_len = 0; //客户端接收数组的长度

u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE]; //TCP客户端接收数据缓冲区
memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零

首先介绍一下存数据的这个链表----如果不会链表,,,,那就百度一下吧!或者接着看看也行,,,,,改天我写个关于链表的博客,,,,,

struct pbuf {
  /** next pbuf in singly linked pbuf chain */
  struct pbuf *next;指向下一个链表

  /** pointer to the actual data in the buffer */
  void *payload;指向下一个链表的数据区

  /**
   * total length of this buffer and all next buffers in chain
   * belonging to the same packet.
   *
   * For non-queue packet chains this is the invariant:
   * p->tot_len == p->len + (p->next? p->next->tot_len: 0)
   */
  u16_t tot_len;当前pbuf的数据长度与后面所有的pbuf数据之和

  /** length of this buffer */
  u16_t len;//当前pbuf数据长度
  下面的就不说了,,和我们说的无关,,,,
  /** pbuf_type as u8_t instead of enum to save space */
  u8_t /*pbuf_type*/ type;

  /** misc flags */
  u8_t flags;

  /**
   * the reference count always equals the number of pointers
   * that refer to this pbuf. This can be pointers from an application,
   * the stack itself, or pbuf->next pointers from a chain.
   */
  u16_t ref;
};

假设数据来了,因为数据的个数不一定,而每一个链表存数据的个数都是有限的,所以呢就出现了上图,把数据分割依次存入几个链表中

我们要把数据存入

TCP_SERVER_RX_BUFSIZE  自己定义的1000
u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE]; //TCP客户端接收数据缓冲区
这个数组

是不是应该

先看一眼这个,

struct netbuf {
  struct pbuf *p, *ptr;
struct netbuf *recvbuf;//接收buf
struct pbuf *q;//定义了一个q 也是用它指向下一个链表同next功能一样   

err_t recv_err;//接收数据返回信息

u32 data_len = 0; //客户端接收数组的长度

u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE]; //TCP客户端接收数据缓冲区
memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零

---恢复内容结束---

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档