0

最大 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 (読みすぎ) になることもあれば、そうでないこともあります。ストリームの「サイズ」を取得するにはどうすればよいですか?

4

1 に答える 1