OpenEdv-开源电子网

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

请教如何用STM32 LWIP主动通过网口发送数据,不等待轮询

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-9-27
在线时间
9 小时
发表于 2018-8-25 10:17:08 | 显示全部楼层 |阅读模式
3金钱
我用的是STM32F103,请教各位大神怎么用主动的方式通过TCPIP发送数据,不是用tcp_server_poll这个轮询回调函数被动的发数据。

我的想法是把tcp_server_poll和tcp_server_senddata合成一个函数单独提取出来,但是函数的参数arg,es不知道怎么确定,具体函数如下

err_t tcp_server_poll(void *arg, struct tcp_pcb *tpcb)
{
        err_t ret_err;
        struct tcp_server_struct *es;
        es=(struct tcp_server_struct *)arg;
        if(es!=NULL)
        {
                if(tcp_server_flag&(1<<7))        //&#197;D&#182;&#207;ê&#199;·&#241;óDêy&#190;Yòa·¢&#203;í
                {

                        es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)led_sendbuf),PBUF_POOL);        //éê&#199;&#235;&#196;ú′&#230;
                        pbuf_take(es->p,(char*)led_sendbuf,strlen((char*)led_sendbuf));        //&#189;&#171;tcp_client_sentbuf[]&#214;Dμ&#196;êy&#190;Y&#191;&#189;±′μ&#189;es->p_tx&#214;D
                        tcp_server_senddata(tpcb,es);                 //&#194;&#214;&#209;ˉμ&#196;ê±oò·¢&#203;íòa·¢&#203;íμ&#196;êy&#190;Y
                        tcp_server_flag&=~(1<<7);                          //&#199;&#229;3yêy&#190;Y·¢&#203;í±ê&#214;&#190;&#206;&#187;
                        if(es->p!=NULL)pbuf_free(es->p);         //êí·&#197;&#196;ú′&#230;       
                }else if(es->state==ES_TCPSERVER_CLOSING)//Dèòa1&#216;±&#213;á&#172;&#189;ó?&#214;′DD1&#216;±&#213;2ù×÷
                {
                        tcp_server_connection_close(tpcb,es);//1&#216;±&#213;á&#172;&#189;ó
                }
                ret_err=ERR_OK;
        }else
        {
                tcp_abort(tpcb);//&#214;&#213;&#214;1á&#172;&#189;ó,é&#190;3ypcb&#191;&#216;&#214;&#198;&#191;é
                ret_err=ERR_ABRT;
        }
        return ret_err;
}

void tcp_server_senddata(struct tcp_pcb *tpcb, struct tcp_server_struct *es)
{
        struct pbuf *ptr;
        u16 plen;
        err_t wr_err=ERR_OK;
         while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tcp_sndbuf(tpcb)))
         {
                ptr=es->p;
                wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);
                if(wr_err==ERR_OK)
                {
                        plen=ptr->len;
                        es->p=ptr->next;                        //&#214;&#184;&#207;ò&#207;&#194;ò&#187;&#184;&#246;pbuf
                        if(es->p)pbuf_ref(es->p);        //pbufμ&#196;ref&#188;óò&#187;
                        pbuf_free(ptr);
                        tcp_recved(tpcb,plen);                 //&#184;üD&#194;tcp′°&#191;ú′óD&#161;
                }else if(wr_err==ERR_MEM)es->p=ptr;
         }
}

希望有做过的或者会的各路大神指点一二,感激不尽。

最佳答案

查看完整内容[请看2#楼]

看STM32F429和F767的例程,这两个开发板的例程改了,直接发送
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2018-8-25 10:17:09 | 显示全部楼层
看STM32F429和F767的例程,这两个开发板的例程改了,直接发送
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-9-27
在线时间
9 小时
 楼主| 发表于 2018-8-25 11:05:00 | 显示全部楼层
zuozhongkai 发表于 2018-8-25 10:39
看STM32F429和F767的例程,这两个开发板的例程改了,直接发送

谢啦 真的可以 问题解决了
回复

使用道具 举报

16

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2014-2-25
在线时间
44 小时
发表于 2018-8-27 08:33:25 | 显示全部楼层
贫僧洗头用雕牌 发表于 2018-8-25 11:05
谢啦 真的可以 问题解决了

大兄弟,方便说下参考的F429 哪个例程吗? 我看实验58 还是轮询的啊
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-9-27
在线时间
9 小时
 楼主| 发表于 2018-9-11 19:01:09 | 显示全部楼层
jinstm32 发表于 2018-8-27 08:33
大兄弟,方便说下参考的F429 哪个例程吗? 我看实验58 还是轮询的啊

我参考的F767的例程61
回复

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2015-10-19
在线时间
173 小时
发表于 2018-12-26 13:50:13 | 显示全部楼层
請問樓主我剛看了下F767的例程61上面的做法還是輪詢後發送數據,做法還是與F103ZET6的例程完全一樣(我是參考寄存器板),可否請樓主說明下參考的是哪個C檔案的程序
麻煩了,謝謝 !!
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2018-12-26 13:55:02 来自手机 | 显示全部楼层
使用bsdsocket方式开发可以满足你任何需求
回复

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2015-10-19
在线时间
173 小时
发表于 2018-12-26 15:54:47 | 显示全部楼层
剛剛下載了F767的庫函數版終於看到了直接發送程序

//LWIP数据发送,用户应用程序调用此函数来发送数据
//tpcb:TCP控制块
//返回值:0,成功;其他,失败
err_t tcp_server_usersent(struct tcp_pcb *tpcb)
{
    err_t ret_err;
        struct tcp_server_struct *es;
        es=tpcb->callback_arg;
        if(es!=NULL)  //连接处于空闲可以发送数据
        {
        es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_server_sendbuf),PBUF_POOL);        //申请内存
        pbuf_take(es->p,(char*)tcp_server_sendbuf,strlen((char*)tcp_server_sendbuf));        //将tcp_server_sentbuf[]中的数据拷贝到es->p_tx中
        tcp_server_senddata(tpcb,es);   //将tcp_server_sentbuf[]里面复制给pbuf的数据发送出去
        tcp_server_flag&=~(1<<7);            //清除数据发送标志
        if(es->p!=NULL)pbuf_free(es->p);//释放内存
                ret_err=ERR_OK;
        }else
        {
                tcp_abort(tpcb);//终止连接,删除pcb控制块
                ret_err=ERR_ABRT;
        }
        return ret_err;
}
回复

使用道具 举报

1

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2012-8-31
在线时间
65 小时
发表于 2019-7-26 17:19:22 | 显示全部楼层
jdwang1000 发表于 2018-12-26 15:54
剛剛下載了F767的庫函數版終於看到了直接發送程序

//LWIP数据发送,用户应用程序调用此函数来发送数据

你好  你说得这个例子 我没找到  能不能具体说说哪一个?
回复

使用道具 举报

41

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-12-4
在线时间
208 小时
发表于 2020-8-26 08:15:14 | 显示全部楼层
jdwang1000 发表于 2018-12-26 13:50
請問樓主我剛看了下F767的例程61上面的做法還是輪詢後發送數據,做法還是與F103ZET6的例程完全一樣(我是參考 ...

你是台湾人吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 14:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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