Qt com порт: Создаем GUI приложение для общения по COM порту
Qt и последовательные порты | Блог fede.tft
Обновление от 22 июня 2011 г.: исправлена ошибка при компиляции под Visual Studio 2010.
Это небольшое дополнение к статье, которую я разместил на своем веб-сайте, в которой объясняется, как использовать boost asio для взаимодействия с последовательными портами из кода C++. Эта запись в блоге посвящена теме, не затронутой в статье: использованию последовательных портов в приложениях с графическим интерфейсом Qt.
Поскольку последовательные порты используются в основном для связи компьютера с микроконтроллером, мы сосредоточимся на этом случае.
Дополнительная проблема, которая возникает, когда приложение имеет графический интерфейс, является результатом двух ограничений, которые имеют приложения с графическим интерфейсом:
Поток, выполняющий цикл обработки событий графического интерфейса, не должен блокироваться в течение длительного периода времени (скажем, более секунды). ). Если это происходит, графический интерфейс «зависает», и это раздражает пользователей, которые думают, что приложение потерпело крах, и обычно принудительно закрывают его.
Код, который обновляет графический интерфейс, не должен вызываться из потоков, отличных от основного потока.
Теперь, если микроконтроллер никогда не отправляет данные на последовательный порт, если только компьютер не посылает ему команду, и ответы всегда приходят быстро, проблем нет.
Покажем базовый протокол такого рода:
ПК может отправить команду «А» на микроконтроллер.
Если микроконтроллер получает «А», он считывает канал АЦП и отправляет значение обратно на ПК
Как сказано, в этом случае проблем нет. Возможный графический интерфейс будет иметь кнопку для чтения значения и метку для отображения результата.
Такое приложение может легко использовать класс TimeoutSerial с кодом для записи буквы «A» в обратном вызове кнопки с последующим чтением из последовательного порта, чтобы получить результат и отобразить его в графическом интерфейсе. Тайм-аут, установленный на соответствующее значение (например, 500 мс), гарантирует, что графический интерфейс не зависнет, даже если что-то пойдет не так, и программист может перехватить TimeoutException, чтобы показать пользователю сообщение об ошибке.
Но что делать, если команда выполняется долго, скажем, 10 секунд? В этом случае этот простой подход не сработает, потому что графический интерфейс зависнет на десять секунд, а основной поток будет ожидать ответа от последовательного порта.
А что делать с таким протоколом?
Микроконтроллер отправляет значение, считанное с АЦП, 20 раз в секунду.
В этом случае приложение ПК должно всегда прослушивать последовательный порт для входящих данных.
Ну, кто читал мою статью, наверняка подумает об использовании класса AsyncSerial, позволяющего прописать callback, который будет вызываться каждый раз, когда какие-то данные поступают с последовательного порта.
Но тоже такой подход не сработает, из-за ограничения, что код GUI можно вызывать только из основного потока, а AsyncSerial вызывает callback из отдельного потока.
Чтобы показать, как решить эту проблему, я написал класс QAsyncSerial, который является классом-оболочкой для AsyncSerial, использующим систему сигналов и слотов Qt. По сути, он выдает сигнал каждый раз, когда из последовательного порта принимается строка, а поскольку сигналы и слоты являются потокобезопасными, код работает так, как ожидалось.
Чтобы показать все на практике, это простой графический интерфейс, который использует QAsyncSerial, работающий в Linux:
Этот простой графический интерфейс позволяет выбрать последовательный порт и открыть его (скорость передачи фиксирована на 115200, формат 8N1). После его открытия появляется строка, в которой нужно написать текст для отправки на последовательный порт, в то время как полученный текст показан ниже.
Код класса QAsyncSerial и примера графического интерфейса размещены в конце исходной статьи (здесь). Он предназначен для компиляции с помощью QtCreator. Если вы попытаетесь скомпилировать его, не забудьте отредактировать строку «-L/usr/local/lib» в файле SerialGUI.pro, чтобы указать, где у вас установлены библиотеки Boost.
Последнее замечание: поскольку библиотеки Qt являются кроссплатформенными, вот то же самое приложение, работающее на Mac:
Вот так:
Нравится Загрузка. ..
Метки: boost, C++, Qt
Эта запись была опубликована 23 апреля 2010 г. в 20:35 и размещена в разделе Статьи. Вы можете следить за любыми ответами на эту запись через ленту RSS 2.0.
Вы можете оставить отзыв или вернуться со своего сайта.
Функции Qt для доступа к последовательным портам
Как партнер Amazon я зарабатываю на соответствующих покупках. Хотите хорошо почитать? Попробуйте FreeBSD Mastery: Jails (IT Mastery Book 15)Все время: UTC
Самая безопасная процедура: сменить пароль FreshPorts. Все, что вы установили до пятницы, 24 марта 2023 г., 09:49:20 UTC, должно быть изменено. Вы можете прочитать больше здесь: Исправлены проблемы с внедрением SQL и исправления кода FreshSource. Извините за дополнительную работу для вас.
Исправлены все известные проблемы с SQL-инъекциями. Нет никаких доказательств того, что его использовали. Это не значит, что этого не было. Пожалуйста, измените свой пароль.
Детали порта
qt6-serialport Функции Qt для доступа к последовательным портам
6.4.2 comms =0 Версия этого порта представлена в последней квартальной ветке.
Последовательный порт Qt обеспечивает основные функции, включая настройку,
Операции ввода/вывода, получение и установка управляющих сигналов распиновки RS-232.
Следующие элементы не поддерживаются этим модулем:
* Функции терминала, такие как эхо, управление CR/LF и т.д.
* Текстовый режим.
* Настройка тайм-аутов и задержек при чтении или записи.
* Уведомление об изменении сигнала распиновки.
¦ ¦ ¦ ¦
pkg-plist: , полученный с помощью:
make generate-plist
Строки зависимостей :
qt6-serialport>0:comms/qt6-serialport
To install the port:
cd /usr/ports/comms/qt6-serialport/ && make install clean
To add the package, выполните одну из следующих команд:
pkg install comms/qt6-serialport
pkg install qt6-serialport
ПРИМЕЧАНИЕ. Если этот пакет имеет несколько разновидностей (см. ниже), используйте одну из них вместо имени, указанного выше.
PKGNAME: qt6-serialport
Варианты: для этого порта нет информации о вариантах.
00184b3c3de8ccb6f62954b20f3756c05adce8d5010504340fa
РАЗМЕР (KDE/Qt/6.4.2/qtserialport-everywhere-src-6.4.2.tar.xz) = 319000
Пакеты (временные метки во всплывающих окнах указаны в формате UTC):
Зависимости
ПРИМЕЧАНИЕ. FreshPorts отображает только информацию о требуемых зависимостях и зависимостях по умолчанию. Необязательные зависимости не рассматриваются.
Сборка зависимостей:
vulkan-headers>0 : графика/вулкан-заголовки
cmake : devel/cmake-core
ninja : devel/ninja
pkgconf>=1.3.0_1 : devel/pkgconf
Библиотечные зависимости:
libudev. so : devel/libudev-devd
libQt6Core.so : devel/qt6-base
Этот порт требуется для:
для библиотек
связь/qt6-последовательная шина
разработка/py-qt6-pyqt
devel/qt6-позиционирование
разработка/qtcreator
для запуска
девел/qt6
Опции конфигурации :
Нет параметров для настройки
Название параметров :
comms_qt6-serialport
ИСПОЛЬЗОВАНИЕ:
компилятор cmake: c++11-lib pkgconfig qt-dist:6
FreshPorts не удалось извлечь/найти сообщение pkg
Основные сайты:
Количество найденных коммитов: 7
История коммитов — (может быть неполной: подробные сведения см. в ссылках на репозитории вверху страницы)
Фиксация
Кредиты
Сообщение журнала
6. 4.2 05 января 2023 17:28:10
Тобиас С. Бернер (tcberner)
Qt: обновить Qt 6 до 6.4.2
Как патч-релиз, Qt 6.4.2 не вводит никаких новых функций, но
содержит ~ 150 исправлений ошибок, обновлений безопасности и других улучшений для
верхняя часть выпуска Qt 6.4.1. Смотрите больше информации о самых
важные изменения и исправления ошибок из примечания к выпуску Qt 6.4.2.
Объявление: https://www.qt.io/blog/qt-6.4.2-released
Выпускать
Примечания: https://code.qt.io/cgit/qt/qtreleasenotes.git/about/qt/6.4.2/release-note.md
6.4.1 16 ноя 2022 07:01:03
Тобиас С. Бернер (tcberner)
Qt: обновить Qt6 до версии 6.4.1
Выпуск Qt 6.4.1 — это выпуск исправления, сделанный поверх Qt 6.4.0. Как
патч, Qt 6.4.1 не добавляет никаких новых функций, но предоставляет
исправления ошибок и другие улучшения и поддерживает как вперед, так и назад
совместимость (исходник и бинарник) с Qt 6.
4.0.
Подробную информацию о Qt 6.4 см. в онлайн-документации.
входит в этот дистрибутив. Документация также доступна
В сети:
https://doc.qt.io/qt-6/index.html
Список изменений:
https://code.qt.io/cgit/qt/qtreleasenotes.git/about/qt/6.4.1/release-note.md
6.4.0 01 окт. 2022 13:55:15
Тобиас С. Бернер (tcberner)
Qt: обновить Qt6 до версии 6.4.0
Примечания к выпуску: https://www.qt.io/blog/qt-6.4-released
6.3.2 09 сен 2022 16:39:24
Тобиас С. Бернер (tcberner)
QT: обновить Qt 6 до версии 6.3.2
07 сент. 2022 21:58:51
Стефан Эссер (наш)
Удалить записи WWW, перемещенные в порт Makefiles
Commit b7f05445c00f добавил записи WWW в файлы Makefile порта на основе
WWW: строки в файлах pkg-descr.
Эта фиксация удаляет WWW: строки перемещенных URL-адресов из этих
файлы pkg-descr.
Утверждено: portmgr (tcberner)
6.3.1 07 сент. 2022 21:10:59
Стефан Эссер (наш)
Добавить записи WWW в Makefiles порта
Обычной практикой является наличие одного или нескольких URL-адресов в конце
файлы pkg-descr портов, по одному на строку и с префиксом «WWW:». Эти
URL-адреса должны указывать на веб-сайт проекта или другие соответствующие ресурсы.
Доступ к этим URL-адресам требовал обработки файлов pkg-descr, и
они часто устаревают с течением времени. Если более одного такого URL было
присутствует в файле pkg-descr, только первый из них был передан в
ИНДЕКС порта, но для многих портов только последняя строка содержала
конкретный URL-адрес порта для получения дополнительной информации.
Было несколько предложений сделать URL-адрес проекта доступным как
макрос в файлах Makefile портов, со временем.
(Выше показаны только первые 15 строк сообщения фиксации)