最大 70 kHz の tcp ソケットを使用して (バイナリ) float 値を送信する測定デバイスを使用しています。
私の目標は、これらの値をできるだけ速く読み取り、プログラムの他の部分で使用することです。
今まで、QTcpSocket と QDataStream を使用して値ごとに値を抽出できました。
最初にソケットを作成し、それにストリームを接続します
mysock = new QTcpSocket(this);
mysock->connectToHost(ip, port);
QDataStream stream(mysock);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setFloatingPointPrecision(QDataStream::SinglePrecision);
次に、ソケットから読み取り、ストリーム データを float 値に書き込みます。
while(true) //only for test purpose (dont stop reading)
if (mysock->waitForReadyRead())
{
while (mysock->bytesAvailable() >= 6)
{
QByteArray a = mysock->read(6); //each value sent is 6 bytes long
stream.skipRawData(2); //first 2 bytes don't belong to the number
float result;
stream >> result;
//qDebug()<<result;
}
}
while(true) ループの反復周波数を測定すると、約 30 kHz を達成できます。読み取りごとに複数の値を読み取ると、最大 70 Khz に達することがあります。(私を遅くするかもしれない他の計算を考慮に入れていません)
私の質問は次のとおりです。
- 一度に複数の値を読み取る場合、QDataStream からこれらの値を抽出するにはどうすればよいですか? 値を含む 4 バイトのみで 6 バイトの間隔が必要です。
回答:私の場合、2 バイト (ゴミ箱) の後に既知の数の値が続きます。たとえば、float の場合は 4 バイト、別の float の場合は 4 バイト、uint16 の場合は 2 バイトです。
stream >> trashuint16 >> resultfloat1 >> resultfloat2 >> resultuint16
- 展開 1: さまざまな変数に書き込む必要があるさまざまな型 (int、float) のさまざまな値を送信するようにデバイスを構成できます。
答え:同じです。
- QTcpSocket から多くの値を読み取るより効率的な方法はありますか?
回答:コメントで回答しました。
更新(いくつかの質問に答えるために):
- バイト単位の最大レート: 70 kHz x 6 バイト (1 つの値に対して) = 420 kB/s (それほど多くはないようです :))
更新 2
- 新しい質問: (を使用して) トランザクションを開始するとき、
stream.startTransaction
そのストリーム内の内容をバイナリ コードで知りたいです。 - 仕組みがわかりません
QDataStream::startTransaction
。何バイト読まれますか?を使用して抽出しないデータはどうなり>>
ますか?
私は次のことを試しました:
if (mysock->waitForReadyRead())
{
stream.startTransaction();
char *c = new char[40];
stream.readRawData(c, 40); //I want to know whats really inside
QByteArray a(c);
qDebug() << a <<stream.status();
if (!stream.commitTransaction())
break;
}
これを何度も繰り返していると、status = -1 (読みすぎ) になることもあれば、そうでないこともあります。ストリームの「サイズ」を取得するにはどうすればよいですか?