---恢复内容开始---
这几天做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); //数据接收缓冲区清零
---恢复内容结束---