【发布时间】:2026-01-12 19:25:02
【问题描述】:
我正在开发一个 GUI 来显示来自传感器的图像。 GUI 充当客户端,而传感器充当服务器。一旦我向传感器发送命令,传感器将通过 TCP 将流式原始图像数据(二进制数据)连续发送到 GUI。数据将是图像内存的精确副本,大小为宽度 (1240) x 高度 (1028),以 U8(无符号 8 位)编码。一个传入数据的大小是(1240 x 1028 x 1 字节)+ 20 字节(元头)= 1.3MByte。
我最大的障碍是: 1.) 如何连续接收和存储来自传感器的流数据用于显示目的? 2.) 如何显示原始数据?
我尝试了以下代码,但它不起作用。请指教:
“客户端.h”
#ifndef CLIENT_H
#define CLIENT_H
#include <QObject>
#include <QWidget>
#include <QTcpSocket>
class Client : public QWidget
{
Q_OBJECT
public:
explicit Client(QWidget *parent = 0);
int capture (int mode, int NBRLine);
signals:
public slots:
private:
QTcpSocket* socket;
};
#endif // CLIENT_H
“客户端.cpp”
#include "client.h"
#include <QHostAddress>
#include "mainwindow.h"
#include <QtGui>
#include <QAbstractSocket>
#include <QImage>
Client::Client(QWidget *parent) :
QWidget(parent)
{
socket = new QTcpSocket(this);
}
int Client::capture(int mode, int NBRLine)
{
if (socket->state() != QTcpSocket::ConnectedState)
{
socket->connectToHost("192.168.0.65", 1096);
}
/* send command to retrieve raw image data from sensor */
if(socket->waitForConnected(5000))
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out.setByteOrder(QDataStream::LittleEndian);
out << qint32(0) << qint32(0) << qint32(0) << qint32(1);
out << qint32(9) << qint32(1) << qint32(0) << mode << qint32(10) << qint32(2) << qint32(0) << NBRLine ;
socket->write(block);
socket->flush();
}
else
{
return false;
}
/**********************************************************/
/* to get data size of each scan through width and height in the meta header */
QDataStream input(socket);
input.setVersion(QDataStream::Qt_4_0);
input.setByteOrder(QDataStream::LittleEndian);
qint32 buffer, cmdID, counter, metaSize, width, height;
do
{
if (socket->waitForReadyRead(1000))
{
input >> cmdID;
if (cmdID == 101)
{
input >> buffer >> buffer >> buffer >> buffer;
}
}
else
{
socket->disconnectFromHost();
break;
}
} while (cmdID != 1);
input >> counter >> metaSize;
if (metaSize != 8) return false;
input >> width >> height;
quint32 datasize = width * height;
/**********************************************************/
/* Receiving streaming data which I have problem here !!!! */
while (socket->bytesAvailable() < datasize + 80) {
if (!socket->waitForReadyRead(1000)) {
socket->disconnectFromHost();
break;
}
}
QImage img;
input >> img;
if (img.isNull())
{
return 0;
}
img.save("E:/temp1");
return 1;
}
【问题讨论】:
-
QTcoSocket类有一个不间断的readyRead() 信号,可以连接到您的数据处理器。对于显示原始数据,this thread 可能会对您有所帮助。