C++ QTcpSocket发送的数据比所需的多-Qt/C++;
首先介绍一下我的情况: -Qt/C++UI桌面应用程序 -嵌入式设备(Stm32l4xx系列)+ATWINC1500无线模块 我正在开发gui应用程序,以便通过套接字向嵌入式设备发送命令和文件 对于简单的命令,我都成功地完成了,但是对于发送文件(GCODE格式的文本文件),我遇到了一些问题。 嵌入式设备已经有了套接字管理(不是我写的,因此我无法修改来自第三方公司的套接字管理方式),并且该类型文件的接收以API等待发送的每一行文件的方式进行管理,然后将其写入闪存的保留部分 我的问题是,当我从qt应用程序发送文件时(通过读取每一行并在该行上调用write()),实际上我的套接字发送整个文件块,比如50行,导致我的设备无法管理文件接收 我的发送代码是:C++ QTcpSocket发送的数据比所需的多-Qt/C++;,c++,qt,sockets,networking,tcp,C++,Qt,Sockets,Networking,Tcp,首先介绍一下我的情况: -Qt/C++UI桌面应用程序 -嵌入式设备(Stm32l4xx系列)+ATWINC1500无线模块 我正在开发gui应用程序,以便通过套接字向嵌入式设备发送命令和文件 对于简单的命令,我都成功地完成了,但是对于发送文件(GCODE格式的文本文件),我遇到了一些问题。 嵌入式设备已经有了套接字管理(不是我写的,因此我无法修改来自第三方公司的套接字管理方式),并且该类型文件的接收以API等待发送的每一行文件的方式进行管理,然后将其写入闪存的保留部分 我的问题是,当我从qt应
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假设就站不住脚了 以下是如何继续:
在写行之间添加一些睡眠?你有没有检查过像wireshark这样的工具,你实际上在生成什么流量?@AlanBirtles哇,我有多蠢,我现在来检查wireshark日志,看看我到底在发送什么。我已经考虑过睡眠,但这不是一个好主意,因为它会反复阻止我的UI,这不是我想要的。所以根本原因是您的设备和/或其协议已无法修复地损坏。TCP流控制应该在接收器准备好之前关闭发送。@很抱歉,我无法获取“在接收器准备好之前应该关闭发送”部分。你在说什么?你关于发送代码的问题是离题的,因为代码是有效的。也许你应该问一下如何在设备本身中修复接收代码-这是一个好问题,正确的实现是如此微不足道(10-20行C)我很困惑,设备供应商竟然弄错了。谢谢你的回复。我更喜欢与更有礼貌、不那么自负的人聊天,但事实是,似乎很多人都知道所有人都在那里。回答某人的问题有不同的方式。但是,没关系,我会感谢你的有用提示,我会尽快开始为了更好地理解我的错误所在以及如何修复它。谢谢