OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4698|回复: 12

求助一下大数据量以太网接收问题

[复制链接]

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
发表于 2019-5-9 11:28:00 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 dd777 于 2019-5-9 14:23 编辑

  目前有一个项目,开发板作为服务器通过以太网接收客户端数据,每10MS 8K字节数据,在网络实验9 netconn——tcp服务器实验,按照原子哥的例程进行的操作是收到一包数据后将数据通过串口打印。   1. 现在我自己的想法是每次接收到一个数据包将数据拷贝出来到一个缓冲数组再打印数组长度计数值,当缓冲数组存满的时候将数组计数清零并将数组元素全部置0,我按照这个逻辑写的代码发现每次只能收到前面1-3帧数据然后串口就没有打印了。

微信截图_20190509111916.png 这里缓存数组长度CMD_BUFFER_SIZE定义的16000字节,TCP_SERVER_RX_BUFSIZE按照默认的2000字节。
    2.后来想是不是数据拷贝到缓存数组速度太慢导致出现问题,又将代码改为将数据包长度累加到一个计数值然后打印,直到超过一个门限值后复位计数值。然而还是只能走1-2个循环就没有串口打印。
微信截图_20190509112423.png

   3. 最后我发现如果是收到数据后不进行任何操作只是进行打印是没有问题的,
微信截图_20190509112608.png
实在不知道问题出在哪里,请教一下懂的人,感激不尽啊

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2019-5-9 13:28:32 | 显示全部楼层
每10MS 8000K字节数据

那么每秒就是 800MB/s,你这个需要服务器级别的机器,上10G的光纤网络。
甚至1条还不够,需要多条做端口汇聚。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-5-9 14:24:17 | 显示全部楼层
aozima 发表于 2019-5-9 13:28
那么每秒就是 800MB/s,你这个需要服务器级别的机器,上10G的光纤网络。
甚至1条还不够,需要多条做端口 ...

不好意思啊,打错了是8Kb/10ms,大概800Kb/S
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-5-11 22:30:39 | 显示全部楼层
这是我用例程9实验。
360截图20190511221135636.jpg
360截图20190511223018284.jpg
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-5-12 14:21:12 | 显示全部楼层
huanghuang 发表于 2019-5-11 22:30
这是我用例程9实验。

这个是例程的原版代码,我这里这样写的话通过网络助手和开发办通讯结果也和你一样,但是因为我项目上是一帧数据8000字节,而以太网一个数据包最大1460字节,所以每一包过来了之后按照例程里首先有一个缓冲区清零操作,这样的话我如果后面要处理数据就得把tcp_server_recbuf里的数据拷贝到另一个缓存数组里再做操作,我按照这个逻辑写的代码,跟客户端下位机进行通讯结果只能接收并处理1-3帧的数据。现在我能想到的问题是:1,可能数据拷贝到缓存数组进行处理的过程太慢导致接收出现问题。2,发送方和开发板连接后发送几帧后不发数据了。
  对于第一点处理速度问题,我进行了一个简单的排查,按照你给的图里的代码,再定义一个长度变量temp_len,在开中断之后我将data_len累加到temp_len,并打印temp_len,当其超过随便一个数(比如40000)的时候将其清零。再之后将data_len清零。但是发现还是只能运行几次。
对于第二点我也简单试验了一下,就按照图里给的代码逻辑也就是:先进循环清缓存,接收一个数据包完后开中断,打印数据,这个逻辑的话,下位机客户端发送的数据可以接收。所以是说如果只是接收打印数据是没问题的。
打得字有点多,希望可以帮我看看问题可能出在哪里,十分感谢
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-5-15 22:32:21 | 显示全部楼层
我这样改,能实现你说的一下子发8K数据。1s发送一次是没问题的。如果你要改成你的10ms的话,那你就不能再这里加printf函数了。因为这样会使arm所有任务都得不到切换。这个需要你自己想办法。给个方法:lwip中你可以直接使用地址操作数据,而不是memcpy。
1.jpg
2.jpg
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-5-16 12:41:20 | 显示全部楼层
huanghuang 发表于 2019-5-15 22:32
我这样改,能实现你说的一下子发8K数据。1s发送一次是没问题的。如果你要改成你的10ms的话,那你就不能再这 ...

感谢感谢,也就是说打印比较占资源这样吗?我当初之所以用打印是为了检测有没有收到数据,如果打印太占资源的话不用打印也可以。另外请教一下地址操作数据是比MEMCPY更快?具体怎么操作?对于MEMSET有没有更好的办法来替代,现在就是需要存储清空的 速度够快才能进行接下来的数据处理,但是我才开始学习不太清楚该怎么操作,还请兄弟解惑
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-5-16 20:02:21 | 显示全部楼层
在网络数据处理中,接收和处理是分开的两个任务。你可以通过消息邮箱将数据传到另一个任务,该任务进行处理;网络部分只负责接收。你看看netbuf_data()这个函数。如果不懂,你就应该多看看lwip啊。
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-5-16 22:25:28 | 显示全部楼层
huanghuang 发表于 2019-5-16 20:02
在网络数据处理中,接收和处理是分开的两个任务。你可以通过消息邮箱将数据传到另一个任务,该任务进行处理 ...

netbuf_data()我搜了一下没有找到欸,看过原子哥给的LWIP的教程里面好像有一个netconn_recv_data()函数,不知道是不是同一个?还有就是再得请教一下地址操作的方法或者哪里可以学习一下的,又要麻烦兄弟了
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-5-17 20:00:20 | 显示全部楼层
dd777 发表于 2019-5-16 22:25
netbuf_data()我搜了一下没有找到欸,看过原子哥给的LWIP的教程里面好像有一个netconn_recv_data()函 ...

你肯定没看原子哥资料里带的lwip资料吧?在那里面。
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-5-17 20:01:10 | 显示全部楼层
dd777 发表于 2019-5-16 22:25
netbuf_data()我搜了一下没有找到欸,看过原子哥给的LWIP的教程里面好像有一个netconn_recv_data()函 ...

如果实在不行,你就用udp。看可以不?
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-5-20 09:16:10 | 显示全部楼层
huanghuang 发表于 2019-5-17 20:01
如果实在不行,你就用udp。看可以不?

UDP可能用不了,接收和处理的分工我现在有点思路准备尝试一下。目前的有个小问题是兄弟上面提到的地址操作数据,是指像lwip里一样对数据都是用指针来进行操作还是有别的什么技巧呢?
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-5-23 20:17:16 | 显示全部楼层
dd777 发表于 2019-5-20 09:16
UDP可能用不了,接收和处理的分工我现在有点思路准备尝试一下。目前的有个小问题是兄弟上面提到的地址操 ...

udp分包发送啊,比如tftp不就是udp嘛2?用指针或数据拷贝。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-28 12:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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