1

我正在我的微控制器(MSP432)上运行一个应用程序,它将数据写入以太网电缆以将其发送到 PC。

我正在使用 Packet sender 查看从 MC 在 PC 上的端口(502)上接收到的数据。 在 PC 上接收到的数据

如上图所示,每发送一个数据包,MC 的端口号就会递增。当它达到最大数量时会发生什么?它会在其他端口号重新启动并继续该过程还是会停止?

Edit1:使用的 Modbus 协议库来自http://myarduinoprojects.com/modbus.html

Edit2:每次我有新数据要通过 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();
}
4

1 回答 1

0

看来您正在使用这个 Modbus 示例 ,我从未使用过它,但我想这是因为代码中的目标端口与您在嗅探图像中的相同: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()

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

如果你想让你的socket绑定到一个特定的源端口,你需要使用类似于Linux socket bind的函数

现在,更明智的方法是始终使用相同的连接。您可能需要修改该示例。

于 2016-11-21T23:06:46.477 回答