1 Star 1 Fork 0

公丕业/COM_customplot

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
mcu_update.cpp 19.89 KB
一键复制 编辑 原始数据 按行查看 历史
#include "mcu_update.h"
#include "ui_mcu_update.h"
#include <QDebug>
#include <QFileDialog>
#include <QSettings> //保存配置
#include <QFile> //文件
#include "QTimer"
#include "datatypeconversion.h"
#include <QMessageBox>
#include <QProgressBar> //进度条
#include <QTextCodec>
#include <QScrollBar>
extern "C"{
#include "usart_code_analysis.h"
}
QString File_Path;
QByteArray File;
Usart_Code_Analysis USART_UpDate;
MCU_Update::MCU_Update(QWidget *parent) :
QWidget(parent),
ui(new Ui::MCU_Update)
{
ui->setupUi(this);
// 设置布局边距和间距为0
this->layout()->setContentsMargins(0, 0, 0, 0);
this->layout()->setSpacing(0);
// 解除布局尺寸限制
this->layout()->setSizeConstraint(QLayout::SetNoConstraint);
this->setMinimumSize(0, 0); // 允许窗口缩小到任意尺寸
Get_Config("UpDate.ini");
setWindowTitle("MCU升级");
ui->progressBar->setRange(0,100);//设置进度条最大和最小值
ui->progressBar->setMinimum(0); //设置最小值
ui->progressBar->setMaximum(100); //设置最大值
ui->progressBar->setValue(50); //设置当前值
ui->progressBar->setInvertedAppearance(true);// true 反方向 false 正方向
ui->progressBar->setVisible(true);
ui->progressBar->setTextVisible(false); //隐藏进度条文本
ui->progressBar->setOrientation(Qt::Horizontal); //水平方向
// ui->progressBar->setOrientation(Qt::Vertical); //垂直方向
ui->progressBar->setAlignment(Qt::AlignVCenter); //对齐方式
ui->File_Path->setText(File_Path);
connect( ui->Open_File ,&QPushButton::clicked ,[=](){
//参数1:父窗口;参数2:显示信息;参数3:默认路径;参数4:文件类型过滤
QString fileName =QFileDialog::getOpenFileName(this,"打开程序文件",File_Path,"*.bin;;*.txt;;all(*)");
ui->File_Path->setText(fileName);
if(fileName!="")
{
File_Path=fileName;
}});
connect(ui->Open_File,&QPushButton::clicked,[=]{
//文件内容放入textEdit
File.clear();
QFile file(File_Path);
//设置打开方式
file.open(QIODevice::ReadOnly);//只读方式打开
//arr=file.readAll();
//显示arr
//ui->textEdit->setText(codec->toUnicode(arr)); //以gbk编码方式显示
//默认支持的格式是utf-8
//方法二
while(!file.atEnd())
{
File+=file.readAll();
QString hexView_Offset;
QString hexView_Hex;
QString hexView_ASCII;
//hexView=" Offset | ANSI ASCII |UTF-8\r\n";
for (int i = 0; i < File.size(); i += 16) {
QByteArray line = File.mid(i, 16);
// 位置部分
hexView_Offset += QString("%1 \n").arg(i, 8, 16, QLatin1Char('0'));
// HEX部分
for (char ch : line) {
hexView_Hex += QString("%1 ").arg(static_cast<quint8>(ch), 2, 16, QLatin1Char('0')).toUpper();
}
hexView_Hex += " \n";
// ASCII部分
for (char ch : line) {
hexView_ASCII += (ch >= 32 && ch <= 126) ? ch : '.';
}
hexView_ASCII += "\n";
}
ui->textEdit->setText(hexView_Offset);
ui->textEdit_2->setText(hexView_Hex);
ui->textEdit_3->setText(hexView_ASCII);
}
ui->File_Size->setText(QString("%1 byte").arg(File.length()));
//qDebug()<<File;
file.close();
if(File.length())
{
ui->Send_File_Section_Timer->setEnabled(true);
ui->Send_File_Section_Agreement->setEnabled(true);
ui->Send_File->setEnabled(true);
}
});
connect(ui->textEdit_2,&QTextEdit::cursorPositionChanged,[=]{
QTextCursor cursor = ui->textEdit_2->textCursor();
if (cursor.hasSelection()) {
QString selectedText = cursor.selectedText();
qDebug() << "选中文本:" << selectedText;
qDebug() << "起始位置:" << cursor.selectionStart();
qDebug() << "结束位置:" << cursor.selectionEnd();
} else {
qDebug() << "取消选中";
}
});
QScrollBar *vScrollBar_U1 = ui->textEdit->verticalScrollBar();
QScrollBar *vScrollBar_U2 = ui->textEdit_2->verticalScrollBar();
QScrollBar *vScrollBar_U3 = ui->textEdit_3->verticalScrollBar();
connect(vScrollBar_U1, &QScrollBar::valueChanged, [=](int value) {
//qDebug() << "U1垂直滚动位置变化:" << value;
vScrollBar_U2->setValue(value);
vScrollBar_U3->setValue(value);
});
connect(vScrollBar_U2, &QScrollBar::valueChanged, [=](int value) {
//qDebug() << "U2垂直滚动位置变化:" << value;
vScrollBar_U1->setValue(value);
vScrollBar_U3->setValue(value);
});
connect(vScrollBar_U3, &QScrollBar::valueChanged, [=](int value) {
//qDebug() << "U3垂直滚动位置变化:" << value;
vScrollBar_U2->setValue(value);
vScrollBar_U1->setValue(value);
});
connect(ui->Send_File,&QPushButton::clicked,[=]{
Send_Welcome(File);
//qDebug()<<"发送完成";
});
connect(ui->Update_Load,&QPushButton::clicked,[=]{
QByteArray Data;
Data.append(0x1F);
Data.append(0x01);
Data.append(0x01);
Send_Welcome(Data);
});
connect(ui->Update_Transmission,&QPushButton::clicked,[=]{
QByteArray Data;
Data.append(0x1F);
Data.append(0x01);
Data.append(0x7F);
Send_Welcome(Data);
});
connect(ui->Reset_Load,&QPushButton::clicked,[=]{
QByteArray Data;
Usart_Send(0x01,
Data,
"应答",
ui->D_Type->value(),
0xFF);
Data.clear();
Data+=dataTypeConversion::intToQ1Byte(0xAA); //帧头
Data+=dataTypeConversion::intToQ1Byte(0XEE); //复位
Data+=dataTypeConversion::intToQ1Byte(0X02); //单独复位
Data+=dataTypeConversion::intToQ1Byte(0x00); //保留
Data+=dataTypeConversion::intToQ1Byte(0x00); //保留
Data+=dataTypeConversion::intToQ2Byte(0x0000); //保留 两位
dataTypeConversion::MODBUS_Crc16(Data,6,1); //添加 CRC
Data+=dataTypeConversion::intToQ1Byte(0xFE); //帧尾
Send_Task(Data);
qDebug()<<"复位";
});
connect(ui->Update_Slave,&QPushButton::clicked,[=]{
QByteArray Data;
char Address;
Address=static_cast<char>(ui->Slave_Address->value()&0xFF);
Data.append(0x1F);
Data.append(0x02);
Data.append(0x02);
Data.append(Address);
Send_Welcome(Data);
});
connect(ui->Section_File_Size_Type,&QComboBox::currentTextChanged,[=]{ //设置单次发送文件大小小数点
if(ui->Section_File_Size_Type->currentText()=="Byte")
{
ui->Section_File_Size->setDecimals(0);
}else{
ui->Section_File_Size->setDecimals(2);
}
});
connect(ui->Send_File_Section_Timer,&QPushButton::clicked,[=]{ //分段发送
//数据需要帧头
if(ui->Part_Sign->checkState()!=Qt::Checked)
{
QMessageBox::information(this,"警告","文件拆分后无前缀,全部为文件内容");
}
//取出文件,直接使用File第二次发送需要再读取一次
File_Data=File;
//确认每次发送多少字节
if(ui->Section_File_Size_Type->currentText()=="Byte")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value());
}
if(ui->Section_File_Size_Type->currentText()=="K")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value()*1024);
}
if(ui->Section_File_Size_Type->currentText()=="M")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value()*1024*1024);
}
if(ui->Section_File_Size_Type->currentText()=="G")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value()*1024*1024*1024);
}
//确认一共发送多少次
Send_Times=File_Data.length()/Send_Lenth_Single;
if(File_Data.length()%Send_Lenth_Single)
{
Send_Times++;
}
//确认一共发送多少字节
File_Length_Max=File_Data.length();
File_Split_Data.clear();
Sending_Time=0;
//文件分段
for(int i=0;i<Send_Times;i++)
{
File_Split_Data.append(File_Data.mid(i*Send_Lenth_Single,Send_Lenth_Single));
}
ui->Send_Progress->setText(QString("进度:%1/%2").arg(Sending_Time).arg(Send_Times));
Send_Data=File_Split_Data[Sending_Time];
//延时发送
QTimer *timer =new QTimer(this);
timer->start(static_cast<int>(ui->Send_Section_Time->value()));//启动 ms
connect(timer,&QTimer::timeout,[=]()mutable{
ui->Send_Progress->setText(QString("进度:%1/%2").arg(Sending_Time+1).arg(Send_Times));
// Send_Data=File_Data.mid(0,Send_Lenth_Single);
// File_Data.remove(0,Send_Lenth_Single);
//取出各段数据
Send_Data=File_Split_Data[Sending_Time];
//增加帧头
if(ui->Part_Sign->checkState()==Qt::Checked)
{
QByteArray Part_Info;
Part_Info+=dataTypeConversion::intToQ3Byte(Sending_Time);
Part_Info+=dataTypeConversion::intToQ3Byte(Send_Times);
Part_Info+=dataTypeConversion::intToQ3Byte(File_Length_Max);
//qDebug()<<Part_Info;
Send_Data=Part_Info+Send_Data;
dataTypeConversion::MODBUS_Crc16(Send_Data,Send_Data.length());
}
if(ui->Add_Error->checkState()==Qt::Checked)
{
if(Sending_Time!=3)
{
Send_Welcome(Send_Data);
}
}else{
Send_Welcome(Send_Data);
}
Sending_Time++;
if(Sending_Time>=Send_Times)
{
Sending_Time=0;
timer->stop(); //定时器关
}
});
});
//通讯校验发送开
connect(ui->Send_File_Section_Agreement,&QPushButton::clicked,[=]{
Send_File_Section_Agreement_En=true;
//数据需要帧头
if(ui->Part_Sign->checkState()!=Qt::Checked)
{
QMessageBox::information(this,"警告","文件拆分后无前缀,全部为文件内容");
}
//取出文件,直接使用File第二次发送需要再读取一次
File_Data=File;
//确认每次发送多少字节
if(ui->Section_File_Size_Type->currentText()=="Byte")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value());
}
if(ui->Section_File_Size_Type->currentText()=="K")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value()*1024);
}
if(ui->Section_File_Size_Type->currentText()=="M")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value()*1024*1024);
}
if(ui->Section_File_Size_Type->currentText()=="G")
{
Send_Lenth_Single=static_cast<int>(ui->Section_File_Size->value()*1024*1024*1024);
}
//确认一共发送多少次
Send_Times=File_Data.length()/Send_Lenth_Single;
if(File_Data.length()%Send_Lenth_Single)
{
Send_Times++;
}
//确认一共发送多少字节
File_Length_Max=File_Data.length();
File_Split_Data.clear();
Sending_Time=0;
//文件分段
for(int i=0;i<Send_Times;i++)
{
File_Split_Data.append(File_Data.mid(i*Send_Lenth_Single,Send_Lenth_Single));
}
//发送第一段,开始等待下位机回应
ui->Send_Progress->setText(QString("进度:%1/%2").arg(1).arg(Send_Times));
Send_Data=File_Split_Data[Sending_Time];
if(ui->Part_Sign->checkState()==Qt::Checked)
{
QByteArray Part_Info;
Part_Info+=dataTypeConversion::intToQ1Byte(0xAA);
Part_Info+=dataTypeConversion::intToQ2Byte(Send_Lenth_Single);
Part_Info+=dataTypeConversion::intToQ3Byte(Sending_Time);
Part_Info+=dataTypeConversion::intToQ3Byte(Send_Times);
Part_Info+=dataTypeConversion::intToQ3Byte(File_Length_Max);
qDebug()<<Part_Info;
Send_Data=Part_Info+Send_Data;
dataTypeConversion::MODBUS_Crc16(Send_Data,Send_Data.length());
}
Sending_Time++;
Send_Welcome(Send_Data);
});
}
void MCU_Update::getStr(QByteArray Str)
{
int Re_Sending_Time=0;
int Re_Send_Times=0;
int Re_Update_Bin_lenth_MAX=0;
if(Send_File_Section_Agreement_En)
{
unsigned char* Str_U8;
Str_U8=reinterpret_cast<unsigned char *>(Str.data());
//qDebug()<<Str;
uint8_t Res=USART_UpDate.Communication_Analysis(Str_U8,Str.length());
//解码成功
if(Res==0)
{
qDebug()<<"Str"<<dataTypeConversion::strToHexstr(Str);
QString Dis;
//显示负载数据
Dis+=QString("指令0x%1 负载数据:").arg(USART_UpDate.COMI_Ty.CMD,2,16,QChar('0'));
for (int num=0;num<USART_UpDate.COMI_Ty.Xbyte_Len;num++)
{
Dis+=QString("%1 ").arg(USART_UpDate.COMI_Ty.Xbyte[num],2,16,QChar('0'));
}
qDebug()<<"解码成功"<<Dis;
//ui->Sended_Data->append(Dis);
if(USART_UpDate.COMI_Ty.CMD==0x04) //升级指令
{
QByteArray Data_Merge;
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[2]);
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[1]);
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[0]);
Re_Sending_Time=dataTypeConversion::q3bytesToInt(Data_Merge);
Data_Merge.clear();
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[5]);
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[4]);
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[3]);
Re_Send_Times=dataTypeConversion::q3bytesToInt(Data_Merge);
Data_Merge.clear();
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[8]);
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[7]);
Data_Merge+=static_cast<char>(USART_UpDate.COMI_Ty.Xbyte[6]);
Re_Update_Bin_lenth_MAX=dataTypeConversion::q3bytesToInt(Data_Merge);
Data_Merge.clear();
qDebug()<<"Re"<<Re_Sending_Time<<Re_Send_Times<<Re_Update_Bin_lenth_MAX<<File_Split_Data.length()<<File_Length_Max;
if((Re_Sending_Time<Re_Send_Times-1)&&(Re_Send_Times==Send_Times))
{
Send_Data=File_Split_Data[Re_Sending_Time+1];
ui->progressBar->setRange(0,Send_Times);
ui->progressBar->setValue(Re_Sending_Time+2);
ui->Send_Progress->setText(QString("进度:%1/%2").arg(Re_Sending_Time+2).arg(Send_Times));
if(ui->Part_Sign->checkState()==Qt::Checked)
{
QByteArray Part_Info;
Part_Info+=dataTypeConversion::intToQ1Byte(0xAA);
Part_Info+=dataTypeConversion::intToQ2Byte(Send_Lenth_Single);
Part_Info+=dataTypeConversion::intToQ3Byte(Re_Sending_Time+1);
Part_Info+=dataTypeConversion::intToQ3Byte(Send_Times);
Part_Info+=dataTypeConversion::intToQ3Byte(File_Length_Max);
qDebug()<<"Part_Info"<<Part_Info;
Send_Data=Part_Info+Send_Data;
dataTypeConversion::MODBUS_Crc16(Send_Data,Send_Data.length());
Sending_Time++;
}
qDebug()<<"Send_Data "<<Send_Data.length()<<Send_Data.length()-9;
Send_Welcome(Send_Data);
}else {
qDebug()<<"stop";
Send_File_Section_Agreement_En=false;
Send_Times=0;
}
}
//显示是否应答
if(USART_UpDate.COMI_Ty.Ack)
{
}else {
}
//USART_UpDate.COMI_Ty.Device_Type,8,16,QChar('0'));//设备类型
//USART_UpDate.COMI_Ty.Device_Address,2,16,QChar('0'));//设备地址
//USART_UpDate.COMI_Ty.Seq;//消息队列
}else {//解码失败
if(Res==1)
{
//ui->This_Error_Info->setText("1:新一帧数据无帧头");
}else{
if(Res==2)
{
//ui->This_Error_Info->setText("2:长度不够");
}else {
//ui->This_Error_Info->setText("3:有帧头,长度正常,结尾校验异常(本次数据会丢掉)");
}
}
}
}
}
MCU_Update::~MCU_Update()
{
Save_Config("UpDate.ini");
delete ui;
}
void MCU_Update::Send_Task(QByteArray strsend,bool Hex)
{
qDebug()<<strsend.length();
emit Send_Welcome(strsend);
if(Hex){ //十六进制
//ui->Sended_Data->append(dataTypeConversion::strToHexstr(strsend,0));
}else{//ASCII码
}
}
void MCU_Update::Save_Config(QString Path)//保存配置
{
/*** 写入密码和锁屏时间到配置文本中 ***/
//QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
QSettings *IniWrite = new QSettings(Path, QSettings::IniFormat);
//Canopen_SDO_Index
// IniWrite->setValue("D_Type",ui->D_Type->value());
IniWrite->setValue("File_Path",File_Path);
IniWrite->setValue("Section_File_Size",ui->Section_File_Size->value());
IniWrite->setValue("Send_Section_Time",ui->Send_Section_Time->value());
//写入完成后删除指针
delete IniWrite;
}
void MCU_Update::Get_Config(QString Path)//读取配置
{
/*** 读取配置文件中的密码和锁屏时间 ***/
//QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
QSettings *iniRead = new QSettings(Path, QSettings::IniFormat);
File_Path = iniRead->value("File_Path").toString();
ui->Section_File_Size->setValue(iniRead->value("Section_File_Size").toInt());
ui->Send_Section_Time->setValue(iniRead->value("Send_Section_Time").toInt());
if(ui->Section_File_Size->value()<10)
{
ui->Section_File_Size->setValue(2048);
}
if(ui->Send_Section_Time->value()<1)
{
ui->Send_Section_Time->setValue(1);
}
// ui->D_Type->setValue(iniRead->value("D_Type").toInt());
//读入完成后删除指针
delete iniRead;
}
void MCU_Update::Usart_Send(int CMD,QByteArray Data,QString ACK,int D_Tpye,int D_ADDR)
{
QByteArray QBData;
QBData+=dataTypeConversion::intToQ4Byte(static_cast<int>(Protocol_Head));
QByteArray Data_A=Data;
int Len=Data_A.length()+16;
QBData+=dataTypeConversion::intToQ2Byte(Len);
QBData+=dataTypeConversion::intToQ1Byte(SEG);
SEG++;
if(SEG>=255)
{
SEG=1;
}
if(ACK=="应答")
{
QBData+=dataTypeConversion::intToQ1Byte(static_cast<int>(0x01));
}else{
QBData+=dataTypeConversion::intToQ1Byte(static_cast<int>(0x00));
}
QBData+=dataTypeConversion::intToQ4Byte(D_Tpye);
QBData+=dataTypeConversion::intToQ1Byte(D_ADDR);
QBData+=dataTypeConversion::intToQ1Byte(CMD);
QBData+=Data_A;
dataTypeConversion::xorCheck(QBData,QBData.length());
QBData+=dataTypeConversion::intToQ1Byte(static_cast<int>(Protocol_End_01));
Send_Task(QBData);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/WUJIBIFAN1024/com_customplot.git
git@gitee.com:WUJIBIFAN1024/com_customplot.git
WUJIBIFAN1024
com_customplot
COM_customplot
master

搜索帮助