ARM以太网丢包,



本来我不会弄tcp_write 等函数的调用,好不容易能收发了。但出现丢包现象。

(1)我布线布得不太好。一些去耦电容没加。这版没办法了改。

(2)对LM3S9b96这片ARM的以太网口做了测试,

是lwip测试程序。测试程序见下:

while(ErrFlag!=ERR_OK)

{

ErrFlag=tcp_write(pcb_RecordSend, &TCPSendData, 1034, 1);

 

tcp_output(pcb_RecordSend);

 L_Delay1ms();

L_Delay1ms();

L_Delay500us();

//L_Delay1ms();

//L_Delay5ms();

//L_Delay(290);

if(ErrFlag!=ERR_OK)

Cnt++;

}

Count[Cnt]++;

ErrFlag=1;

Cnt=0;

发现如果第一次发送不成功,只需重发一次即可发送成功,且发送间隔不能小于2.5ms,间隔再小就会出现以下错误:

err = tcp_write_checks(pcb, len);

//函数对发送数据长度以及发送缓冲区做判断,由于send_buf长度小于发送数据长度1034则发送中断。

/* fail on too much data */

  if (len > pcb->snd_buf)

{

    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n",

      len, pcb->snd_buf));

    pcb->flags |= TF_NAGLEMEMERR;

    return ERR_MEM;

  }

ERR_MEM应该是内存溢出,发送buffer不够,请帮忙查下,这个sendbuffer大小能不能改动。

  • 你的是2.5ms以下传输数据 都是有可能丢包的,要不 就不用加那么多协议来处理数据包了。此外,你的硬件问题是否能确认排除问题了?  建议你把程序发给我,我在开发板上也测一下看看是否丢包。

     

    (1)你试着把通信时间加大点情况应该就会好一点了。

    (2)此外LwIP配置以大一些的缓冲区以支持大量的数据处理,Lwipopts.h头文件里改些,这里要研究一下内存的配置。你有大量的数据要发送的时候,你最好把这个值设置得大一些。否则你会因为切不到heap中的内存而无法发送或只能延迟发送。

    (3)能否把数据包边小试试?比如500多个发一次?

    /** ERR_MEM应该是内存溢出,发送buffer不够,请帮忙查下,这个sendbuffer大小能不能改动。

     

    * MEM_SIZE: the size of the heap memory. If the application will send

    * a lot of data that needs to be copied, this should be set high.

    */

    #define MEM_SIZE                        (4*1024)—在这里,改大一些试试,别的地方怎么改????  有没有lwip的文档介绍手册啊?

  • 不知道你用的什么版本的lwip协议,我也是用在LM3S9B96上,使用lwip1.3.2时发送一个1K长度的UDP包只用100多个us,而是用lwip1.4.1时,则大约用了2.45ms,好像lwip1.4.1数据发送时,进行了数据拷贝,因此比较慢,若发送间隔太低则会出错。

  • 电路有哪些问题呢?端口上的匹配很重要,还有参考时钟的稳定性。