繁体   English   中英

QTcpSocket发送的数据超过所需的数量-Qt / C ++

[英]QTcpSocket sends more data than wanted - Qt/C++

首先介绍一下我的情况:-Qt / C ++ UI桌面应用程序-嵌入式设备(Stm32l4xx系列)+ ATWINC1500 wifi模块

我正在开发gui应用程序,以便通过套接字将命令和文件发送到嵌入式设备。

对于简单的命令,我已经成功完成了所有操作,但是对于发送文件(GCODE格式的文本文件),我遇到了一些问题。 嵌入式设备已经具有套接字管理(不是我写的,因此我无法修改来自第三方公司的套接字管理方式),并且以这种方式管理此类文件的接收: API等待文件发送的每一行,然后将其写入闪存的保留部分。

我的问题是,当我从qt应用程序发送文件时(通过读取每一行并在该行上调用write()),实际上我的套接字发送了文件的整个块,如50行,导致我的设备无法管理文件接收。

我的发送代码是这样的:

void sendGCODE(const QString fileName)
{
    QFile *file = new QFile(fileName,this);
    bool result = true;
    if (file->open(QIODevice::ReadOnly))
    {

      while (!file->atEnd())
      {
          QByteArray bytes(file->readLine());

          result = communicationSocket->write(bytes);
          communicationSocket->flush();
          if(result)
          {

              console->append("-> GCODE line sent:"+ QString(bytes));

          }
          else
          {
              console->append("-> Error sending GCODE line!");
          }
       }
       file->close();
    }

}

你们中有人对我做错了什么吗? 我已经搜索过,并且有人在其他主题上提出建议,为此,最好使用UDP而不是TCP套接字,但是不幸的是,我无法触摸嵌入式设备端的代码。 谢谢你们!

编辑

经过评论的建议后,我已嗅探tcp数据包,并且数据包已正确发送(即,每个数据包包含一行)。 但是...在接收器(设备)上,我了解到有关内存的某些内容管理不善。 一个例子:

  • 发送方发送行“ G1 X470.492 Y599.623 F1000”; 接收器正确接收字符串“ G1 X470.492 Y599.623 F1000”
  • 接下来,如果行长小于先前发送的行长,即发送“ G1 Z5”,则接收方会收到:“ G1 Z5 \\ n \\ n.492 Y599.623 F1000”,因此很明显,用于存储数据包未从先前的包内容中重新初始化,新部分将覆盖先前的值,而其余部分来自先前的包

我试图弄清楚如何重置那部分内存。

都错了 TCP不是面向消息的协议。 无法确保TCP数据包包含任何特定数量的数据。 设备上的接收方代码也不能期望-您可能误解了接收方的代码,或者做错了其他事情(或供应商正在做的事情)。 接收者必须做的是等待一个数据包,将数据包的数据添加到缓冲区中,然后提取并处理尽可能多的完整行,然后将剩余的数据移至缓冲区的开头。 并在每个数据包上重复该操作。

因此,除非您的设备从未有过工作的机会,否则您正在错误的位置寻找错误的问题。 如果该设备可以与其他软件一起正常工作,则您的“打包” TCP假设不会起作用。

操作方法如下:

  1. 如果该设备在市场上有售,并且已经过测试工作,则说明您在错误的位置。

  2. 如果该设备是新产品并且仍在开发中,则某处某人做了一些特别愚蠢的事情,您要么需要解决该愚蠢问题,要么让供应商对其进行修复,或者雇用顾问对其进行修复。 只是要完全清楚:这不是TCP的工作方式,您不能仅仅接受“它就是这样”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM