这个项目是一个基于Qt的光源控制器调试助手,旨在通过串口通信实现对光源控制器的连接、亮度控制和设备初始化等功能。整个项目包括两个主要部分:用户界面(GUI)和核心功能模块。以下是项目的整体讲解,包括各功能的实现方式和技术细节。
通过百度网盘分享的文件:
增亮数字控制器使用说明书.pdf
线光控制器使用说明书.pdf
点光控制器使用说明书.pdf
数字控制器使用说明书.pdf
链接:https://pan.baidu.com/s/1E_aPfg2kmBB1Kf0bMxTulw?pwd=cedu
提取码:cedu
1. 项目结构
- 界面文件:
MainWindow
类负责图形用户界面的展示和交互。 - 串口控制类:
WorDopSerialPort
类封装了串口通信的逻辑,用于处理与光源控制器的具体通信协议和指令。
2. 功能描述和代码解析
2.1 主界面 (MainWindow
)
界面提供了串口选择、通信模式和控制器类型选择、亮度控制和初始化等功能,以下是各部分功能的详细说明。
-
串口选择:
- 在
MainWindow
构造函数中,通过QSerialPortInfo::availablePorts()
获取所有可用的串口端口,并将端口名称和描述信息填充到界面的comboBox
下拉菜单中。 - 用户选择串口后,可以点击“连接光源控制器”按钮连接设备。
on_ButtonConeted_clicked()
槽函数会调用WorDopSerialPort
类的openSerialPort()
方法尝试连接,如果成功,界面会激活其他操作按钮。
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &port : ports) { QString portInfo = QString("%1 - %2").arg(port.portName()).arg(port.description()); ui->comboBox->addItem(portInfo, port.portName()); }
- 在
-
通信模式选择:
- 用户可以选择HEX或ASCII模式来发送指令。
- 在
on_comboBox_2_activated()
槽函数中,根据用户选择更新WorDopSerialPort
的通信模式。此模式决定了发送命令的格式(HEX或ASCII),在发送指令时会根据该模式构建相应的命令格式。
void MainWindow::on_comboBox_2_activated(int index) { if (lightCtrl) lightCtrl->setComMode(static_cast<WorDopSerialPort::COM_MODE>(index)); }
-
控制器类型选择:
- 支持两种控制器类型:常规控制器和点控控制器。
- 在
on_comboBox_Device_activated()
槽函数中,根据用户选择设置控制器的类型。控制器类型影响到后续的命令生成和通信模式。
void MainWindow::on_comboBox_Device_activated(int index) { if (lightCtrl) lightCtrl->setDeviceType((index == 0) ? WorDopSerialPort::DEVICETYPE::Routine : WorDopSerialPort::DEVICETYPE::Point); }
-
单通道亮度设置:
- 用户可以选择一个通道并设置亮度值,点击“设置”按钮后,通过
on_ButtonSetLight_clicked()
槽函数进行处理。 - 此函数调用
WorDopSerialPort::setPassLightValue()
方法,将通道编号和亮度值发送到光源控制器。
void MainWindow::on_ButtonSetLight_clicked() { if (lightCtrl->setPassLightValue(ui->spinBox_Pass->value(), ui->spinBox_Value->value())) { writeRunTimeMsgs(tc("通道[%1]设置[%2]成功").arg(ui->spinBox_Pass->value()).arg(ui->spinBox_Value->value())); return; } writeRunTimeMsgs(tc("通道[%1]设置[%2]失败 %3").arg(ui->spinBox_Pass->value()).arg(ui->spinBox_Value->value()).arg(lightCtrl->getLastError())); }
- 用户可以选择一个通道并设置亮度值,点击“设置”按钮后,通过
-
全通道亮度设置:
- 用户可以为所有通道设置统一的亮度值,点击“全通道设置”按钮后,通过
on_ButtonAllPass_clicked()
槽函数进行处理。 - 此函数调用
WorDopSerialPort::setManyPassLightValues()
方法,将通道数量和亮度值构建成一个命令批量发送到控制器。
void MainWindow::on_ButtonAllPass_clicked() { QMap<quint8,quint8> m_passValues; for(int i=0;i<ui->spinBox_passNum->value();i++) { m_passValues[i]=ui->spinBox_LightValue->value(); } if(lightCtrl->setManyPassLightValues(m_passValues)) { writeRunTimeMsgs(tc("全通道设置成功")); return; } writeRunTimeMsgs(tc("全通道设置失败 %1").arg(lightCtrl->getLastError())); }
- 用户可以为所有通道设置统一的亮度值,点击“全通道设置”按钮后,通过
-
设备初始化:
- 用户可以点击“初始化”按钮恢复设备到出厂设置。
on_ButtonInitial_clicked()
槽函数会调用WorDopSerialPort::resetToFactorySettings()
,将重置命令发送到控制器。
void MainWindow::on_ButtonInitial_clicked() { if(lightCtrl->resetToFactorySettings()) { writeRunTimeMsgs(tc("初始化成功")); return; } writeRunTimeMsgs(tc("初始化失败")); }
2.2 串口控制类 (WorDopSerialPort
)
-
串口初始化:
- 在
WorDopSerialPort
的构造函数中,初始化QSerialPort
对象,并配置串口参数(波特率、校验位、数据位、停止位等)。 - 串口数据的读取由
handleReadyRead()
槽函数处理,负责接收从控制器返回的数据。
WorDopSerialPort::WorDopSerialPort(QString portName, const QSerialPort::BaudRate BaudRate, const QSerialPort::Parity parity, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits) { serial = new QSerialPort(this); serial->setPortName(portName); serial->setBaudRate(BaudRate); serial->setParity(parity); serial->setDataBits(dataBits); serial->setStopBits(stopBits); }
- 在
-
命令生成和发送:
applyHex()
和applyASCII()
方法根据通信模式构造命令。- 在
setPassLightValue()
和setManyPassLightValues()
中,判断串口是否已打开,然后发送生成的命令数据。
QByteArray WorDopSerialPort::applyHex(const quint8 index, const quint8 value) { QByteArray cmd; cmd.resize(8); cmd[0] = 0x40; cmd[1] = 0x05; cmd[2] = static_cast<qint8>(m_DeviceType); cmd[3] = 0x00; cmd[4] = 0x1A; cmd[5] = static_cast<qint8>(index - 1); cmd[6] = static_cast<qint8>(value); cmd[7] = calculateChecksum(cmd); return cmd; }
-
错误检查:
checkError()
方法检查串口通信后的反馈信息,根据模式(HEX或ASCII)处理不同的反馈,给出错误提示并记录到日志。- 例如,在ASCII模式下,如果返回信息包含“E”,会进一步解析错误代码并给出详细的错误描述。
bool WorDopSerialPort::checkError() { m_smallGapTime->wait(1000); bool m_Ret = true; if(m_buf.isEmpty()) { setError(tc("未反馈信息、请检查光源控制器类型")); m_Ret = false; } // 根据模式检查错误 switch (m_mode) { case COM_MODE::QC_HEX: if (m_buf[4] != 0) { setError(tc("信息设置错误、请检查信息")); m_Ret = false; } break; case COM_MODE::QC_ASCII: if (!m_buf.contains("OK")) { setError(tc("命令格式有误")); m_Ret = false; } break; } m_buf.clear(); return m_Ret; }
总结
该项目通过图形界面和串口通信功能,实现了对光源控制器的基本控制操作。用户可以轻松连接设备、设置通道亮度、进行设备初始化,并实时获取反馈信息。项目中结合了Qt的界面编程和串口通信库,使得复杂的光源控制变得简单易用,同时为调试和设置提供了良好的用户体验。