2016-11-21 184 views
1

我在我的微控制器(MSP432)上运行一个应用程序,它将数据写入以太网电缆并将其发送到PC。端口编号如何工作以接收MODBUS TCP数据包?

我正在使用数据包发件人查看从MC上的PC端口(502)上收到的数据。 Data received on PC

正如我们在上图中看到的,MC的端口号对于每个发送的包都是递增的。 达到最大数量时会发生什么? 它会重新启动其他端口号并继续进行或停止?从http://myarduinoprojects.com/modbus.html

EDIT2使用Modbus协议库:

EDIT1 使这一功能,每次我有一个新的数据通过MODBUS发送呼叫。 Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS,0,11,0);

if (MbmClient.connect(ServerIp,502)) { 
    digitalWrite(GREEN_LED, HIGH); 
#if DEBUG 
    //Serial.println("connected with modbus slave"); 
// Serial.print("Master : "); 
    for(int i=0;i<MbmByteArray[5]+6;i++) { 
    if(MbmByteArray[i] < 16){ 
    //Serial.print("0"); 
    } 
    //Serial.print(MbmByteArray[i],HEX); 
    if (i != MbmByteArray[5]+5) { 
    //Serial.print("."); 
    } else { 
    //Serial.println(); 
    } 
    } 
#endif  
MbmClient.write(MbmByteArray,13+(Count*2)); 

MbmCounter = 0; 
MbmByteArray[7] = 0; 
MbmPos = Pos; 
MbmBitCount = Count; 

*state= true; 
MbmClient.stop(); 
delay(100); 
digitalWrite(GREEN_LED, LOW); 
} else { 

    *state= false; 
    MbmClient.stop(); 
} 
+0

有没有办法看到所有的TCP消息?我的意思是包括3次握手?在MC中,你如何发送消息?使用TCP套接字?或者只是发送一个包含含有TCP消息的IP数据报的以太网帧? – rodolk

+0

我使用IP地址(PC上的以太网IP),端口号进行了连接。那是你问的吗? – JKV

+0

它看起来像是每个消息使用一个新的连接,这是非常糟糕的。端口号将环绕,或者如果它们使用得太快,客户端将会出现绑定错误。 – EJP

回答

0

看来你正在使用this Modbus example 我从来没有与工作,但我想这是因为在代码中的目的端口是一样的,你在your sniffing image:502

可能是你一边喊这个方法:

void MgsModbus::Req(MB_FC FC, word Ref, word Count, word Pos) 

在此方法中,你可以看到这行:

if (MbmClient.connect(ServerIp,502)) { 
... 

因此,每次调用该函数时都会打开一个新连接。当您通过套接字打开连接时,操作系统或网络堆栈需要选择发送TCP消息的源端口和IP地址。

这就是为什么你总是看到一个新的源端口,并且该端口正在增加。这就是所谓的短暂港口。源端口如何由您正在使用的TCP堆栈选择是依赖于实现的,尽管从一些端口开始并且每次连接打开时它都是非常常见的,它会选择下一个可用端口。

如果堆栈编程良好,很可能您的TCP堆栈将环绕并从1024开始(1024个端口受限制)的某个特定端口。我看到的代码似乎关闭与此功能的端口:

MbmClient.stop() 

您需要检查端口,在使用后,关闭。否则,在某些时候,你将用尽可用的端口(资源泄漏)。

如果你希望你的套接字绑定到特定的源端口,您需要使用类似的功能,Linux socket bind

现在,一个更明智的方法是用所有的时间相同的连接。您可能需要修改该示例。

+0

我在原帖中添加了代码。 因此,只要我通过调用** MbmClient.connect(ServerIp,502)**来建立连接,我也将关闭连接。那么为什么每次都连接到不同的端口呢? 您可以指导我如何继续使用相同的端口方法。谢谢 – JKV

+0

@JanakVarma,每当您的应用程序启动连接时,它都会选择一个[临时端口](https://en.wikipedia.org/wiki/Ephemeral_port)。这通常是随机选择的,但你的TCP实现似乎不是这样做的。你的应用程序要求TCP为它选择一个源端口。您可以告诉TCP要使用哪个端口,而不是将其留给TCP来选择端口。 –

+0

@JanakVarma,我认为我的回答很明显,解释了为什么它总是使用不同的源端口。它始终连接到相同的目标端口502.我添加了更多的措辞,试图使其更清晰。你也可以看看Ron Maupin的评论,并阅读他提供的链接。 – rodolk