搜索
bottom↓
回复: 6

UCOSII+lwip 只能第一次回应TCP数据包,程序阻塞在 netconn_accept

[复制链接]

出0入0汤圆

发表于 2014-9-22 13:41:57 | 显示全部楼层 |阅读模式
本帖最后由 cjh8894 于 2014-9-22 13:45 编辑

   请大家帮忙看一下这个程序,一直在pstNewConn = netconn_accept(pstConn);处停下啦,用modbus  poll重联后也只能发一次数据,平台是路虎开发板LPC1768,用EASY WEB例程上修改的,想做一下MODBUS TCP服务器,用HTTP WEB 在IE界面修改参数,UCOS 多任务没问题,网页AD显示不死机数据正常,请问万能的坛如何退出UCOS LWIP   netconn_accept(pstConn)阻塞状态,实现连续回应TCP数据流。
   static  void    uctsk_ModbusTcp(void )
{

                struct netconn  *pstConn, *pstNewConn;
                      struct netbuf        *TCPNetbuf;
                   pstConn = netconn_new(NETCONN_TCP); /*新建TCP连接*/
                       netconn_bind(pstConn, NULL,502);           /*绑定502端口*/
                       netconn_listen(pstConn);                           /*服务器侦听连接*/
            
           for(;;)

        {
           printf("Default ModbusTcp_test: Acceqt\r\n");
                   程序此处阻塞 pstNewConn = netconn_accept(pstConn);/*获得新连接,阻塞进程直至从远程主机发出的连接请求到达指定的连接*/
                 
                                              if(pstNewConn != NULL)        /*新连接有效,则处理数据*/
          
                         {
               
                                TCPNetbuf = netconn_recv(pstNewConn); /*接收数据*/

                if(TCPNetbuf != NULL)          /*处理有效数据*/
                 {
                                  netbuf_data (TCPNetbuf,&pbData, &LWIP_Len );/*获得数据起始地址和长度*/
                  
                 
                                                             //        netbuf_data (TCPNetbuf,(void *)&pbData, &LWIP_Len );/*获得数据起始地址和长度*/                       
                         
                                ModbusTcp_Slave();
                                netconn_write(pstNewConn,pbData,LWIP_Len,NETCONN_NOCOPY);
               
                                                              netbuf_delete(TCPNetbuf);/*删除缓存数据*/
                               netconn_close(pstNewConn);       /* 关闭连接  */
                          
                        while(netconn_delete(pstNewConn) != ERR_OK)
                        {
                                OSTimeDlyHMSM(0, 0, 0, 10);
                               
                        }
                  
                                    }

             }
                 
    }
}
MODBUS TCP  POLL数据断开重联响应一次数据,不断开只响应一次,用IRIS看一下TCP数据包有ACK确认就是不响应数据包:
000000-Tx:00 25 00 00 00 06 08 03 00 03 00 01
000001-Rx:00 25 00 00 00 05 08 03 02 00 00
000002-Tx:00 26 00 00 00 06 08 03 00 03 00 01
000003-Rx:00 25 00 00 00 05 08 03 02 00 00
000004-Tx:00 27 00 00 00 06 08 03 00 03 00 01
000005-Tx:00 28 00 00 00 06 08 03 00 03 00 01
000006-Tx:00 29 00 00 00 06 08 03 00 03 00 01
000007-Tx:00 2A 00 00 00 06 08 03 00 03 00 01
000008-Tx:00 2B 00 00 00 06 08 03 00 03 00 01
000009-Rx:00 2B 00 00 00 05 08 03 02 00 00
000010-Tx:00 2C 00 00 00 06 08 03 00 03 00 01
000011-Rx:00 2B 00 00 00 05 08 03 02 00 00
000012-Tx:00 2D 00 00 00 06 08 03 00 03 00 01
000013-Tx:00 2E 00 00 00 06 08 03 00 03 00 01
000014-Tx:00 2F 00 00 00 06 08 03 00 03 00 01
000015-Tx:00 30 00 00 00 06 08 03 00 03 00 01




阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-9-22 15:35:28 | 显示全部楼层
路过帮顶 。 我用的是 RAW API 模式 ,你这高级多啦  !

出0入0汤圆

 楼主| 发表于 2014-9-22 17:39:06 | 显示全部楼层
能帮顶,也要谢一下。

出0入0汤圆

发表于 2015-4-3 10:07:49 | 显示全部楼层
你好  我也在移植LWIP  到 UCOS  ,我一直卡主了 你那边怎么样 能交流一下吗  2213658012

出0入0汤圆

发表于 2015-4-3 19:45:30 | 显示全部楼层
netconn_close(pstNewConn);       /* 关闭连接  */
                          
                        while(netconn_delete(pstNewConn) != ERR_OK)
                        {
                                OSTimeDlyHMSM(0, 0, 0, 10);
                                
                        }
因为这里服务器接受了客户端一次数据通信之后就关闭连接了,所以只能重新建立连接。lwip保持连接不算非常可靠。所以服务器连接一次之后关闭连接,以免一直保持连接时意外的客户端连接中断,这样,反而可靠。

出0入0汤圆

发表于 2015-4-3 23:22:28 | 显示全部楼层
modbus  poll使用的是长连接,当你处理一次数据断开连接后,Modbus poll需要重新连接,这个自动重新连接比较慢。所以服务器最好还是使用长连接。

出0入0汤圆

 楼主| 发表于 2015-4-4 13:36:47 | 显示全部楼层
本帖最后由 cjh8894 于 2015-4-4 13:38 编辑

现在我是这样处理的:

for(;;)
           {         
                   while((TCPNetbuf = netconn_recv(pstNewConn))!= NULL)        /*新连接有效,数据包非空处理数据*/
                 
                     {
                netbuf_data (TCPNetbuf,(void *)&pbData, &LWIP_Len );/*如果不是ACK FIN结束标志,获得数据起始地址和长度*/
                        netconn_write(pstNewConn,pbData,LWIP_Len,NETCONN_NOCOPY);
                 netbuf_delete(TCPNetbuf);/*删除缓存数据*/
                                                                                                                   
                 }       
        netconn_close(pstNewConn); /* 关闭连接  */
                        while(netconn_delete(pstNewConn) != ERR_OK)
                             {
                                    OSTimeDlyHMSM(0, 0, 0, 50);
                             }
                   pstNewConn = netconn_accept(pstConn);/*获得新连接*/
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 07:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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