0
点赞
收藏
分享

微信扫一扫

蚂蚁数据 SQL 真实面试题

快乐码农Alan007 2024-11-06 阅读 10
qtc++

这个项目是一个基于Qt的光源控制器调试助手,旨在通过串口通信实现对光源控制器的连接、亮度控制和设备初始化等功能。整个项目包括两个主要部分:用户界面(GUI)和核心功能模块。以下是项目的整体讲解,包括各功能的实现方式和技术细节。

通过百度网盘分享的文件:
增亮数字控制器使用说明书.pdf
线光控制器使用说明书.pdf
点光控制器使用说明书.pdf
数字控制器使用说明书.pdf
链接:https://pan.baidu.com/s/1E_aPfg2kmBB1Kf0bMxTulw?pwd=cedu
提取码:cedu

1. 项目结构

  • 界面文件MainWindow类负责图形用户界面的展示和交互。
  • 串口控制类WorDopSerialPort类封装了串口通信的逻辑,用于处理与光源控制器的具体通信协议和指令。
    在这里插入图片描述
    在这里插入图片描述

2. 功能描述和代码解析

2.1 主界面 (MainWindow)

界面提供了串口选择、通信模式和控制器类型选择、亮度控制和初始化等功能,以下是各部分功能的详细说明。

  1. 串口选择

    • 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());
    }
    
  2. 通信模式选择

    • 用户可以选择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));
    }
    
  3. 控制器类型选择

    • 支持两种控制器类型:常规控制器和点控控制器。
    • on_comboBox_Device_activated()槽函数中,根据用户选择设置控制器的类型。控制器类型影响到后续的命令生成和通信模式。
    void MainWindow::on_comboBox_Device_activated(int index) {
        if (lightCtrl)
            lightCtrl->setDeviceType((index == 0) ? WorDopSerialPort::DEVICETYPE::Routine : WorDopSerialPort::DEVICETYPE::Point);
    }
    
  4. 单通道亮度设置

    • 用户可以选择一个通道并设置亮度值,点击“设置”按钮后,通过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()));
    }
    
  5. 全通道亮度设置

    • 用户可以为所有通道设置统一的亮度值,点击“全通道设置”按钮后,通过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()));
    }
    
  6. 设备初始化

    • 用户可以点击“初始化”按钮恢复设备到出厂设置。
    • on_ButtonInitial_clicked()槽函数会调用WorDopSerialPort::resetToFactorySettings(),将重置命令发送到控制器。
    void MainWindow::on_ButtonInitial_clicked() {
        if(lightCtrl->resetToFactorySettings()) {
            writeRunTimeMsgs(tc("初始化成功"));
            return;
        }
        writeRunTimeMsgs(tc("初始化失败"));
    }
    
2.2 串口控制类 (WorDopSerialPort)
  1. 串口初始化

    • 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);
    }
    
  2. 命令生成和发送

    • 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;
    }
    
  3. 错误检查

    • 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的界面编程和串口通信库,使得复杂的光源控制变得简单易用,同时为调试和设置提供了良好的用户体验。

举报

相关推荐

0 条评论