You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PayloadAPP/Src/ModelCamera/encodemodelcamera.cpp

56 lines
1.6 KiB
C++

#include "encodemodelcamera.h"
#include "global.h"
EncodeModelCamera::EncodeModelCamera(QObject *parent) : QObject{parent} {
cameraUDP = new QUdpSocket(this);
cameraUDP->bind(QHostAddress("127.0.0.1"), 8899);
cmdArray.insert(0, 0xFA);
cmdArray.insert(1, 0xFA);
connect(cameraUDP, SIGNAL(readyRead()), this, SLOT(ReadData()));
}
/**
* @brief 发送三维建模相机指令
* @param cmdDataArray 指令ID与负载数据
*/
void EncodeModelCamera::SendCMD(QByteArray cmdDataArray) {
cmdArray.clear();
cmdArray.insert(0, 0xFA);
cmdArray.insert(1, 0xFA);
cmdArray.append(cmdDataArray);
uint8_t *data = reinterpret_cast<uint8_t *>(cmdArray.data());
uint16_t crc16 = calCRC16(data, cmdArray.size());
QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::BigEndian);
stream << crc16;
cmdArray.append(byteArray);
cameraUDP->writeDatagram(cmdArray, QHostAddress("127.0.0.1"), 8181);
}
// upd socket收到数据
void EncodeModelCamera::ReadData() {
QByteArray array;
QHostAddress address;
quint16 port;
array.resize(cameraUDP->bytesAvailable()); // 根据可读数据来设置空间大小
cameraUDP->readDatagram(array.data(), array.size(), &address,
&port); // 读取数据
// 校验
int len = array.size();
if (len <= 2) {
return;
}
uint8_t *data = reinterpret_cast<uint8_t *>(array.data());
uint16_t crc16 = calCRC16(data, array.size() - 2);
uint16_t Rcrc = (array[len - 2] << 8) | array[len - 1];
if (crc16 == Rcrc) {
emit UDP_Receive(array);
}
cameraUDP->writeDatagram(cmdArray, QHostAddress("172.10.1.237"), 10001);
}