完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
lwip tcp_client发送数据必须放在tcp_client_poll()这个回调函数里吗?
原子给的例程[C] 纯文本查看 复制代码 err_t tcp_client_poll(void *arg, struct tcp_PCB *tpcb){err_t ret_err;struct tcp_client_struct *es; es=(struct tcp_client_struct*)arg;if(es!=NULL) //连接处于空闲可以发送数据{if(tcp_client_flag&(1<<7))//判断是否有数据要发送 {es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_client_sendbuf),PBUF_POOL);//申请内存 pbuf_take(es->p,(char*)tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf));//将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去tcp_client_flag&=~(1<<7);//清除数据发送标志if(es->p)pbuf_free(es->p);//释放内存}else if(es->state==ES_TCPCLIENT_CLOSING){ tcp_client_connection_close(tpcb,es);//关闭TCP连接} ret_err=ERR_OK;}else{ tcp_abort(tpcb);//终止连接,删除pcb控制块ret_err=ERR_ABRT;}return ret_err;} 但是要发送一个很大数据,就出现问题,数据末尾发送的全是00000000000 jpeg_data_buf大概有120K,发送到20k左尾发送的就全是0 我改的代码 jpeg_data_buf的长度等于IMAGEBUFLOOP*1024+IMAGEBUFLOOP [C] 纯文本查看 复制代码 //lwIP tcp_poll的回调函数err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb){err_t ret_err;struct tcp_client_struct *es;u16 image_send_count;// 循环发送次数es=(struct tcp_client_struct*)arg;if(es!=NULL) //连接处于空闲可以发送数据{if(tcp_client_flag&(1<<7))//判断是否有数据要发送 {tcp_client_flag&=~(1<<7);//清除数据发送标志for(image_send_count = 0; image_send_count < IMAGEBUFLOOP; image_send_count++){delay_ms(3);// 防止发送过快导致收不到ACK//lwip_periodic_handle();es->p=pbuf_alloc(PBUF_TRANSPORT, 1024,PBUF_POOL);//申请内存 pbuf_take(es->p,(char*)(jpeg_data_buf+image_send_count*1024),1024);//将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去if(es->p)pbuf_free(es->p);//释放内存}if(IMAGEBUFLEFT)// jpeg_data_buf 不为1K的整数倍{delay_ms(3);//lwip_periodic_handle();es->p=pbuf_alloc(PBUF_TRANSPORT, IMAGEBUFLEFT,PBUF_POOL);//申请内存 pbuf_take(es->p,(char*)(jpeg_data_buf+image_send_count*1024),IMAGEBUFLEFT);//将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去if(es->p)pbuf_free(es->p);//释放内存}}else if(es->state==ES_TCPCLIENT_CLOSING){ tcp_client_connection_close(tpcb,es);//关闭TCP连接}IMAGESENDOK=1;// 标记数据发送完成ret_err=ERR_OK;}else{ tcp_abort(tpcb);//终止连接,删除pcb控制块ret_err=ERR_ABRT;}return ret_err;} 我想问的是这是什么原因?有没有可能将发送函数独立出来?如果可以应该怎么做? |
|
相关推荐
16个回答
|
|
通过回调处理数据是lwIP的原始接口,lwIP另外提供了BSD标准的socket接口。不知道原子的demo有没有用到。
发送的数据全是0你先定位一下是内存拷贝那时出错了,还是数据传入到底层但是底层已经发生内存数据处理异常了,因为根据你的描述,数据已经发送出去了,但是收到的全是0对吗? |
|
|
|
应该是数据传入到底层但是底层已经发生内存数据处理异常了,BSD的标准接口是要移植一个操作系统才能用吗?
|
|
|
|
|
|
|
|
BSD标准接口需要操作系统支持的,我们已经移植了的,NETCONN接口的实验就是有操作系统的,你可以在NETCONN试验的基础上使用Socket
|
|
|
|
并没有使用strlen()
|
|
|
|
|
|
es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_client_sendbuf),PBUF_POOL); //申请内
|
|
|
|
|
|
|
|
额,看错,不好意思。
|
|
|
|
回复【3楼】小小小白:
---------------------------你好我的这个例程在探索者开发板上抱不动啊,下载程序后连液晶屏上都没有显示,你有没遇到这种请款 |
|
|
|
原子老师,我买的探索者开发板下载完(网络实验4 RAW_TCP客户端实验)(网络实验8 NETCONN_TCP 客户端)这两个实验怎么也接收不到数据,发送也不行,液晶屏上也没任何数据,但是(网络实验9 NETCONN_TCP 服务器)这个实验就可以请问是什么问题啊??
|
|
|
|
你是下载我们的最新的例程么?
|
|
|
|
买板子的时候,光盘里的那个
|
|
|
|
我们测试ok哦
|
|
|
|
读出来的LCD ID是0
|
|
|
|
是我们的开发板和lcd么?
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2574 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2367 浏览 5 评论
3220 浏览 3 评论
2842 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2795 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
677浏览 1评论
914浏览 0评论
1035浏览 0评论
677浏览 0评论
509浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 03:48 , Processed in 1.447462 second(s), Total 106, Slave 90 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号