OpenEdv-开源电子网

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

刚买了正点原子阿波罗STM32F429IG开发板,lwip tcp_client发送数据遇到点 问题

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-8-9
在线时间
6 小时
发表于 2017-5-8 19:35:50 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 zxs2000 于 2017-5-8 19:47 编辑

刚买了正点原子阿波罗STM32F429IG开发板,lwip tcp_client发送数据遇到点问题,刚接触wip,头脑中完全没有概念。


使用lwip tcp_client发送数据的时候,遇到0就结束了,我现在要发送一串数据中间有0,所以老是发送到0就结束了,原子例程如下:



//此函数用来发送数据
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;                        //指向下一个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;
         }
}




要修改哪里呢?






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

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-5-8 19:53:09 | 显示全部楼层
修改数据发送函数!里面有对发送缓冲区的测量,默认用的strlen()也就是测量的字符串的长度,因为例程里面发送的就是字符串。strlen()遇到0就会停止,所以才会有你遇到的问题!把strlen改了,直接改为你要发送的数组的长度!!!
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-8-9
在线时间
6 小时
 楼主| 发表于 2017-5-8 20:11:26 | 显示全部楼层
谢谢!是不是下面这个函数,我把函数中的语句strlen((char*)tcp_server_sendbuf,改为我要发送数据长度就可以了吧!

//lwIP tcp_poll的回调函数
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))        //判断是否有数据要发送
                {
                        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_senddata(tpcb,es);                 //轮询的时候发送要发送的数据
                        tcp_server_flag&=~(1<<7);                          //清除数据发送标志位
                        if(es->p!=NULL)pbuf_free(es->p);         //释放内存       
                }else if(es->state==ES_TCPSERVER_CLOSING)//需要关闭连接?执行关闭操作
                {
                        tcp_server_connection_close(tpcb,es);//关闭连接
                }
                ret_err=ERR_OK;
        }else
        {
                tcp_abort(tpcb);//终止连接,删除pcb控制块
                ret_err=ERR_ABRT;
        }
        return ret_err;
}


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-9 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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