|
我用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);
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|