完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
移植了原子哥的ENC28J60+LWIP的裸机TCP客户端程序,基本功能都是正常的,但是在连续收发会有丢消息的现象
[C] 纯文本查看 复制代码 //lwIP tcp_pollμÄ»Øμ÷oˉêyerr_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) //ᬽó′|óú¿ÕÏD¿éòÔ·¢Ëíêy¾Y{if(tcp_client_flag&(1<<7))//ÅD¶ÏêÇ·ñóDêy¾Yòa·¢Ëí {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[]ÖDμÄêy¾Y¿½±′μ½es->p_txÖDsendNum+=1;tcp_client_senddata(tpcb,es);//½«tcp_client_sentbuf[]àïÃæ¸′ÖƸøpbufμÄêy¾Y·¢Ëí3öè¥tcp_client_flag&=~(1<<7);//Çå3yêy¾Y·¢Ëí±êÖ¾if(es->p)pbuf_free(es->p);//êí·ÅÄú′æ}else if(es->state==ES_TCPCLIENT_CLOSING){ tcp_client_connection_close(tpcb,es);//1رÕTCPᬽó} ret_err=ERR_OK;}else{ tcp_abort(tpcb);//ÖÕÖ1ᬽó,é¾3ypcb¿ØÖÆ¿éret_err=ERR_ABRT;}return ret_err;} //lwIP tcp_sentμÄ»Øμ÷oˉêy(μ±′óÔ¶¶ËÖ÷»ú½óêÕμ½ACKDÅoÅoó·¢Ëíêy¾Y)err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len){struct tcp_client_struct *es;LWIP_UNUSED_ARG(len);es=(struct tcp_client_struct*)arg;if(es->p){sendNum+=1;tcp_client_senddata(tpcb,es);//·¢Ëíêy¾Y}return ERR_OK;} [C] 纯文本查看 复制代码 if(tcp_client_flag&1<<6)//êÇ·ñêÕμ½êy¾Y?{receNum+=1;printf("%srn",tcp_client_recvbuf);tcp_client_flag&=~(1<<6);//±ê¼Çêy¾YòѾ-±»′|àíáË.tcp_client_flag|=1<<7;//±ê¼Çòa·¢Ëíêy¾Y} RECENUM和SENDNUM还有返回消息分别是在上面代码实现的; TCP Server发送一次是6字节,所以应该是发送了418字节,接受一次是9字节,所以应该接受了415次,这样和统计出来的数字之间就有了出入; 是这样的统计方式不准确还是确实有消息丢失了?求指教 |
|
相关推荐
4个回答
|
|
自顶一下
|
|
|
|
|
|
|
|
[C] 纯文本查看 复制代码
void ENC28J60_ISRHandler(void){u8 status;u8 packetnum;u16 temp;ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIE,EIE_INTIE);//1رÕENC28J60μÄ諾ÖÖD¶Ïstatus=ENC28J60_Read(EIR);//¶áè¡òÔì«íøÖD¶Ï±êÖ¾¼Ä′æÆ÷if(status&EIR_PKTIF)//½óêÕμ½êy¾Y,′|àíêy¾Y{ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_PKTIF);//Çå3yENC28J60μĽóêÕÖD¶Ï±ê־λlwip_pkt_handle() ;}if(status&EIR_TXIF)//òÔì«íø·¢ËíÖD¶Ï{ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_TXIF);//Çå3yENC28J60μĽóêÕÖD¶Ï±ê־λ}if(status&EIR_RXERIF)//½óêÕ′íÎóÖD¶Ï±ê־λ{ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_RXERIF);packetnum=ENC28J60_Read(EPKTCNT);temp=ENC28J60_Read(ERXRDPTH)<<8;//¶á衸ß×Ö½útemp|=ENC28J60_Read(ERXRDPTL);//¶áè¡μí×Ö½útemp++;ENC28J60_Write(ERXRDPTL,temp&0XFF);//ÏèD′èëμí×Ö½úENC28J60_Write(ERXRDPTH,temp>>8);//ÏèD′èëμí×Ö½úENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON2,ECON2_PKTDEC);printf("½óêÕ′íÎ󣡽óêÕμ½êy¾Y°ü¸öêy:%drn",packetnum);}if(status&EIR_TXERIF)//·¢Ëí′íÎóÖD¶Ï±ê־λ{ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_TXERIF);ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,ESTAT,ESTAT_LATECOL|ESTAT_TXABRT);printf("·¢Ëí′íÎó!rn");}ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,EIE,EIE_INTIE);//′ò¿aENC28J60μÄ諾ÖÖD¶Ï}//ía2¿ÖD¶ÏÏß1μÄÖD¶Ï·tÎñoˉêyvoid EXTI4_IRQHandler(void){EXTI_ClearITPendingBit(EXTI_Line4); //Çå3yÖD¶ÏÏß41òÆe±ê־λwhile(ENC28J60_INT == 0){ENC28J60_ISRHandler();} } 现在比较怀疑是中断这里的问题,接受数据时是关闭中断的,这样在读取数据的过程中有数据发过来是不是可能就会丢失呢 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2543 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2331 浏览 5 评论
3156 浏览 3 评论
2801 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2759 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
608浏览 1评论
853浏览 0评论
966浏览 0评论
620浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 11:50 , Processed in 1.153952 second(s), Total 86, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号