首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免重组TCP段"Modbus TCP通信“

避免重组TCP段"Modbus TCP通信“
EN

Stack Overflow用户
提问于 2017-12-15 19:18:58
回答 1查看 180关注 0票数 0

我正在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数据段(如下图所示):

代码语言:javascript
复制
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()函数上创建一个互斥变量。

EN

回答 1

Stack Overflow用户

发布于 2017-12-26 03:13:12

我不完全理解您的问题,但我想澄清的是,TCP不能保证在另一端接收到的数据包与发送数据包时具有相同的块。

有可能将发送100 + 100字节,并且在另一端将接收200字节块,或者将接收150和50中的另一个的两个片段。没有办法防止这种情况发生,TCP是这样工作的。

接收程序必须准备好重新组合片段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47831276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档