修改一些读取地址失败时异常的问题

修改配置串口窗口打开时没有读取配置的问题
修改配置文件不存在时没有创建的问题
main
HwangKC 2025-03-26 22:25:03 +08:00
parent 02666e647b
commit 746cdcf02d
2 changed files with 125 additions and 4 deletions

View File

@ -13,6 +13,7 @@
#include <QSerialPortInfo>
#include <QGraphicsDropShadowEffect>
#include <QSettings>
#include <QFileInfo>
FormSerialPortSettingDialog::FormSerialPortSettingDialog(QWidget *parent)
: QDialog(parent)
@ -101,7 +102,7 @@ void FormSerialPortSettingDialog::InitializeUi()
ui->cb_serialport->addItem(str,parts[0].trimmed());
}
ui->interval->setText("10");
ui->interval->setText("15");
ui->buttonBox->clear();
QPushButton *okButton = ui->buttonBox->addButton(QDialogButtonBox::Ok);
@ -114,6 +115,113 @@ void FormSerialPortSettingDialog::InitializeUi()
connect(okButton, &QPushButton::clicked, this, &FormSerialPortSettingDialog::onOkClicked);
connect(cancelButton, &QPushButton::clicked, this, &FormSerialPortSettingDialog::onCancelClicked);
//恢复原配置
QString appDir = QCoreApplication::applicationDirPath();
QString iniFilePath = appDir + QString::fromStdString("/emsshower.ini");
QFileInfo checkFile(iniFilePath);
// 文件已存在且是普通文件
if (checkFile.exists() && checkFile.isFile())
{
QSettings* pSettings = new QSettings(iniFilePath, QSettings::IniFormat,this);
int baund = pSettings->value("modbus/baund",9600).toInt();
QString tmp = QString("%1").arg(baund);
int targetIndex = ui->cb_baund->findText(tmp); // 精确匹配
if (targetIndex != -1)
{
ui->cb_baund->setCurrentIndex(targetIndex); // 自动触发滚动定位[3](@ref)
// 强制更新视图(适用于隐藏后重新显示)
//ui->cb_baund->showPopup();
//ui->cb_baund->hidePopup();
}
QString com = pSettings->value("modbus/com","COM1").toString();
for(int i=0; i<ui->cb_serialport->count(); ++i)
{
if(ui->cb_serialport->itemText(i).contains(com+" -"))
{
ui->cb_serialport->setCurrentIndex(i);
}
}
int data = pSettings->value("modbus/data",8).toInt();
tmp = QString("%1").arg(data);
targetIndex = ui->cb_data->findText(tmp); // 精确匹配
if (targetIndex != -1)
{
ui->cb_data->setCurrentIndex(targetIndex); // 自动触发滚动定位[3](@ref)
// 强制更新视图(适用于隐藏后重新显示)
// ui->cb_data->showPopup();
//ui->cb_data->hidePopup();
}
int parity = pSettings->value("modbus/parity",0).toInt();
if (parity == 0)
tmp = "NoParity";
else if(parity == 2)
tmp = "Even";
else if(parity == 3)
tmp = "Odd";
else
tmp = "NoParity";
targetIndex = ui->cb_parity->findText(tmp); // 精确匹配
if (targetIndex != -1)
{
ui->cb_parity->setCurrentIndex(targetIndex); // 自动触发滚动定位[3](@ref)
// 强制更新视图(适用于隐藏后重新显示)
//ui->cb_parity->showPopup();
//ui->cb_parity->hidePopup();
}
int stop = pSettings->value("modbus/stop",1).toInt();
tmp = QString("%1").arg(stop);
targetIndex = ui->cb_stop->findText(tmp); // 精确匹配
if (targetIndex != -1)
{
ui->cb_stop->setCurrentIndex(targetIndex); // 自动触发滚动定位[3](@ref)
// 强制更新视图(适用于隐藏后重新显示)
//ui->cb_stop->showPopup();
//ui->cb_stop->hidePopup();
}
int interval = pSettings->value("modbus/interval",15).toInt();
tmp = QString("%1").arg(interval);
ui->interval->setText(tmp);
int slave_id = pSettings->value("slaves/slave_id",1).toInt();
tmp = QString("%1").arg(slave_id);
ui->slave_id->setText(tmp);
int delay = pSettings->value("modbus/delay",1000).toInt();
tmp = QString("%1").arg(delay);
ui->delay_timeout->setText(tmp);
}
else
{
QSettings* pSettings = new QSettings(iniFilePath, QSettings::IniFormat,this);
pSettings->setValue("modbus/baund",9600);
pSettings->setValue("modbus/com","COM1");
pSettings->setValue("modbus/data",8);
pSettings->setValue("modbus/parity",0);
pSettings->setValue("modbus/stop",1);
pSettings->setValue("modbus/interval",15);
pSettings->setValue("modbus/delay",1000);
pSettings->setValue("slaves/slave_id",1);
pSettings->setValue("version/ver","1_0_0");
pSettings->setValue("modbus/type",1);
pSettings->setValue("modbus/ip","127.0.0.1");
pSettings->setValue("modbus/port",502);
}
// 恢复默认光标
QApplication::restoreOverrideCursor();
}
@ -147,6 +255,7 @@ void FormSerialPortSettingDialog::onOkClicked()
int stop = ui->cb_stop->currentData().toInt();
int slave_id = ui->slave_id->text().toInt();
int intervai = ui->interval->text().toInt();
int delay = ui->delay_timeout->text().toInt();
pSettings->setValue("modbus/baund",baund);
pSettings->setValue("modbus/com",com);
@ -154,6 +263,7 @@ void FormSerialPortSettingDialog::onOkClicked()
pSettings->setValue("modbus/parity",parity);
pSettings->setValue("modbus/stop",stop);
pSettings->setValue("modbus/interval",intervai);
pSettings->setValue("modbus/delay",delay);
pSettings->setValue("slaves/slave_id",slave_id);
accept();

View File

@ -457,16 +457,18 @@ bool MainWindow::InitializeModbus()
QString jsonFilePath = appDir + QString::fromStdString("/emsshower.json");
ReadConfiguration(jsonFilePath);
m_bInitializeModbus = true;
//m_bInitializeModbus = true;
switch (m_modbus_type)
{
case 0:
return InitializeTcp();
m_bInitializeModbus = InitializeTcp();
return m_bInitializeModbus;
break;
default:
case 1:
return InitializeRtu();
m_bInitializeModbus = InitializeRtu();
return m_bInitializeModbus;
break;
}
}
@ -552,6 +554,15 @@ bool MainWindow::readRegister()
uint16_t* tab_reg = new uint16_t[iterAddress->quantity];
int regs = modbus_read_registers(m_pModbus, iterAddress->start_addr, iterAddress->quantity, tab_reg);
if (regs <= 0)
{
QString s = QString(tr("Failed to read registers from address %1")).arg(iterAddress->start_addr);
ui->statusbar->showMessage(s);
delete []tab_reg;
continue;
}
assert(regs>0);
QVector<uint16_t> registers;