#include "yc_pro.h"
#include "ui_yc_pro.h"
yc_pro::yc_pro(QWidget *parent)
: QWidget(parent)
, ui(new Ui::yc_pro)
{
ui->setupUi(this);
/*** 网络线程初始化 ***/
ethread = new udpthread;
/*** 下载网络接口 ****/
inteface = new UPDInterface;
/*** 定时器初始化 ****/
InitTimerEvent();
/*** 界面参数设置 ****/
InitUiViewPara();
}
yc_pro::~yc_pro()
{
delete inteface;
if(!inteface)
inteface = nullptr;
delete ethread;
delete ui;
close();
}
float hexToFloat(uint32_t hexValue)
{
// 提取符号位、指数和尾数
int sign = (hexValue >> 31) & 0x1;
int exponent = (hexValue >> 23) & 0xFF;
uint32_t mantissa = hexValue & 0x7FFFFF; // 去掉隐含的1
// 处理特殊情况
if (exponent == 0xFF && mantissa != 0) {
return NAN;
} else if (exponent == 0xFF && mantissa == 0) {
// 正无穷大或负无穷大
return sign ? -INFINITY : INFINITY;
} else if (exponent == 0 && mantissa == 0) {
// 0.0
return 0.0f;
}
// 计算尾数值(隐含的1加上尾数部分)
float value = 1.0f + (float)mantissa / pow(2, 23);
// 应用指数偏移并计算最终值
if (exponent != 0) {
value *= pow(2, exponent - 127);
}
// 应用符号
return sign ? -value : value;
}
void yc_pro::on_BtnClose_clicked()
{
close();
}
void yc_pro::on_BtnYCFile_clicked()
{
if(ui->BtnYCFile->text() == tr("开启")) {
ethread->LoadChannelInterface(inteface);
ethread->m_isYes = true;
ethread->start();
ui->BtnYCFile->setText("停止");
}
else {
ethread->m_isYes = false;
ui->BtnYCFile->setText("开启");
}
}
void yc_pro::InitUiViewPara(void)
{
ui->AirValue->setEnabled(false);
}
void yc_pro::InitTimerEvent(void)
{
m_pluseTimeid = startTimer(100);
}
void yc_pro::timerEvent(QTimerEvent *t)
{
if(t->timerId() == m_pluseTimeid)
{
QByteArray array;
while(!ethread->RecvMsgsisEmpty()) {
array = ethread->PopRecvMsgs();
if(array != nullptr)
WifeDataProcess(reinterpret_cast<quint8*>(array.data()), array.size());
}
QString str;
str = ethread->PopRecvInfo();
if(str != nullptr){
ui->listWidgetRecv->addItem(str);
ui->listWidgetRecv->setCurrentRow(ui->listWidgetRecv->count() - 1);
}
int rows = ui->listWidgetRecv->currentRow();
if(rows > 1200)
ui->listWidgetRecv->clear();
}
}
/*
* 遥测数据解析处理
* */
void yc_pro::WifeDataProcess(quint8 *p, quint16 len)
{
if(len != 16)
return;
/* 串口485气压数据 */
if(p[0] == 0x01)
{
quint32 QiyaHex = 0;
QiyaHex = (p[6] << 24) + (p[7] << 16) + (p[8] << 8) + p[9]; //低字节为高位
float QiyaValue = hexToFloat(QiyaHex);
ui->AirValue->setText(QString::number(QiyaValue, 'f', 3));
}
/* 霍尔采集数据 */
else if(p[0] == 0xAD)
{
float v = (*(quint32*)&p[7]) * 0.001;
switch(p[6])
{
case 1:
case 2:
case 3:
case 4:
setDCFLED(p[6],p[7]);
break;
case 5:
ui->lineV1->setText(QString::number(v, 'f', 3));
break;
case 6:
ui->lineV2->setText(QString::number(v, 'f', 3));
break;
default:
break;
}
}
/* 串口232倾角数据 */
else if(p[0] == 0x68) {
float X_Pos = (p[6]&0x0f)*100 + (p[7] >> 4)*10 + (p[7]&0x0f) + (p[8]>>4)*0.1 + (p[8]&0x0f)*0.01;
float Y_Pos = (p[9]&0x0f)*100 + (p[10] >> 4)*10 + (p[10]&0x0f) + (p[11]>>4)*0.1 + (p[11]&0x0f)*0.01;
float C_Tem = (p[12]&0x0f)*100 + (p[13] >> 4)*10 + (p[13]&0x0f) + (p[14]>>4)*0.1 + (p[14]&0x0f)*0.01;
if(p[6] >> 4)
X_Pos *= -1;
if(p[9] >> 4)
Y_Pos *= -1;
if(p[12] >> 4)
C_Tem *= -1;
ui->lineXAngle->setText(QString::number(X_Pos, 'f', 2));
ui->lineYAngle->setText(QString::number(Y_Pos, 'f', 2));
ui->lineTemp->setText(QString::number(C_Tem, 'f', 2));
}
/* I2C气压数据 */
else if(p[0] == 0x2C) {
float iicval = (*(quint32*)&p[6]) * 0.001;
ui->lineI2C->setText(QString::number(iicval, 'f', 3));
}
}
void yc_pro::on_BtnSave_clicked()
{
if(ui->BtnSave->text() == tr("开始存数")) {
QTime systime = QTime::currentTime();
QString saveFileFolder = qApp->applicationDirPath()+"/savefile";
QDir folder; //创建文件夹
if(!folder.exists(saveFileFolder))
folder.mkpath(saveFileFolder); //不存在则创建文件夹
QString saveTXTFilePath = saveFileFolder + "/" + "AllData" + systime.toString("hh-mm-ss")+".dat";
ethread->rcvfile = new QFile(saveTXTFilePath);
if(!(ethread->rcvfile->open(QIODevice::WriteOnly))) {
QMessageBox::warning(this, ethread->rcvfile->errorString(), "写入文件错误");
ethread->rcvfile->close();
delete ethread->rcvfile;
ethread->rcvfile = nullptr;
return;
}
//ethread->datfile = new QDataStream(ethread->rcvfile);
ui->BtnSave->setText("停止存数");
ethread->m_isFile = 1;
}
else {
ethread->m_isFile = 2;
ui->BtnSave->setText("开始存数");
}
}
void yc_pro::on_pushButton_clicked()
{
QString sourcFilePath = QFileDialog::getOpenFileName(nullptr,
"请选择待处理的数据",qApp->applicationDirPath()+"/savefile/","*.dat;;*.bin;;all(*)");
if(sourcFilePath.isEmpty()){
QMessageBox mesg;
mesg.critical(this,tr("Error"),tr("打开文件路径发生错误!"));
return;
}
ui->listWidgetRecv->addItem(sourcFilePath);
ui->listWidgetRecv->setCurrentRow(ui->listWidgetRecv->count() - 1);
QXlsx::Document xlsx;
xlsx.write("A1", "时间(ms)");
xlsx.write("B1", "帧序号");
xlsx.write("C1", "串口气压(kPa)");
xlsx.write("D1", "I2C气压(MPa)");
xlsx.write("E1", "X轴倾角(°)");
xlsx.write("F1", "Y轴倾角(°)");
xlsx.write("G1", "温度(℃)");
xlsx.write("H1", "PC指令");
xlsx.write("I1", "动作or速度(m/s)");
QFile file(sourcFilePath);
if(!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, file.errorString(), "读文件错误");
file.close();
return;
}
char p[16];
uchar up[16];
int sn=1;
while(!file.atEnd()) {
if(file.read(p,16)) {
for (quint8 i=0; i<16 ;i++)
up[i] = quint8(p[i]);
sn += 1;
xlsx.write(sn, 1, *(quint32*)&up[2]); //时间
xlsx.write(sn, 2, up[1]); //序号
/* 串口气压值解析 */
if(up[0] == 0x01){
quint32 QiyaHex = 0;
QiyaHex = (up[6] << 24) + (up[7] << 16) + (up[8] << 8) + up[9];
float QiyaValue = hexToFloat(QiyaHex);
xlsx.write(sn, 3, QString::number(QiyaValue, 'f', 3));
}
/* I2C气压采集值解析 */
else if(up[0] == 0x2C){
float iicval = (*(quint32*)&up[6]) * 0.001;
xlsx.write(sn, 4, QString::number(iicval, 'f', 3));
}
/* 倾角采集值解析 */
else if(up[0] == 0x68) {
float X_Pos = (up[6]&0x0f)*100 + (up[7] >> 4)*10 + (up[7]&0x0f) + (up[8]>>4)*0.1 + (up[8]&0x0f)*0.01;
float Y_Pos = (up[9]&0x0f)*100 + (up[10] >> 4)*10 + (up[10]&0x0f) + (up[11]>>4)*0.1 + (up[11]&0x0f)*0.01;
float C_Tem = (up[12]&
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
WifeDataCapture.zip (59个子文件)
WifeDataCapture
udpthread.h 2KB
WifeCapture.pro 1KB
ui_yc_pro.h 24KB
udpthread.cpp 11KB
yc_pro.ui 24KB
main.cpp 173B
debug
release
QXlsx.dll 843KB
WifeCapture.exe 112KB
libQXlsx.a 1.07MB
WifeETH.ico 9KB
QXslxHeader
xlsxzipreader_p.h 686B
xlsxzipwriter_p.h 604B
xlsxdocpropsapp_p.h 894B
xlsxcell.h 2KB
xlsxcontenttypes_p.h 1KB
xlsxdocpropscore_p.h 697B
xlsxconditionalformatting_p.h 2KB
xlsxtheme_p.h 551B
xlsxcellformula_p.h 748B
xlsxcell_p.h 655B
xlsxrelationships_p.h 3KB
xlsxchart_p.h 5KB
xlsxdrawinganchor_p.h 5KB
xlsxcolor_p.h 1KB
xlsxstyles_p.h 5KB
xlsxworkbook.h 3KB
xlsxformat.h 7KB
xlsxchartsheet_p.h 474B
xlsxmediafile_p.h 964B
xlsxformat_p.h 3KB
xlsxdatetype.h 1019B
xlsxabstractsheet.h 1KB
xlsxabstractsheet_p.h 713B
xlsxabstractooxmlfile_p.h 650B
xlsxrichstring_p.h 2KB
xlsxdatavalidation_p.h 1KB
xlsxdatavalidation.h 3KB
xlsxcellformula.h 1KB
xlsxworkbook_p.h 2KB
xlsxglobal.h 626B
xlsxdrawing_p.h 709B
xlsxworksheet.h 7KB
xlsxcellrange.h 2KB
xlsxchartsheet.h 788B
xlsxrichstring.h 3KB
xlsxdocument_p.h 973B
xlsxchart.h 2KB
xlsxutility_p.h 1KB
xlsxsimpleooxmlfile_p.h 2KB
xlsxabstractooxmlfile.h 954B
xlsxcelllocation.h 425B
xlsxcellreference.h 1KB
xlsxdocument.h 5KB
xlsxnumformatparser_p.h 2KB
xlsxworksheet_p.h 7KB
xlsxconditionalformatting.h 4KB
xlsxsharedstrings_p.h 3KB
yc_pro.h 1KB
yc_pro.cpp 13KB
共 59 条
- 1
资源评论
黄金右肾
- 粉丝: 24
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 纯 Python Java 解析器和工具.zip
- YOLO标记口罩数据集 (YOLO 格式注释)
- uniapp+vue3+云开发全栈开发同城配送鲜花小程序任意商城教程
- 客户需求快速小程序项目开发技巧
- java项目,课程设计-医疗服务系统.zip
- YOLO 注释风力涡轮机表面损坏-以 YOLO 格式注释风力涡轮机表面损伤 一万六千多文件
- 第一个适用于 Java 的 REST API 框架.zip
- Nvidia GeForce GT 1030显卡驱动(Win7)
- TIA PORTAL V17 UPD8- 更新包(最新版本2024.09)-链接地址.txt
- 示例应用程序展示了客户端和服务器上 JavaFX 和 Spring 技术的集成.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功