Я пытаюсь получить трансляцию 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 ...
Так что у меня будет два вопроса:
- Хорошо ли я использую тип "struct"для разбора данных?
- И хорошо ли использовать "reinterpret_cast" / я правильно его использую?