OpenEdv-开源电子网

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

STM32F103战舰DM9000的LWIP例程TCP速度慢,发送间隔太长

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-12-23
在线时间
8 小时
发表于 2018-12-23 13:53:13 | 显示全部楼层 |阅读模式
1金钱
我用的STM32F103战舰开发板LWIP例程,搭载DM9000的TCP协议,使用发现TCP Server发包速度慢,发送间隔太长(抓包显示大约250ms),我编程通过tcp_server_flag|=1<<7;快速产生了上百次发送事件,但是PC抓包只接收了几个包,有大神指点一下吗?
还有STM32F103+DM9000的TCP协议的速度上限大概是多少啊?比F407系列慢很多吗?


最佳答案

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

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2018-12-23 13:53:14 | 显示全部楼层
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-12-23
在线时间
8 小时
 楼主| 发表于 2018-12-24 09:02:32 | 显示全部楼层

那么请问STM32F103+DM9000的LWIP协议TCP Server的速度上限大概是多少啊?比F407系列慢很多吗?
回复

使用道具 举报

3

主题

1156

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2018-12-24 13:37:09 | 显示全部楼层
楼主测试速度是多少
一分耕耘一分收获。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-12-23
在线时间
8 小时
 楼主| 发表于 2018-12-26 13:54:30 | 显示全部楼层
yklstudent 发表于 2018-12-24 13:37
楼主测试速度是多少

STM32 TCP接收很快,但发送速度只有100多KB/S,还在测试中。。。
回复

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-10-19
在线时间
173 小时
发表于 2019-1-3 09:46:24 | 显示全部楼层
應該更改下代碼, 我的TCP Serve發送速度約為655KB/Sec
// SEND_BUF_SIZE=1024 发送数据长度 1024Bytes 約為 655KB/Sec       
// LWIP数据发送,用户应用程序调用此函数来发送数据
// tpcb:TCP控制块
// 返回值:0,成功;其他,失败
// err_t tcp_server_usersent(struct tcp_pcb *tpcb, u16 sendLength)
err_t tcp_server_usersent(struct tcp_pcb *tpcb, struct my_lwip_file *myStruct)       
{
    err_t ret_err;
        struct tcp_server_struct *es;        
        struct pbuf *ptr;
        err_t wr_err=ERR_OK;
        u16 plen;
        static u8 readFileFlag=0;                // David 添加的讀取SD卡檔案識別旗號, 0 --> Open File, 1 --> Read File
        static u8 readData=1;                        // David 添加的讀取jpg 數據旗號,          0 --> 不執行 Read File 以避免因數據尚未傳送再次讀檔造成數據丟失
       
        es=tpcb->callback_arg;
        if(es!=NULL){                  // 连接处于空闲可以发送数据       
                if(readData){        // David 添加的前次數據有成功傳送可繼續讀取
                        if(readFileFlag){
                                readFile(myStruct);
                        }else{
                                openFile(myStruct);        // 開啟檔案                               
                                readFileFlag=1;       
                        }
                }                       
                readData=0;                // 預設為不讀取數據       
        es->p=pbuf_alloc(PBUF_TRANSPORT, myStruct->sendLength,PBUF_POOL);        // 申请内存
        pbuf_take(es->p,(char*)myStruct->sendBuffer,myStruct->sendLength);        // 将tcp_server_sentbuf[]中的数据拷贝到es->p_tx中       
                while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tpcb->snd_buf)){
                        ptr=es->p;
                        wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);                                 // 将要发送的数据加入发送缓冲队列中
                        if(wr_err){
                                return 1;
                        }
                        if(wr_err==ERR_OK){
                                plen=ptr->len;
                                es->p=ptr->next;                        // 指向下一个pbuf
                                if(es->p){pbuf_ref(es->p);}        // pbuf的ref加一
                                pbuf_free(ptr);
                                tcp_recved(tpcb,plen);                 // 更新tcp窗口大小
                        }else if(wr_err==ERR_MEM){
                                es->p=ptr;       
                        }       
                        tcp_nagle_disable(tpcb);                 // David 添加的屏蔽nagle算法才會立即發送 Data, tpcb->flags |= TF_NODELAY       
                        ret_err=tcp_output(tpcb);           // 将发送缓冲队列中的数据发送出去
                        readData= !ret_err ? 1 : 0;                // 當正確傳送數據後再設定為 TRUE                       
                }                       
        if(es->p!=NULL){
                        pbuf_free(es->p);                                // 释放内存
                }
                ret_err=ERR_OK;
        }else{
                tcp_abort(tpcb);                                        // 终止连接,删除pcb控制块
                ret_err=ERR_ABRT;
        }
        return ret_err;
}

回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-12-23
在线时间
8 小时
 楼主| 发表于 2019-1-3 17:08:16 | 显示全部楼层
jdwang1000 发表于 2019-1-3 09:46
應該更改下代碼, 我的TCP Serve發送速度約為655KB/Sec
// SEND_BUF_SIZE=1024 发送数据长度 1024Bytes 約 ...

您好,请问一下err_t tcp_server_usersent(struct tcp_pcb *tpcb, struct my_lwip_file *myStruct)  ,这个函数的struct tcp_pcb *tpcb参数从哪里得到?
我配置为server端,我找不到正确的client结构体*tpcb在哪里。
谢谢!
回复

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2015-10-19
在线时间
173 小时
发表于 2019-1-5 10:34:07 | 显示全部楼层
qq605502045 发表于 2019-1-3 17:08
您好,请问一下err_t tcp_server_usersent(struct tcp_pcb *tpcb, struct my_lwip_file *myStruct)  ,这 ...

tcppcbnew 就是结构体*tpcb

tcppcbnew=tcp_new();                // 创建一个新的pcb

tcp_server_usersent(tcppcbnew, myStruct);       


回复

使用道具 举报

3

主题

1156

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2019-1-5 22:21:36 | 显示全部楼层
你们网速都怎么测试的?
一分耕耘一分收获。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-5-13
在线时间
2 小时
发表于 2020-5-22 15:32:11 | 显示全部楼层
你好,请问这个资料在哪下载?
回复

使用道具 举报

22

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-5-23
在线时间
118 小时
发表于 2020-7-27 15:51:00 | 显示全部楼层
jdwang1000 发表于 2019-1-3 09:46
應該更改下代碼, 我的TCP Serve發送速度約為655KB/Sec
// SEND_BUF_SIZE=1024 发送数据长度 1024Bytes 約 ...

能把工程发上来让大家参考下吗?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2021-5-16
在线时间
6 小时
发表于 2022-3-24 14:39:35 | 显示全部楼层
jdwang1000 发表于 2019-1-3 09:46
應該更改下代碼, 我的TCP Serve發送速度約為655KB/Sec
// SEND_BUF_SIZE=1024 发送数据长度 1024Bytes 約 ...

感谢大神,困扰小半个月的难题在大神的代码中找到了解决方法,感谢感谢,万分感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-8 09:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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