专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
STM32F407+dp83848利用UDP协议一次最多能发送多少数据?
2019-07-20 03:59
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
6696
24
1196
请教一下各位大侠,问题已经困扰我很久了,。。。
移植原子的程序,想测试一下网口的速度,想法是通过网络调试助手,发送一个指令如0xeb90,然后STM32通过网口返回大量数据,然后算出速度。。。。。
看很多资料说如果要发送大量数据的话,可以利用PBUF_POOL类型的Pbuf,然后多个这种类型的pbuf组成pbuf链,要发送的数据包分配到这个链的每个pbuf的payload指向的数据处,原理如图
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
taizonglai
1楼-- · 2019-07-20 08:07
精彩回答 2 元偷偷看……
加载中...
amyoubo
2楼-- · 2019-07-20 13:57
我之前也发现过这个问题,按照原子的例程,数据只能存在第一个payload指向的数据区,所以这里需要你在程序中将所需要发送的数据放到payload中。这是我之前改过的程序(不规范勿喷)
不过按照如下改过之后,最多只能发送1400多个字节数据,具体多少记不清楚了,就是楼上说的一次最大发送字节数,但不到1500。
void udp_senddata(void *PData, uint16_t totlen)
{
struct pbuf *ptr, *ptmp;
char *Ptemp;
uint16_t Currlen=0,remlen=0;
ptr=pbuf_alloc(PBUF_TRANSPORT,totlen,PBUF_POOL); //申请内存
Ptemp=PData;
remlen=totlen;
ptmp=ptr;
if(ptr)
{
while(remlen>0)
{
ptmp->payload=(uint8_t *)&Ptemp[Currlen]; //(void*)不能进行算法操作,因此加一临时变量替换
Currlen=Currlen+ptmp->len;
remlen=totlen-Currlen;
if(remlen!=0)
{
ptmp=ptmp->next;
}
else
{
ptmp->next=NULL;
}
}
udp_send(UDPPCB,ptr);
pbuf_free(ptr);
}
}
加载中...
刺客mfl
3楼-- · 2019-07-20 18:08
程序 ptr=pbuf_alloc(PBUF_TRANSPORT,1024,PBUF_POOL); //申请内存
? 申请了1024个字节的内存
?每个pbuf的大小修改为#define 
BUF_POOL_BUFSIZE 512 + 54
?也就是链的第一个数据有效存储数据区域的大小为512个字节,但是不管是用ptr->payload=(void*)buffer2;(buffer2是我定义的一个数组, for(ts=0;ts<2048;ts++)
{
buffer2[ts] =ts; //预存数组数据
})
还是调用pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len),数据只能存在第一个payload指向的数据区,链表中的第二个pbuf的payload指向的地址处根本没有任何数据。申请内存是用的pbuf_alloc()函数没有加任何修改,因为我看到这个函数就是建了一个有两个pbuf的pbuf链,请教大侠这是什么原因,怎么才能把数据放到第二个pbuf的payload指向的区域
加载中...
刺客mfl
4楼-- · 2019-07-20 18:10
精彩回答 2 元偷偷看……
加载中...
刺客mfl
5楼-- · 2019-07-20 18:59
精彩回答 2 元偷偷看……
加载中...
taizonglai
6楼-- · 2019-07-21 00:25
回复【5楼】刺客mfl:
---------------------------------
看一下你究竟申请到了几个pbuf结构体,还有就是将PBUF_POOL_BUFSIZE改为1500试一下
加载中...
1
2
3
4
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
不过按照如下改过之后,最多只能发送1400多个字节数据,具体多少记不清楚了,就是楼上说的一次最大发送字节数,但不到1500。
void udp_senddata(void *PData, uint16_t totlen)
{
struct pbuf *ptr, *ptmp;
char *Ptemp;
uint16_t Currlen=0,remlen=0;
ptr=pbuf_alloc(PBUF_TRANSPORT,totlen,PBUF_POOL); //申请内存
Ptemp=PData;
remlen=totlen;
ptmp=ptr;
if(ptr)
{
while(remlen>0)
{
ptmp->payload=(uint8_t *)&Ptemp[Currlen]; //(void*)不能进行算法操作,因此加一临时变量替换
Currlen=Currlen+ptmp->len;
remlen=totlen-Currlen;
if(remlen!=0)
{
ptmp=ptmp->next;
}
else
{
ptmp->next=NULL;
}
}
udp_send(UDPPCB,ptr);
pbuf_free(ptr);
}
}
? 申请了1024个字节的内存
?每个pbuf的大小修改为#define 
?也就是链的第一个数据有效存储数据区域的大小为512个字节,但是不管是用ptr->payload=(void*)buffer2;(buffer2是我定义的一个数组, for(ts=0;ts<2048;ts++)
{
buffer2[ts] =ts; //预存数组数据
})
还是调用pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len),数据只能存在第一个payload指向的数据区,链表中的第二个pbuf的payload指向的地址处根本没有任何数据。申请内存是用的pbuf_alloc()函数没有加任何修改,因为我看到这个函数就是建了一个有两个pbuf的pbuf链,请教大侠这是什么原因,怎么才能把数据放到第二个pbuf的payload指向的区域
---------------------------------
看一下你究竟申请到了几个pbuf结构体,还有就是将PBUF_POOL_BUFSIZE改为1500试一下
一周热门 更多>