完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`我打开了socket 0的接收中断,收到数据也能产生中断,写中断寄存器相应为也能清除中断,现在的问题是如果把Process_LoopBack();环回测试程序放在主循环里,连接成功后就可以一直来测试还回,主循环代码如下
但是如果把主循环里的Process_LoopBack();屏蔽,而是放到中断服务程序里,就会有两个问题 1,中断服务程序里只有Process_LoopBack();和清除中断的指令,那么环回的时候,接收缓存数据长度读出不对,发了一堆无意义的数据回来了,代码如下 /*中断服务*/ void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判别是否有外部中断 { //清除中断请求标志 Process_LoopBack(); Write_SOCK_1_Byte(0,Sn_IR,IR_RECV); //清除socket 0的接收中断 Write_1_Byte(SIR,S0_INT); //清除socket 0的中断 EXTI_ClearITPendingBit(EXTI_Line0); } } /*主循环*/ while(1) { Process_IR(); i=Read_SOCK_1_Byte(0,Sn_SR); if(i==0) //若超时等重新建立TCP连接,这里只建了一个端口的连接。 { do { Delay_ms(100); /* set Socket n Port Number as 5000 */ Write_SOCK_2_Byte(0, Sn_PORT, S0_Port); }while(Socket_Connect(0)==FALSE); } else if(i==SOCK_ESTABLISHED) { //unsigned char n; //Process_LoopBack(); //Delay_ms(100); } else if(S0_TimeOut) { S0_TimeOut=0; } } 2,中断服务程序如果把主循环的代码全部包含进去,则会出现能够环回数据,但是发个1-2次就会自动断开连接,然后又会自动连接,代码如下 /*中断服务*/ void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判别是否有外部中断 { //清除中断请求标志 unsigned char i; Process_IR(); i=Read_SOCK_1_Byte(0,Sn_SR); if(i==0) //若超时等重新建立TCP连接,这里只建了一个端口的连接。 { do { Delay_ms(100); /* set Socket n Port Number as 5000 */ Write_SOCK_2_Byte(0, Sn_PORT, S0_Port); }while(Socket_Connect(0)==FALSE); } else if(i==SOCK_ESTABLISHED) { Process_LoopBack(); } Write_SOCK_1_Byte(0,Sn_IR,IR_RECV); //清除socket 0的接收中断 Write_1_Byte(SIR,S0_INT); //清除socket 0的中断 EXTI_ClearITPendingBit(EXTI_Line0); } } /*主循环*/ while(1) { Process_IR(); i=Read_SOCK_1_Byte(0,Sn_SR); if(i==0) //若超时等重新建立TCP连接,这里只建了一个端口的连接。 { do { Delay_ms(100); /* set Socket n Port Number as 5000 */ Write_SOCK_2_Byte(0, Sn_PORT, S0_Port); }while(Socket_Connect(0)==FALSE); } else if(i==SOCK_ESTABLISHED) { //unsigned char n; //Process_LoopBack(); //Delay_ms(100); } else if(S0_TimeOut) { S0_TimeOut=0; } } 不知道有遇见过这个问题的能否解答一下,感谢 ` |
|
相关推荐
11 个讨论
|
|
本帖最后由 powerdruy 于 2014-4-28 14:41 编辑
产生一个中断是我手动来控制的,应该不是漏掉中断的问题,而且我现在把函数移出中断了,只留一个标志位在里面,问题依然如故 1,process_loopbac();的代码如下 /********** Loop Back test *********/ void Process_LoopBack(void) { unsigned short i; /* Read Data from RX buffer */ i=Read_SOCK_Data_Buffer(0, S_Data_Buffer); if(i==0) return; /* Write Data to TX Buffer */ while((S0_SendOK==0)&&(S0_TimeOut==0)) Process_IR(); if(S0_SendOK==1) { S0_SendOK=0; Write_SOCK_Data_Buffer(0, S_Data_Buffer, i); //发送收到的 } else { S0_TimeOut=0; } } 2,Process_IR();代码如下 /********* Process IR Register ********/ void Process_IR(void) { unsigned char i; i=Read_1_Byte(SIR); if(i&0x01) { i=Read_SOCK_1_Byte(0,Sn_IR); Write_SOCK_1_Byte(0,Sn_IR,i); /* Clear IR flag */ if(i&IR_CON) /* TCP CONNECT established */ { LED1(ON); /* Turn on LED */ } if(i&IR_DISCON) /* TCP Disconnect */ { Write_SOCK_1_Byte(0,Sn_CR,CLOSE); /* Close Socket 0 */ LED1(OFF); /* Turn off LED */ } if(i&IR_TIMEOUT) { S0_TimeOut=1; Write_SOCK_1_Byte(0,Sn_CR,CLOSE); /* Close Socket 0 */ LED1(OFF); } if(i&IR_SEND_OK) { S0_SendOK=1; } } } |
|
|
|
|
|
这里有一个W5200的Loopback代码,是用中断写的,你可以参考一下。
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
480个成员聚集在这个小组
加入小组5108 浏览 1 评论
12158 浏览 5 评论
3510 浏览 2 评论
2976 浏览 0 评论
12732 浏览 2 评论
w5500 作为tcp server,客户端异常发送【RST,ACK】断开连接问题
1877浏览 1评论
1108浏览 0评论
使用stm32,通过spi的dma 收发,运行多次读写以后w5500发送正常,接收卡死,高人帮忙看看
6311浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 16:18 , Processed in 1.019036 second(s), Total 71, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号