![]() |
|
![]() ![]() ![]() |
|
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Управляю прибором по RS232. Есть необходимость управлять сигналом RST, т.к. от этого зависит режим работы прибора. Старая программа написана на C++ Builder. Выставляет RST при открытии порта нормально, как закажешь.
Теперь есть необходимость написать то же на QT. Тут возникли трудности. Не могу переключить RST в нужное состояние. Например после старой программы он остаётся в "0" даже если я открываю порт из новой программ. Но через некоторое время, когда прибор постоит выключенным, RST переключается в "1" и остаётся в таком состоянии. При передаче-чтении данных RST переключается в "0". Но при закрытии порта опять прыгает в "1". Необходимо чтобы сигнал RST находился всегда в "0". setRequestToSend не влияет на работу RST. Открываю порт таким образом:
|
|||
|
||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Так у Вас NoFlowControl. Попробуйте заменить его на HardwareControl.
Это сообщение отредактировал(а) baldman88 - 29.6.2016, 15:24 |
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Не помогло.
|
|||
|
||||
baldman88 |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Кстати. Настройки порта правильнее выставлять после его успешного открытия (иначе они могут не примениться), как-то так:
Чего Вы пытались добиться этими строчками:
В таком виде у Вас оно скомпилировалось? Если хотите программно управлять сигналами RTS и DTR, то Вам нужно поставить SoftwareControl и использовать методы setDataTerminalReady и setRequestToSend. При передаче в них true, по идее, соответствующие выходы (DTR и RTS) ставятся в "1", а при передаче false -- в "0" (ну или может наоборот):
Это сообщение отредактировал(а) baldman88 - 30.6.2016, 08:33 |
||||||
|
|||||||
kuzulis |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Как бы-да, можно и SoftwareControl, т.к. в этом случае не используются RTS и DTR драйвером (вместо этого XON/XOFF символы подставляются в стрим)... Но лучше всего просто оставлять в NoFlowControl, и отсюда дергать RTS и DTR. PS: При HardwareFlowControl установка RTS и DTR вручную запрещена. |
|||
|
||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Спасибо. У меня были такие подозрения. То есть при использовании NoFlowControl RTS и DTR можно выставлять программно? P.S.: Насколько я понял Вы имеете непосредственное отношение к разработке QSerialPort? Если да, то спасибо Вам -- отличный модуль. Это сообщение отредактировал(а) baldman88 - 30.6.2016, 08:42 |
|||
|
||||
kuzulis |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Эмм.. в последней версии QSerialPort должен ругнуться ошибкой при попытке установки RTS (но не помню насчет DTR - кажется там всегда можно ее дергать).
да Это сообщение отредактировал(а) kuzulis - 30.6.2016, 08:43 |
||||
|
|||||
ymb |
|
||||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
baldman88
Сделал как Вы посоветовали.
отправка команды и чтение ответа
Практически ничего не изменилось. Первая команда срабатывает правильно, т.к. RTS находится изначально в "0". При передаче команды он тоже в "0". Но после закрытия порта он прыгает в "1". И управляемый прибор видит , что RTS = 1 и переключается в другой режим. Через секунду возвращается в исходное состояние. Поэтому необходимо всегда держать RTS = 0. А он в нуле только во время передачи команды. Как это можно сделать? Программа, сделанная в С++Builder управляет как надо. Это сообщение отредактировал(а) ymb - 30.6.2016, 08:58 |
||||
|
|||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Выше уже написали, что все же нужно использовать NoFlowControl.
|
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Пробовал и NoFlowControl. То же самое. После передачи команды RTS прыгает в "1" и остаётся в таком состоянии.
|
|||
|
||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Странно. По идее, если стоит NoFlowControl, то состояние RTS меняться не должно. И да, состояние RTS меняется сразу после передачи или все же после закрытия порта?
|
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Я смотрю состояние сигналов не на осциллографе, а в программе Free Serial Port Monitor.
Иногда ответ приходит с задержкой и тогда видно, что RTS стоит в "0" до закрытия порта. |
|||
|
||||
kuzulis |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Елки, а доку почитать не судьба? По умолчанию при закрытии восстанавливаются параметры которые были до открытия.. QSP::setSettingsRestoredOnClose(false) должен помочь: http://doc.qt.io/qt-5/qserialport-obsolete...redOnClose-prop Это сообщение отредактировал(а) kuzulis - 30.6.2016, 09:46 |
|||
|
||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Так этот метод помечен как устаревший. Есть ли ему какая-то альтернатива?
|
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
QSP::setSettingsRestoredOnClose(false) помогло!
Спасибо! Хотя почему он "восстанавливается" до значения , которое я не подавал непонятно. Доку читал здесь http://doc.qt.io/qt-5/qserialport.html В "Obsolete members" не догадался заглянуть. Это сообщение отредактировал(а) ymb - 30.6.2016, 10:33 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |