Russian Qt Forum
Апрель 18, 2024, 12:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 83 84 [85] 86 87 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 750161 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1260 : Декабрь 16, 2015, 18:27 »

для эксклюзивного доступа к порту (чтобы нельзя было одновременно открыть один и тот же порт несколькими программами, к примеру)
Записан

ArchLinux x86_64 / Win10 64 bit
TigerProg
Гость
« Ответ #1261 : Декабрь 31, 2015, 00:53 »

Может кому пригодится... По поводу моей проблемы, всё дело оказалось в кабеле RS232/USB.
Нужно использовать промышленный кабель, например MOXA. Тогда ничего виснуть не будет.

P.S.
Всех с новым годом!)
Записан
Phoenix
Гость
« Ответ #1262 : Май 26, 2016, 12:14 »

Добрый день.
Столкнулся с ошибкой на windows, Qt4. Преобразователь на микросхеме Exar XR21B1411. Не удается открыть порт, ошибка параметров. Однако другие программы, которые не используют данную библиотеку, порт открывают. В Linux такой проблемы нет. С преобразователем на микросхеме FTDI FT232RL такой пролемы нет.

Проблема пропадает если в файл qserialport_win.cpp в функцию inline bool QSerialPortPrivate::initialize() после currentDcb.fErrorChar = FALSE; добавить строку: if (currentDcb.BaudRate==0) currentDcb.BaudRate = 9600;

В currentDcb.BaudRate был 0, я сделал вывод что порт не открывается с таким параметром.

Библиотеку скачивал 19.04.2015. Хотел скачать более свежую версию для Qt4, но не понял как, да и кажется для Qt4 не обновляется уже.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1263 : Май 26, 2016, 13:09 »

Это там было исправлено уже давно.

Код
C++ (Qt)
inline bool QSerialPortPrivate::initialize()
{
   ...
   dcb.BaudRate = inputBaudRate;
   ...
}
 

Цитата: Phoenix
Хотел скачать более свежую версию для Qt4, но не понял как

Качать Git-ом, как обычно:
Цитировать
$git clone git://code.qt.io/qt/qtserialport.git
$git checkout qt4-dev

Цитата: Phoenix
да и кажется для Qt4 не обновляется уже

все верно.. теперь сами обновляйте если надо
« Последнее редактирование: Май 26, 2016, 13:11 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1264 : Май 26, 2016, 13:19 »

ок.

после
Цитировать
git checkout qt4-dev
выдает такое:
Цитировать
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

или нужно было в корень домашней директории склонировать?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1265 : Май 26, 2016, 13:54 »

выдает такое:
Цитировать
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

Код:
$git clone git://code.qt.io/qt/qtserialport.git
$cd qtserialport
$git checkout qt4-dev
Записан
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #1266 : Сентябрь 12, 2016, 16:50 »

Код
C++ (Qt)
   m_serialPort = new QSerialPort(portName, this);
 
   if (!m_serialPort->setBaudRate(baudRate))
       return false;
 
   if (!m_serialPort->setDataBits(QSerialPort::Data8))
       return false;
 
   if (!m_serialPort->setParity(QSerialPort::NoParity))
       return false;
 
   if (!m_serialPort->setStopBits(QSerialPort::OneStop))
       return false;
 
   if (!m_serialPort->setFlowControl(QSerialPort::NoFlowControl))
       return false;
 
   if (!m_serialPort->setDataTerminalReady(true))
       return false;
 
   if (!m_serialPort->setRequestToSend(false))
       return false;
 

После конструктора забыл открыть порт и сообщение об ошибке, что порт не открыт получил только при вызове setDataTerminalReady, все предыдущие методы выполнились без ошибок. Это сделано нарочно?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1267 : Сентябрь 12, 2016, 17:05 »

Код
C++ (Qt)
   m_serialPort = new QSerialPort(portName, this);
 
   if (!m_serialPort->setBaudRate(baudRate))
       return false;
 
   if (!m_serialPort->setDataBits(QSerialPort::Data8))
       return false;
 
   if (!m_serialPort->setParity(QSerialPort::NoParity))
       return false;
 
   if (!m_serialPort->setStopBits(QSerialPort::OneStop))
       return false;
 
   if (!m_serialPort->setFlowControl(QSerialPort::NoFlowControl))
       return false;
 
   if (!m_serialPort->setDataTerminalReady(true))
       return false;
 
   if (!m_serialPort->setRequestToSend(false))
       return false;
 

