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

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

Запись от Uhbif79 размещена 05.06.2026 в 20:59
Показов 2806 Комментарии 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 вне форума
 
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru