Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QSerialPort сигнал RST 
:(
    Опции темы
ymb
Дата 29.6.2016, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Управляю прибором по RS232. Есть необходимость управлять сигналом RST, т.к. от этого зависит режим работы прибора. Старая программа написана на C++ Builder. Выставляет RST при открытии порта нормально, как закажешь. 
Теперь есть необходимость написать то же на QT. Тут возникли трудности. Не могу переключить RST в нужное состояние. 
Например после старой программы он остаётся в "0" даже если я открываю порт из новой программ.
Но через некоторое время, когда прибор постоит выключенным, RST переключается в "1" и остаётся в таком состоянии.
При передаче-чтении данных RST переключается в "0". Но при закрытии порта опять прыгает в "1". 
Необходимо чтобы сигнал RST находился всегда в "0".  
setRequestToSend не влияет на работу RST.   
Открываю порт таким образом:

Код

    sport->setPortName("COM1");

    sport->setBaudRate(QSerialPort::Baud38400);
    sport->setDataBits(QSerialPort::Data8);
    sport->setParity(QSerialPort::NoParity);
    sport->setStopBits(QSerialPort::OneStop);
    sport->setFlowControl(QSerialPort::NoFlowControl);

    sport->open(QIODevice::ReadWrite);

    sport->requestToSendChanged(false);
    sport->setRequestToSend(QSerialPort::RequestToSendSignal);
    sport->setDataTerminalReady(true);
  

PM MAIL   Вверх
baldman88
Дата 29.6.2016, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Так у Вас NoFlowControl. Попробуйте заменить его на HardwareControl.

Это сообщение отредактировал(а) baldman88 - 29.6.2016, 15:24
PM MAIL   Вверх
ymb
Дата 29.6.2016, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Не помогло. 
PM MAIL   Вверх
baldman88
Дата 29.6.2016, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Кстати. Настройки порта правильнее выставлять после его успешного открытия (иначе они могут не примениться), как-то так:
Код
sport->setPortName("COM1");
if (sport->open(QIODevice::ReadWrite) == true)
{
    sport->setBaudRate(QSerialPort::Baud38400);
    sport->setDataBits(QSerialPort::Data8);
    sport->setParity(QSerialPort::NoParity);
    sport->setStopBits(QSerialPort::OneStop);
    sport->setFlowControl(QSerialPort::SoftwareControl);
}

Чего Вы пытались добиться этими строчками:
Код
sport->requestToSendChanged(false);
sport->setRequestToSend(QSerialPort::RequestToSendSignal);

В таком виде у Вас оно скомпилировалось?
Если хотите программно управлять сигналами RTS и DTR, то Вам нужно поставить SoftwareControl и использовать методы setDataTerminalReady и setRequestToSend. При передаче в них true, по идее, соответствующие выходы (DTR и RTS) ставятся в "1", а при передаче false -- в "0" (ну или может наоборот):
Код
setDataTerminalReady(true); // выставить DTR в "1"
setRequestToSend(true); // выставить RTS в "1"
setDataTerminalReady(false); // выставить DTR в "0"
setRequestToSend(false); // выставить RTS в "0"



Это сообщение отредактировал(а) baldman88 - 30.6.2016, 08:33
PM MAIL   Вверх
kuzulis
Дата 30.6.2016, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Если хотите программно управлять сигналами RTS и DTR, то flowControl нужно поставить в SoftwareControl


Как бы-да, можно и SoftwareControl, т.к. в этом случае не используются RTS и DTR драйвером (вместо этого XON/XOFF символы подставляются в стрим)...
Но лучше всего просто оставлять в NoFlowControl, и отсюда дергать  RTS и DTR.

PS: При HardwareFlowControl установка RTS и DTR вручную запрещена.
PM MAIL   Вверх
baldman88
Дата 30.6.2016, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Цитата(kuzulis @ 30.6.2016,  08:29)
PS: При HardwareFlowControl установка RTS и DTR вручную запрещена.

Спасибо. У меня были такие подозрения. То есть при использовании NoFlowControl RTS и DTR можно выставлять программно?
P.S.: Насколько я понял Вы имеете непосредственное отношение к разработке QSerialPort? Если да, то спасибо Вам -- отличный модуль.

Это сообщение отредактировал(а) baldman88 - 30.6.2016, 08:42
PM MAIL   Вверх
kuzulis
Дата 30.6.2016, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Спасибо. У меня были такие подозрения


Эмм.. в последней версии QSerialPort должен ругнуться ошибкой при попытке установки RTS (но не помню насчет DTR - кажется там всегда можно ее дергать).

Цитата

То есть при использовании NoFlowControl RTS и DTR можно выставлять программно?


да

Это сообщение отредактировал(а) kuzulis - 30.6.2016, 08:43
PM MAIL   Вверх
ymb
Дата 30.6.2016, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



baldman88
Сделал как Вы посоветовали.
Код

    sport->setPortName("COM1");
    if (sport->open(QIODevice::ReadWrite) == true)
    {
        sport->setBaudRate(QSerialPort::Baud38400);
        sport->setDataBits(QSerialPort::Data8);
        sport->setParity(QSerialPort::NoParity);
        sport->setStopBits(QSerialPort::OneStop);
        sport->setFlowControl(QSerialPort::SoftwareControl);
        sport->setDataTerminalReady(true);
        sport->setRequestToSend(false);
    }


отправка команды и чтение ответа

Код

        sport->write(cWrite);
        sport->waitForBytesWritten(10000);

        sport->readAll();
        sport->waitForReadyRead(10000);


Практически ничего не изменилось. Первая команда срабатывает правильно, т.к. RTS находится изначально в "0". При передаче команды он тоже в "0". Но после закрытия порта он прыгает в "1". И управляемый прибор видит , что RTS = 1 и переключается в другой режим. Через секунду возвращается в исходное состояние. Поэтому необходимо всегда держать RTS = 0. А он в нуле только во время передачи команды. 
Как это можно сделать?
Программа, сделанная в С++Builder управляет как надо. 

Это сообщение отредактировал(а) ymb - 30.6.2016, 08:58
PM MAIL   Вверх
baldman88
Дата 30.6.2016, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Выше уже написали, что все же нужно использовать NoFlowControl.
PM MAIL   Вверх
ymb
Дата 30.6.2016, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Пробовал и NoFlowControl. То же самое. После передачи команды RTS прыгает в "1" и остаётся в таком состоянии. 
PM MAIL   Вверх
baldman88
Дата 30.6.2016, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Странно. По идее, если стоит NoFlowControl, то состояние RTS меняться не должно. И да, состояние RTS меняется сразу после передачи или все же после закрытия порта?
PM MAIL   Вверх
ymb
Дата 30.6.2016, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Я смотрю состояние сигналов не на осциллографе, а в программе  Free Serial Port Monitor.
Иногда ответ приходит с задержкой и тогда видно, что RTS стоит в "0" до закрытия порта.
PM MAIL   Вверх
kuzulis
Дата 30.6.2016, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Но после закрытия порта он прыгает в "1"


Елки, а доку почитать не судьба? По умолчанию при закрытии восстанавливаются параметры которые были до открытия.. QSP::setSettingsRestoredOnClose(false) должен помочь:
http://doc.qt.io/qt-5/qserialport-obsolete...redOnClose-prop

Это сообщение отредактировал(а) kuzulis - 30.6.2016, 09:46
PM MAIL   Вверх
baldman88
Дата 30.6.2016, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Так этот метод помечен как устаревший. Есть ли ему какая-то альтернатива?
PM MAIL   Вверх
ymb
Дата 30.6.2016, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



QSP::setSettingsRestoredOnClose(false) помогло!
Спасибо!

Хотя почему он "восстанавливается" до значения , которое я не подавал непонятно. 

Доку читал здесь http://doc.qt.io/qt-5/qserialport.html
В "Obsolete members" не догадался заглянуть.

Это сообщение отредактировал(а) ymb - 30.6.2016, 10:33
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1097 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.