Форум программистов, компьютерный форум, киберфорум
Uhbif79
Войти
Регистрация
Восстановить пароль

Программа для com-порта

Запись от Uhbif79 размещена 05.06.2026 в 20:59
Показов 2881 Комментарии 2

Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на С. В качестве первого задания решил сделать программу которая позволяла бы отправлять и принимать данные в/из com-порта. Изначально писал ее в ОС Astra Linux, поэтому видел ее практическое применение в том, чтобы можно было сканировать порты, находить подключенные переходники USB-COM выставлять скорость и далее пользователь мог работать с тем или иным оборудованием, которое управляется по последовательному порту. То есть моя программа избавляла бы пользователя от знания терминальных программ по настройке Com-порта в Linux. Хотя предполагаю что для Linux есть программы, которые позволяют управлять com-портом в графическом режиме (Cutecom, Putty и прочее). Смысл моей программы свелся чисто к изучению возможностей Qt, я добавил отрисовку круга, в зависимости от успешности или неуспешности подключения, сопроводил действия звуком, вставил текстовую описательную часть и так далее. Здесь я прикрепляю свою программу в заархивированном виде.
Возможно она пригодится таким начинающим как я или я получу отзывы и предложения по ее усовершенствованию.
Все что хотел я реализовать у меня получилось, единственное я так до конца не разобрался с сохранением параметров com-порта после выхода из программы (на ОС Astra Linux). Я применил метод setSettingsRestoredOnClose(false) - он в принципе рабочий но дает задержку около 2 секунд. Пробовал замаскировать это запуском Progress-бара, стало получше, но не получилось это сделать параллельно. Решил на этом пока закончить.
Вложения
Тип файла: zip Com.zip (598.1 Кб, 60 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Обрезка требуемого уровня звука

    Вы используете Qt 5. У вас есть вызов команды setVolume(150), но setVolume метод принимает значения в процентах от 0 до 100:

    Цитата из документации:
    The playback volume is scaled linearly, ranging from 0 (silence) to 100 (full volume). Values outside this range will be clamped
    Перевод:
    Громкость воспроизведения масштабируется линейно, от 0 (тишина) до 100 (максимальная громкость). Значения за пределами этого диапазона будут ограничены.
    Значение будет урезано до 100.

    Портирование на Qt 6

    Портировал ваш пример с Qt5 на Qt 6.11.1: com-port.zip

    Форматирование кода

    Код отформатировал с помощью консольной утилиты clang-format: Консольные команды для форматирования исходного кода

    Утечка памяти

    При каждом клике создаётся тяжёлый объект класса QMediaPlayer. Я добавил вызов deleteLater(), чтобы не было утечки памяти, а воспроизведение звука убрал в отдельный метод:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    // Передаем volume от 0 до 100
    void MainWindow::playSound(const QString &filePath, int volumePercent)
    {
        if (ui->checkBox->isChecked())
            return;
     
        QMediaPlayer *player = new QMediaPlayer(this);
        QAudioOutput *audioOutput = new QAudioOutput(this);
     
        player->setAudioOutput(audioOutput);
        player->setSource(QUrl::fromLocalFile(filePath));
     
        // Преобразуем 0-100 в 0.0-1.0
        float volume = static_cast<float>(volumePercent) / 100.0f;
        audioOutput->setVolume(volume);
     
        player->play();
     
        // Удаляем плеер после завершения воспроизведения, чтобы не было утечки памяти
        connect(player, &QMediaPlayer::playbackStateChanged, this, [player, audioOutput](QMediaPlayer::PlaybackState state) {
            if (state == QMediaPlayer::StoppedState) {
                player->deleteLater();
                audioOutput->deleteLater();
            }
        });
    }
    Уменьшение количества инклудов

    Сократил количество инклудов до этого числа:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QAudioOutput>
    #include <QDebug>
    #include <QMediaPlayer>
    #include <QMessageBox>
    #include <QPainter>
    #include <QSerialPortInfo>
    #include <QThread>
    #include <QTimer>
    #include <QtSerialPort/QSerialPort>
    Портирование на CMake

    Заменил QMake на CMake. Добавил файл CMakeListst.txt:

    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    cmake_minimum_required(VERSION 3.21)
     
    project(Com LANGUAGES CXX)
     
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
     
    # Find the Qt6 package and required components
    find_package(Qt6 REQUIRED COMPONENTS
        Core
        Gui
        Multimedia
        SerialPort
        Widgets
    )
     
    # Automatically handle UI files and resources
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_AUTOMOC ON)
     
    # Add your source and header files
    add_executable(Com
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        resource.qrc
    )
     
    # Link the libraries
    target_link_libraries(Com PRIVATE
        Qt6::Core
        Qt6::Gui
        Qt6::Multimedia
        Qt6::SerialPort
        Qt6::Widgets
    )
     
    # Deployment rule (equivalent to your INSTALLS logic)
    install(TARGETS Com
        RUNTIME DESTINATION bin
    )
    Вы можете открыть проект из Qt Creator, выбрав File > Open File or Project... и выбрать CMakeListst.txt. Это так же как открыть проект .pro, но вместо .pro открыть CMakeListst.txt
    Запись от 8Observer8 размещена 06.06.2026 в 19:24 8Observer8 вне форума
    Обновил(-а) 8Observer8 15.08.2026 в 15:59
  2. Старый комментарий
    На всякий случай напишу, что это не я занижал оценку - я ставил 5 звёзд. А выглядит так, будто я раскритиковал код и влепил низкую оценку. Проект отлично сделан!

    Лучше переделайте его на Qt6, потому что Qt5 сейчас мало кто использует. На Qt6 большинство сможет сразу скачивать и запускать ваши примеры. Сейчас большинство программистов в мире используют CMake, поэтому лучше сразу создавать проекты типа CMake в Qt Creator, а не QMake.

    Правильно, что вы практикуетесь, создавая такие замечательные примеры. Желаю вам стабильной мотивации и радости от программирования на C++!
    Запись от 8Observer8 размещена 15.08.2026 в 16:31 8Observer8 вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru