通过TCP从labVIEW发送图像到QT

时间:2018-03-22 14:43:19

标签: c++ image qt tcp labview

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

我的问题是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代码中,我发送首先发送的字节大小,然后发送原始图像数据:

LabVIEW code image

编辑:连接插槽。还应该提到这是在一个单独的线程中运行到主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);
}

1 个答案:

答案 0 :(得分:0)

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