cjh8894 发表于 2014-9-22 13:41:57

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

本帖最后由 cjh8894 于 2014-9-22 13:45 编辑

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




franki 发表于 2014-9-22 15:35:28

路过帮顶 。 我用的是 RAW API 模式 ,你这高级多啦!

cjh8894 发表于 2014-9-22 17:39:06

能帮顶,也要谢一下。

漩涡鸣人 发表于 2015-4-3 10:07:49

你好我也在移植LWIP到 UCOS,我一直卡主了 你那边怎么样 能交流一下吗2213658012

啄木鸟 发表于 2015-4-3 19:45:30

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

lingdianhao 发表于 2015-4-3 23:22:28

modbuspoll使用的是长连接,当你处理一次数据断开连接后,Modbus poll需要重新连接,这个自动重新连接比较慢。所以服务器最好还是使用长连接。

cjh8894 发表于 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);/*获得新连接*/
}
页: [1]
查看完整版本: UCOSII+lwip 只能第一次回应TCP数据包,程序阻塞在 netconn_accept