OpenEdv-开源电子网
标题:
刚买了正点原子阿波罗STM32F429IG开发板,lwip tcp_client发送数据遇到点 问题
[打印本页]
作者:
zxs2000
时间:
2017-5-8 19:35
标题:
刚买了正点原子阿波罗STM32F429IG开发板,lwip tcp_client发送数据遇到点 问题
本帖最后由 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;
}
}
要修改哪里呢?
作者:
zuozhongkai
时间:
2017-5-8 19:53
修改数据发送函数!里面有对发送缓冲区的测量,默认用的strlen()也就是测量的字符串的长度,因为例程里面发送的就是字符串。strlen()遇到0就会停止,所以才会有你遇到的问题!把strlen改了,直接改为你要发送的数组的长度!!!
作者:
zxs2000
时间:
2017-5-8 20:11
谢谢!是不是下面这个函数,我把函数中的语句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;
}
欢迎光临 OpenEdv-开源电子网 (http://openedv.com/)
Powered by Discuz! X3.4