jiayushu 发表于 2010-8-12 17:48:00

请教版主 LWIP问题

我用STM32F107实现MODBUS TCP    看了很多例子都是每次访问都重新建立连接,数据传输完成,删除连接。现在上位机要求不断开连接。一直进行数据通信。我修改了下例子。现在出现这种情况,每次单片机复位可连接,一旦在连接中,上位机进行断开或非正常情况断开,在连接,没办法进行连接,单请大家帮忙解决下,谢谢了,我的TCP处理任务如下。
void TCP_Modbus_SlaveEntry(void * ptemp)
{
static struct netconn*__pSTConn, *__pstNewConn;
static struct netbuf *__pstNetbuf;


u8 __u8Err;

ptemp = ptemp;

// TCP modbus 初始化;
TCP_ModbusInit();   //加载接受数据

//* 初始化LwIP
__ilvInitLwIP();

//* 设置LwIP,包括添加配置网络接口、建立接收任务等工作
__ilvSetLwIP();

__pSTConn = netconn_new(NETCONN_TCP);
netconn_bind(__pSTConn, NULL, 80);

netconn_listen(__pSTConn);
__pstNewConn = netconn_accept(__pSTConn);



while(OS_TRUE)
{
if(__pstNewConn != NULL)//if(1)
{
__pstNetbuf = netconn_recv(__pstNewConn);
if(__pstNetbuf != NULL)
{
netbuf_copy(__pstNetbuf,TCP_Modbus_SlaveRevBuf,TCP_MODBUS_SLAVE_REV_BUF_SIZE);
__u8Err = TCP_ModbusSlaveRcv(&MSDpr_TCP);                           //MODBUS TCP分析

if(__u8Err == ERROR) // 收到的帧有错误;
{
netconn_write(__pstNewConn, "cuowu",10, NETCONN_COPY); // 错误处理;
OSTimeDlyHMSM(0, 0, 0, 40);
}
else
{
netconn_write(__pstNewConn, MSDpr_TCP.psend,MSDpr_TCP.sendnum, NETCONN_COPY);
OSTimeDlyHMSM(0, 0, 0, 40);
}
}
netbuf_delete(__pstNetbuf);
netconn_close(__pstNewConn);   // 删除连接句柄
//while(netconn_delete(__pstNewConn) != ERR_OK);
OSTimeDlyHMSM(0, 0, 0, 100);
}

}
}

ffxz 发表于 2010-8-12 18:30:08

不同的OS不同的移植还是有差别的。

jiayushu 发表于 2010-8-12 19:27:23

谢谢 版主回复,能否提供些思路,感恩不尽,

Veiko 发表于 2012-11-1 10:47:48

我用的是单片机心跳包+断线重连检测+软件复位的方式来重连的,虽然能够勉强连接,但是还是感觉这样太麻烦了,而且也不是十分稳定,每次都要连续连接两次才能重新建立连接,还是想找一个其他的方法,最好是从协议栈入手修改的!
页: [1]
查看完整版本: 请教版主 LWIP问题