После конструктора забыл открыть порт и сообщение об ошибке, что порт не открыт получил только при вызове setDataTerminalReady, все предыдущие методы выполнились без ошибок. Это сделано нарочно?


Написано же, что порт должен быть открыт.
QSerialPort::setDataTerminalReady
Цитировать
Note: The serial port has to be open before trying to set or get this property; otherwise false is returned and the error code is set to NotOpenError.
Записан

poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #1268 : Сентябрь 13, 2016, 11:29 »

Я знаю, что он должен быть открыт. Почему при настройке не ругается?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1269 : Сентябрь 13, 2016, 18:13 »

Какой настройке? Читайте доку.

Да и вообще нет смысла все это set, set set... т.к. по умолчанию всегда 9600 8 N 1, т.е. достаточно только установить скорость.

« Последнее редактирование: Сентябрь 13, 2016, 18:15 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #1270 : Сентябрь 14, 2016, 15:38 »

Если у нас есть возможность устанавливать параметры порта до его открытия, то что мешает добавить туда Dtr и Rts. Пусть так же устанавливаются в нужное состояние в момент открытия порта.
« Последнее редактирование: Сентябрь 14, 2016, 15:47 от poru » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1271 : Сентябрь 14, 2016, 19:44 »

Это понятно, и планируется.

Но тут возникает несколько трудностей:

1. Во первых, QSP::open() будет фейлится если RTS/DTR не поддерживаются
    (привет, socat), нужна какая-то дополнительня логика. Игнорить в этом случае
    ошибки или нет.. А если это не socat, а реальный порт и установка RTS/DTR фейлится..
    То что будем делать?

2. Нужно добавлять дополнительный анализ чтобы запрещать устанавливать RTS
    если у нас FlowControl и наоборот. Это гемморой еще тот.

3. И что-то было еще, не помню, но там что-то мутное было.

4. RTS/DTR не так уж и важны по сравнению с остальными параметрами, поэтому
    пока на это подзабили.
« Последнее редактирование: Сентябрь 14, 2016, 19:48 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #1272 : Сентябрь 15, 2016, 11:40 »

socat - не сталкивался, дайте ссылочку.
 
Цитировать
4. RTS/DTR не так уж и важны по сравнению с остальными параметрами, поэтому
    пока на это подзабили.

У нас много устройств, которые запитываются по DTR, так что выставлять приходится сразу. А зачем вообще понадобилась идея предварительной настройки? Если бы параметры можно было менять в дизайнере, как в C++Builder или Delphi тогда понятно.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1273 : Сентябрь 15, 2016, 14:53 »

Цитировать
socat - не сталкивался, дайте ссылочку.

Гугл в помощь.

Цитировать
У нас много устройств, которые запитываются по DTR, так что выставлять приходится сразу

Ну, это у вас так, но это не означает что у всех так.

Цитировать
А зачем вообще понадобилась идея предварительной настройки?

Удобнее так, и все параметры конфигурятся за один раз. В дальнейшем вроде-бы (в Qt6) планируется добавить
новый класс типа QSerialPortSettings, которыми сразу можно сконфигурить, хотя, хз, будет видно.

Цитировать
Если бы параметры можно было менять в дизайнере, как в C++Builder или Delphi тогда понятно

Я не знаю как там в дельфях, но С++ это проперти - геттеры/сеттеры, а все эти baudrate, parity и прочее - именно проперти объекта,
и должны быть установлены в не зависимости от состояния объекта.. кроме того, вообще, setXXX() должны возвращать void, а не bool
(но, это будет в Qt6 наверно).

Записан

ArchLinux x86_64 / Win10 64 bit
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #1274 : Сентябрь 16, 2016, 09:39 »

Цитировать
по умолчанию всегда 9600 8 N 1

То что при открытии порта устанавливаются предопределенные значения в корне не верно, тем самым вы сбиваете настройки которые были установлены ранее (к примеру командой mode), потому что есть софт, который ничего не должен знать о параметрах порта и не должен выполнять никаких настроек, а должен только открывать его и заниматься обменом. Это можно решить флагом конструктора, например DefaultSettings/SystemSettings.
« Последнее редактирование: Сентябрь 16, 2016, 10:02 от poru » Записан
Страниц: 1 ... 83 84 [85] 86 87 88   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.253 секунд. Запросов: 22.