首先介绍一下我的情况: - Qt / C ++ UI桌面应用程序 - 嵌入式设备(Stm32l4xx系列)+ ATWINC1500 wifi模块
我正在开发gui应用程序,以便通过套接字将命令和文件发送到emdedded设备。
对于简单的命令,我已经成功完成了所有操作,但是对于发送文件(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数据包并正确发送了数据包(即每个数据包包含一行)。但是......在接收器(设备)上,我知道存在一些关于内存管理不善的问题。一个例子:
我正在试图弄清楚如何重置那部分内存。
答案 0 :(得分:1)
这都错了。 TCP不是面向消息的协议。无法确保TCP数据包包含任何特定数量的数据。设备上的接收器代码也不能指望 - 您可能误解了接收器的代码,或者其他方面做错了(或者是供应商)。接收器必须做的是等待数据包,将数据包的数据添加到缓冲区,然后提取并处理尽可能多的完整行,然后将剩余数据移动到缓冲区的开头。并在每个数据包上重复这一点。
因此,您在错误的地方寻找错误的问题,除非您的设备从未有过工作的机会。如果该设备可以与其他软件一起使用,那么您的打包"打包" TCP假设没有任何用水。
以下是如何继续:
如果该设备已在市场上销售并经过测试,那么您就是在错误的地方寻找。
如果设备是新产品并且仍处于开发阶段,那么某个地方某人做了特别愚蠢的事情,你要么需要解决这个问题,要么让供应商修复它,或聘请顾问来修复它。但是要完全清楚:那不是TCP的工作方式,你不能只接受这个"它是怎样的"。