QSerialPort сигнал RST

 
0
 
C++
ava
ymb | 29.06.2016, 14:56
Управляю прибором по 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);
  
Ответы (15)
ava
baldman88 | 29.06.2016, 15:20 #
Так у вас NoFlowControl. Попробуйте заменить его на HardwareControl.
ava
ymb | 29.06.2016, 16:11 #
Не помогло. 
ava
baldman88 | 29.06.2016, 18:37 #
Кстати. Не знаю, как сейчас, но раньше на Windows была такая особенность, что настройки нужно было выставлять после открытия порта, иначе они не действовали. Поэтому советовали делать так:
sport->setPortName("COM1");
if (sport->open(QIODevice::ReadWrite))
{
    sport->setBaudRate(QSerialPort::Baud38400);
    sport->setDataBits(QSerialPort::Data8);
    sport->setParity(QSerialPort::NoParity);
    sport->setStopBits(QSerialPort::OneStop);
    sport->setFlowControl(QSerialPort::HardwareControl);
}

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

В таком виде у Вас оно скомпилировалось?
Если хотите программно управлять сигналами RTS и DTR, то flowControl нужно поставить в SoftwareControl, а для управления использовать методы setDataTerminalReady и setRequestToSend. При передаче в них true, соответствующие выходы (DTR и RTS) ставятся в "1", а при передаче false -- в "0" (ну или может наоборот).
ava
kuzulis | 30.06.2016, 08:29 #
Цитата


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



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

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

Спасибо. У меня были такие подозрения. То есть при использовании NoFlowControl RTS и DTR можно выставлять программно?
ava
kuzulis | 30.06.2016, 08:41 #
да
ava
ymb | 30.06.2016, 08:48 #
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 управляет как надо. 
ava
baldman88 | 30.06.2016, 08:52 #
Выше уже написали, что все же нужно использовать NoFlowControl.
ava
ymb | 30.06.2016, 08:58 #
Пробовал и NoFlowControl. То же самое. После передачи команды RTS прыгает в "1" и остаётся в таком состоянии. 
ava
baldman88 | 30.06.2016, 09:17 #
Странно. По идее, если стоит NoFlowControl, то состояние RTS меняться не должно. И да, состояние RTS меняется сразу после передачи или все же после закрытия порта?
ava
ymb | 30.06.2016, 09:37 #
Я смотрю состояние сигналов не на осциллографе, а в программе  Free Serial Port Monitor.
Иногда ответ приходит с задержкой и тогда видно, что RTS стоит в "0" до закрытия порта.
ava
kuzulis | 30.06.2016, 09:44 #
Цитата


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



Елки, а доку почитать не судьба? По умолчанию при закрытии восстанавливаются параметры которые были до открытия.. QSP::setSettingsRestoredOnClose(false) должен помочь.
ava
baldman88 | 30.06.2016, 10:08 #
Так этот метод помечен как устаревший. Есть ли ему какая-то альтернатива?
ava
ymb | 30.06.2016, 10:18 #
QSP::setSettingsRestoredOnClose(false) помогло!
Спасибо!

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

Доку читал здесь http://doc.qt.io/qt-5/qserialport.html
В "Obsolete members" не догадался заглянуть.
ava
bsa | 12.08.2016, 16:01 #
ymb, при изначальной разработке модуля заложили функционал определения настроек до открытия порта и восстановления их после закрытия. Потом выяснилось, что это несколько усложняет код, да и никому не нужно. Более того, некоторым вредит - был добавлено свойство settingsRestoredOnClose. Потом было принято решение от него вообще отказаться, поэтому и свойство будет не нужно. Но удалить в текущей версии Qt невозможно. Надо ждать ближайший major release (Qt6). 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
ava  bsa   kuzulis ava  baldman88   ymb
advanced
Отправить