我使用stm32f4的共济会总线库作为modbus从设备。
我有一个与Modbus TCP远程端口连接的问题,当我启动从设备,连接到Modbus主PC时,他们的通信比他们成功地通信要好,我从modbus主机端拔出以太网电缆,他们无法相互通信,当我分析这个问题时,我得到了非常有趣的信息。
当我拔掉电缆,重新连接到PC上时。PC每次改变远程端口,所以从机不知道prvxMBTCPPortAccept回调,调用每个可异常端口请求比,我分析pxPCBClient不为零,因为以前的连接,并且它不干净后,主端口更改,所以每次pxPCBClient != null比modbus TCP状态很有趣,pxPCB信息有新的连接请求信息当我比较。
pxPCBClient->remote_port和pxPCB->remote_port客户端远程端口在成功之前就拥有永久的端口信息,而pxPCB-> remote _port改变了每个PC的更改端口。
我该如何解决这个问题?当我拔掉电缆和重新连接时,如何再从连接?请帮帮我
当我输入modbus TCP接受回调时,我使用了如下行:
tcp_accept( pxPCBListenNew, prvxMBTCPPortAccept );和prvxMBTCPPortAccept函数:
err_t prvxMBTCPPortAccept( void *pvArg, struct tcp_pcb *pxPCB, err_t xErr )
{
err_t error;
if( xErr != ERR_OK )
{
return xErr;
}
SerialPrint("\nPCBClient Port : %d\n",pxPCBClient->remote_port);
SerialPrint("pxPCB Port : %d\n",pxPCB->remote_port);
/* We can handle only one client. */
if( pxPCBClient == NULL )
{
/* Register the client. */
pxPCBClient = pxPCB;
/* Set up the receive function prvxMBTCPPortReceive( ) to be called when data
* arrives.
*/
tcp_recv( pxPCB, prvxMBTCPPortReceive );
/* Register error handler. */
tcp_err( pxPCB, prvvMBTCPPortError );
/* Set callback argument later used in the error handler. */
tcp_arg( pxPCB, pxPCB );
/* Reset the buffers and state variables. */
usTCPBufPos = 0;
#ifdef MB_TCP_DEBUG
vMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Accepted new client %d.%d.%d.%d\r\n",
ip4_addr1( &( pxPCB->remote_ip ) ),
ip4_addr2( &( pxPCB->remote_ip ) ),
ip4_addr3( &( pxPCB->remote_ip ) ), ip4_addr4( &( pxPCB->remote_ip ) ) );
#endif
error = (int8_t)ERR_OK;
}
else
{
prvvMBPortReleaseClient( pxPCB );
error = (int8_t)ERR_OK;
}
return error;
}发布于 2021-01-13 17:30:09
主程序
。
。
https://stackoverflow.com/questions/65697320
复制相似问题