我正在FHPP模式下与FESTO控制器进行通信,正如我之前的问题Qt/C++ communication with CMMO-ST-C5-1-LKP Festo controller over Modbus TCP中已经提到的那样,我试图详细说明连续的Modbus TCP通信。我创建了一个函数Send_data()
,它允许发送一个Modbus TCP数据包,使其成为一个连续的通信,我使用全局QTimer
,并使它每100毫秒触发一次这个函数:
m_timer->start(100)
connect(m_timer, &QTimer::timeout, [this]() {
Send_Data();
});
当配置位固定为0或1时没有问题,然后我可以更改我的全局变量QString Data
数据包并发送它。问题是必须将位(配置或定位)作为上升沿或下降沿触发。当我尝试这样做时,这会创建重组的TCP段(如下图所示):
void Stepper::trigger_bit(bit bitName){
switch (bitName) {
case(RES): {
activer_reset();break;
}
case(HOM): {
activer_homing();
break;
}
case(START): {
activer_start();
break;
}
case(CLEAR): {
activer_clear();
break;
}
case(HALT): {
desactiver_halt();
break;
}
}
connect(m_timer, &QTimer::timeout, [this]() {
Send_Data();
});
switch (bitName) {
case(RES): {
desactiver_reset();break;
}
case(HOM): {
desactiver_homing();
break;
}
case(START): {
desactiver_start();
break;
}
case(CLEAR): {
desactiver_clear();
break;
}
case(HALT): {
activer_halt();
break;
}
}
connect(m_timer, &QTimer::timeout, [this]() {
Send_Data();
});}
(trigger_bit(bit bitName)
内的这些方法修改QString Data
变量中的位。)
在我尝试第二次移动电机的阶段,我需要重新触发START位,我这样做但是没有触发它并且命令不会被执行发动机。我假设重新组装的TCP段是问题,因为每次按下移动按钮(我触发具有不同位置的START位),一个或多个TCP段被添加到发送的数据包中。通常情况下,这意味着Send_Data()
函数会一直触发旧的调用,但总是会触发新的QString Data
。有没有解决方案来避免这个问题?比如在Send_Data()
函数上创建互斥变量。
答案 0 :(得分:0)
我不完全理解你的问题,但我想澄清一点,TCP并不能保证发送的数据包在另一端收到的是与发送数据包相同的块。
可能会发送100 + 100个字节,另一端将收到200字节的块,或者接收150个中的一个和50个中的另一个。 没有办法防止这种情况发生,TCP以这种方式工作
接收程序必须准备好重新组合片段。