OpenEdv-开源电子网

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

【求助】如何实现tcp/ip协议的分包传输?

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-11-25
在线时间
6 小时
发表于 2016-1-5 14:22:37 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 yzhh007 于 2016-1-5 14:33 编辑

我现在是将板子和传感器通过网线传输,板子单包数据量接受上限是1500字节左右,但由于现在程序精度要求,传感器发出的每包数据量会超过上限要求,我想把传感器发出的一包数据拆为两包接受,之后再由芯片处理为一包。不知道stm32f4xx这个系列的板子是否支持这样的传输方式呢?希望有高手可以指点一下!              

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

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-11-25
在线时间
6 小时
 楼主| 发表于 2016-1-5 16:01:08 | 显示全部楼层
yklstudent 发表于 2016-1-5 15:38
你没定义通信协议?

通讯协议应该已经定义好了,就是基于板子的tcpip协议,程序都已经设计好可以使用了。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-11-25
在线时间
6 小时
 楼主| 发表于 2016-1-5 16:17:18 | 显示全部楼层
yklstudent 发表于 2016-1-5 15:38
你没定义通信协议?

我现在的问题是,传感器发送数据量是没有上限的,精度越高,一包数据量会越大,但单片机芯片采集数据有一个上限,我在想能否板子缓存一包数据,然后再分为多包发送给芯片进行处理。不知道stm32f4xx的板子是否支持这样的功能。想请教一下,谢谢!
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-11-25
在线时间
6 小时
 楼主| 发表于 2016-1-5 17:03:02 | 显示全部楼层
yklstudent 发表于 2016-1-5 16:53
你可以先去了解下ModbusTCP,它和TCPIP不是一回事情

想问一下,使用ModbusTCP需要在板子上增加新的模块吗?我是想基于现有模块看能否实现,暂时不考虑引入新的模块。
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2016-1-6 14:21:14 | 显示全部楼层
yklstudent 发表于 2016-1-5 17:12
你不是已经实现了TCPIP了嘛,那在此基础上实现MODBUSTCP功能就可以了;
你也可以移植FreeModbus中的Modb ...

人家说的是TCP分包发送,你说的modbusTCP,这两东西没半点关系。
modbusTCP协议规定一次只能访问128个寄存器数据,128个寄存器共256字节的数据加上前面的事务信息9个字节,加TCP包头的几十个字节,也到不了1500字节。
人家的需求是要发送大于1500字节的数据
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2016-1-6 14:51:46 | 显示全部楼层
下面转载一个lwip分包发送

我用的stm32f103 +enc28j260+ lwip1.3.2 ,一开始参照例子写了一个web服务器也就是些点led灯的玩意,没什么意思,后来项目需要做个配置网页,由于有多个网页标签,导致网页数组很大,超过了1500,实际上等于1400就发送不出去了。因此我很纠结,如果网页数组限制在1400个字节以内,那么随便写个网页也会超出1400个字节,这样就限制了web服务器的使用。
      后来,我查找了很多帖子,都只有提问,回答的都不清楚,经过多次的测试发现了解决办法,也不用修改lwipopts.h文件,web数组可以分多次发送,即自己手动分包,将web数组分割成多个小于1400的数组,多次调用tcp_write(),就可以了,如下:
tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),1);      /* 发送http协议头部信息 */
tcp_write(pcb,login,1300,1);    //发送数据
tcp_write(pcb,login+1300,1300,1);    //发送数据
tcp_write(pcb,login+2600,sizeof(login)-2600,1);    //发送数据

另外, lwip我没用过,我用的是W5500,手动分段后疯狂的往网卡写就行了
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-11-25
在线时间
6 小时
 楼主| 发表于 2016-1-6 16:40:41 | 显示全部楼层
enan 发表于 2016-1-6 14:51
下面转载一个lwip分包发送

我用的stm32f103 +enc28j260+ lwip1.3.2 ,一开始参照例子写了一个web服务器 ...

多谢回复!我好好研究一下,另外还有个问题就是,这样手动分包发送的过程中,如果传感器不间断发送数据,那么网口新采集的数据,会将未发送到单片机芯片的数据覆盖掉吗?我担心是不是存在这样一种风险。
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2016-1-7 15:43:42 | 显示全部楼层
本帖最后由 enan 于 2016-1-7 15:59 编辑
yzhh007 发表于 2016-1-6 16:40
多谢回复!我好好研究一下,另外还有个问题就是,这样手动分包发送的过程中,如果传感器不间断发送数据, ...
为了保障传感器数据接收的,可以用高优先级的接收中断,
这种情况,不一定要收到数据就发送出去,在内存里建立一个大点缓存,传感器发来的数据放缓存里,当缓存满了一次性把缓存里的数据从网口发出去,
如果你非要收到数据就从网口发出去有可能超出MCU的处理能力,那你就要换更高端的ARM9以上的CPU了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-3-29
在线时间
0 小时
发表于 2016-2-16 15:46:49 | 显示全部楼层
留名备查
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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