【问题标题】:Sending images over TCP from labVIEW to QT通过 TCP 将图像从 LabVIEW 发送到 QT
【发布时间】:2018-03-24 14:59:02
【问题描述】:

我正在尝试捕获从连接到 myRIO 的相机拍摄的图像,并通过 TCP/IP 连接将它们从 labVIEW 发送到 QT GUI 应用程序。

我的问题是,当我读取数据时,QT 不断抛出堆指针异常并崩溃。 表达式:is_block_type_valid(header->_block_use)

我相信这可能是因为正在发送的数据超过 35k 字节,所以我尝试以单独的块读取数据,但遗憾的是仍然收到错误。

下面是我在发出 readyRead() 时调用的函数:

void TCPHandler::onRead() {


QByteArray byteArray;
QByteArray buffer;
QByteArray dataSize = mainSocket->read(5); //read the expected amount of bytes incoming (about 35000)
while (buffer.size() < dataSize.toInt()) {
    int bytesLeft = dataSize.toInt() - buffer.size();
    if (bytesLeft < 1024) {
        byteArray = mainSocket->read(bytesLeft);
    }
    else {
        byteArray = mainSocket->read(1024);
    }

    buffer.append(byteArray);
}
QBuffer imageBuffer(&buffer);
imageBuffer.open(QIODevice::ReadOnly);

QImageReader reader(&imageBuffer, "JPEG");
QImage image;
if(reader.canRead())
    image = reader.read();
else {
    emit read("Cannot read image data");
}

if (!image.isNull())
{
    image.save("C:/temp");
}
else
{
    emit read(reader.errorString());
}}

在 LabVIEW 代码中,我首先发送要发送的字节大小,然后是原始图像数据:

编辑:连接插槽。还应该提到这是在主 GUI 的单独线程中运行的。

TCPHandler::TCPHandler(QObject *parent)
    : QObject(parent),
    bytesExpected(0)
{
    mainSocket = new QTcpSocket(this);

    connect(mainSocket, SIGNAL(readyRead()), this, SLOT(onRead()));
    connect(mainSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), this, &TCPHandler::displayError);
}

【问题讨论】:

  • 你能把connect显示给这个槽吗?
  • 您是否在每个数据包中发送预期的传入字节数
  • 编辑显示连接槽。是的,我正在发送每个数据包中传入的预期字节数。这取决于图像数据的长度,但通常在 38000 字节左右。
  • 欢迎来到 Stack Overflow!请edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs
  • 您假设onRead 被调用时使用了一些特定的字节数。您可以保证输入onRead 时至少有一个字节。您不执行错误检查。这就是您的问题的根源,它与“一次发送 35kB”无关:无论如何,有线协议必须将其分块以适应 MTU。不要想太多:TCP/IP 数据传输几乎可以正常工作,而无需对现代框架大惊小怪。如果它不起作用,那是由于错误,而不是因为您没有执行一些魔法咒语。

标签: c++ image qt tcp labview


【解决方案1】:

您将长度作为十进制字符串发送。然后是字符串。 我希望长度是二进制值。因此,不要使用 'I32 to String' 函数,而是使用带有字符串作为类型的 typecast

【讨论】:

    猜你喜欢
    • 2014-12-01
    • 2018-10-24
    • 2014-01-16
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多