интерпретировать данные UDP в Qt (C ++) - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить трансляцию UDP автомобилей Проекта,

Я могу получать данные (см. Код ниже), но они не читаются и все «растаяли» в одной длинной фразе.

//widget.cpp
 connect(mSocket, &QUdpSocket::readyRead, [&](){
        if(mSocket->hasPendingDatagrams()){
            QByteArray datagram;
            datagram.resize(mSocket->pendingDatagramSize());


            mSocket->readDatagram(datagram.data(),datagram.size());


            QDataStream in(&datagram, QIODevice::ReadOnly);
            in.setVersion(QDataStream::Qt_5_11);
            in >>altitude>>temperature>>humidity;

            QString textAlt = QString::number(altitude);
            QString textTemp = QString::number(temperature);
            QString textHum= QString::number(humidity);

            ui->lineEdit->setText(tr("%1 °C").arg(altitude));
            ui->lineEdit_2->setText(textTemp);
            ui->lineEdit_3->setText(textHum);

        }
    });
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_connectButton_clicked()
{
    mSocket->bind(ui->port->value(),QUdpSocket::ShareAddress);
}

вот моя попытка интерпретировать данные (только первые 9 байтов от byteArray: expl: sWorldPosition [3] ...).

//receiver.cpp
Receiver::Receiver(QWidget *parent)
    : QWidget(parent)
{

    struct sParticipantInfo
    {
        int sWorldPosition[3]; // 0
        int sCurrentLapDistance; // 6
        int sRacePosition; // 8
        int sLapsCompleted; // 9
        int sCurrentLap; // 10
        int sSector; // 11
        float sLastSectorTime; // 14
    };


    statusLabel = new QLabel(tr("Listening for broadcasted messages"));
    statusLabel->setWordWrap(true);

    quitButton = new QPushButton(tr("&Quit"));

    udpSocket = new QUdpSocket(this);
    udpSocket->bind(45454, QUdpSocket::ShareAddress);

    connect(udpSocket, SIGNAL(readyRead()),
            this, SLOT(processPendingDatagrams()));
    connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

    QHBoxLayout *buttonLayout = new QHBoxLayout;
    buttonLayout->addStretch(1);
    buttonLayout->addWidget(quitButton);
    buttonLayout->addStretch(1);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(statusLabel);
    mainLayout->addLayout(buttonLayout);
    setLayout(mainLayout);

    setWindowTitle(tr("Broadcast Receiver"));
}

void Receiver::processPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size());
       struct sParticipantInfo* updPacket = reinterpret_cast<sParticipantInfo*>(datagram.data());



        qDebug() << "sWorldPosition[1]: " << updPacket->sWorldPosition[0];
         qDebug() << "sWorldPosition[2]: " << updPacket->sWorldPosition[1];
          qDebug() << "sWorldPosition[3]: " << updPacket->sWorldPosition[2];
        qDebug() << "sCurrentLapDistance: " << updPacket->sCurrentLapDistance;
        qDebug() << "sRacePosition " << updPacket->sRacePosition;
        qDebug() << "sLapsCompleted " << updPacket->sLapsCompleted;
        qDebug() << "sCurrentLap " << updPacket->sCurrentLap;
        qDebug() << "sSector " << updPacket->sSector;
        qDebug() << "sLastSectorTime" << updPacket->sLastSectorTime;
    }
}

но я замечаю некоторыеошибки в последних строках для примера стрелки в: updPacket-> sLastSectorTime ...

Так что у меня будет два вопроса:

  1. Хорошо ли я использую тип "struct"для разбора данных?
  2. И хорошо ли использовать "reinterpret_cast" / я правильно его использую?
...