|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
||||||||||||||||
QSerialPort и readyRead13.12.2013, 14:31. Показов 12394. Ответов 13
Метки нет (Все метки)
Доброго времени суток. Проблема состоит в том, как правильно переписать работу целого класса и при том с наименьшим переписыванием кода.
У меня был класс для работы с приборами через сом-порт. Раньше я использовал библиотеку qserialdevice v. 0.2.0 и при помощи выставления задержки setCharIntervalTimeout(), заставлял работать код примерно следующего содержания:
Сейчас же класс для работы с последовательными портами появился и в КуТ, но приостановки выполнения кода, до прихода сигнала readyRead там нет. И появилась идея приостанавливать код через
Добавлено через 40 минут Если не остановить, то хотя бы добавить задержку, которую можно было бы прервать при получении ответа или которая продолжала код по истечении времени.
0
|
||||||||||||||||
| 13.12.2013, 14:31 | |
|
Ответы с готовыми решениями:
13
QUdpSocket readyRead Баг QAudioInput + readyRead QAbstractSocket::readyRead и winsockets |
| 13.12.2013, 14:41 | |
|
0
|
|
|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
|
| 13.12.2013, 15:05 [ТС] | |
|
В версии 0.2.0 нет необходимых мне скоростей, а именно 460800 и выше. В версии 0.4.0 есть эти скорости, но толи из-за того что скорости 460800 и тд. являются enhanced speed(experimental), толи из-за того что метод setCharIntervalTimeout отрабатывает не корректно и код в итоге работает не правильно. Через сигнал readyRead ответы отлавливаются на ура и не смотря что под него придется переписывать код, необходимости в библиотеке qserialdevice больше нет.
Также использовал метод setTotalReadConstantTimeout. Эффекта не было..
0
|
|
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
| 13.12.2013, 18:13 | |
|
Почему бы не использовать:
waitForReadyRead(500) ?
0
|
|
|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
|
| 17.12.2013, 17:50 [ТС] | |
|
Я пробовал работать с waitForReadyRead(), но метод также работает не корректно. Даже если удастся считать данные в первый раз, то в цикле в последующие разы остановки не происходит, waitForReadyRead() возвращает false и дальше код отрабатывает неверно.
Немного погуглив наткнулся на американский форум: Кликните здесь для просмотра всего текста
About QtSerialPort: Use blocking I / O is necessary only in a separate thread. Also have some features using the methods read() / write(). The fact is that in blocking mode, these functions do not work correctly by themselves, because do not work event-loop. For their proper functioning is necessary to use methods such as waitForXXX (), that handle events that I / O. Should be the following guidelines on blocking I / O: 1. After call write() need call waitForBytesWritten() 2. Before call read() need call waitForReadyRead() At the moment, blocking I / O does not work in QtSerialPort on Windows, but the solution is available, but not yet merged to master branch. Please use this patch: https://codereview.qt-project.org/#change,39635 Also exists examples of the use of blocking I / O: https://codereview.qt-project.org/#change,39343 вроде как там пофиксили баг с waitForReadyRead(), но после пересобирания библиотеки координально ни чего не изменилось. возможно я что то не так сделал или этот патч не совместим с 5.1.1
0
|
|
|
98 / 40 / 1
Регистрация: 08.08.2012
Сообщений: 86
|
|
| 17.12.2013, 18:59 | |
|
подтверждаю проблемы с waitForReadyRead(), в моем случае мне проще было сменить логику работы программы
Не совсем понимаю что вы пересобрали, конкретно этот патч вы указали просто как пример, или использовали его? Потому как он довольно бородатый. Пофиксить то пофиксили, а время от времени всплывают подобные проблемы в баг репортах
0
|
|
|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
|
| 18.12.2013, 14:42 [ТС] | |
|
Я подозреваю, что патч был написан для версии 5.1, тк в версии 5.1.1 довольно много расхождений, как в названиях методов, так и в полях и прочем. Потому я в сорцах QtSerialDevice 5.1.1 отредактировал методы связанные с петлей событий AbstractOverlappedEventNotifier по аналогии с сорцами патча, а также другие методы зависящие от него и добавил тех, которых там не было или были исключены в версии 5.1.1. Видимо я чего лишнего исправил, либо у меня просто руки кривые, но новые либы хоть и встали нормально, эффекта лечебного не возымели.
0
|
|
|
98 / 40 / 1
Регистрация: 08.08.2012
Сообщений: 86
|
||
| 18.12.2013, 15:02 | ||
|
Не могу сказать, как сделать правильно, но по-моему не так
1
|
||
|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
|
| 18.12.2013, 15:52 [ТС] | |
|
Лол, действительно) Что ж вышла 5.2.0 попробую на ней пересобрать. Посмотрим, что выйдет..
0
|
|
|
42 / 40 / 7
Регистрация: 21.05.2012
Сообщений: 199
|
|
| 18.12.2013, 17:22 | |
|
Этот патч не был применен, поэтому этот баг еще не исправлен.
0
|
|
|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
||
| 20.12.2013, 01:07 [ТС] | ||
|
В конечном итоге после долгих плясок с бубном, мансований кода и перекомпилирования проекта получилось запустить код на waitForReadyRead() и waitForBytesWritten() не коннектя сигнал readyRead(). Только для получения стабильности пришлось поиграться с задержкой при чтении и записи.
Собственно, использовал конструкцию как написано в гайде:
0
|
||
|
98 / 40 / 1
Регистрация: 08.08.2012
Сообщений: 86
|
||||||
| 20.12.2013, 10:32 | ||||||
|
Таки требую подробностей
Версия Qt? Что там с патчами, ставили/не ставили? Код типа такого?
0
|
||||||
|
42 / 40 / 7
Регистрация: 21.05.2012
Сообщений: 199
|
||
| 20.12.2013, 11:15 | ||
|
не был исправлен. Но может быть, чудесным образом, он уже самоисправился. ![]() Попробуйте собрать версию QtSeriaPort из Git, как описано в Вики: http://qt-project.org/wiki/QtSerialPort_Russian PS: Но в любом случае вызов методов waitForXXX() необходим как воздух, и это не баг - так надо. ![]() Кроме того, я рекомендовал бы отказаться вообще от синхронного подхода и переписать код с использованием сигналов/слотов, т.к. это надежнее, проще и т.д.
0
|
||
|
5 / 5 / 0
Регистрация: 29.05.2011
Сообщений: 39
|
||||||||
| 20.12.2013, 14:12 [ТС] | ||||||||
|
Собрал на Qt5.1.1 в MSVC2010 SP1 x32. Патч убрал, тк сомневался в его совместимости с текущей либой.
Для скорости 460800 на запись и чтение ставил задержку в 50мс для пакетов длиной ~ 130 байт.
![]()
0
|
||||||||
| 20.12.2013, 14:12 | |
|
Помогаю со студенческими работами здесь
14
Не работает QTcpSocket::readyRead Сигнал readyRead не запускает слот QUdpSocket::readyRead() не работает в openSUSE 42.3 ReadyRead будит поток с задержкой? Dll + QTcpSocket + signal readyRead() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|