我正在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变量中的位。)

在我试图第二次移动电机的阶段,我需要重新触发起始位,我这样做了,但它没有被触发,命令也不会被电机执行。我预先假设重组的TCP段是有问题的,因为每次我按下move按钮(我用不同的位置触发起始位)时,一个或多个TCP段被添加到发送的数据包中。通常情况下,这意味着Send_Data()函数一直使用旧的调用触发,但总是使用新的QString Data触发。有没有避免这个问题的解决方案?比如在Send_Data()函数上创建一个互斥变量。
发布于 2017-12-26 03:13:12
我不完全理解您的问题,但我想澄清的是,TCP不能保证在另一端接收到的数据包与发送数据包时具有相同的块。
有可能将发送100 + 100字节,并且在另一端将接收200字节块,或者将接收150和50中的另一个的两个片段。没有办法防止这种情况发生,TCP是这样工作的。
接收程序必须准备好重新组合片段。
https://stackoverflow.com/questions/47831276
复制相似问题