Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: kuzulis от Май 17, 2009, 18:27



Название: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Отправлено: kuzulis от Май 17, 2009, 18:27
Доброго дня!

Важная новость!
26.02.2013 – Проект перемещен из песочницы в основную ветвь Qt5!

Важное замечание!:

С недавнего времени ветка QSerialDevice 2.0
портирована в репозиторий на Gerrit и планируется,
что она станет аддоном для Qt5 под названием QtSerialPort.

Подробнее тут http://qt-project.org/wiki/QtSerialPort_Russian

Далее, все что написано ниже в этом первом посте относится
только к "устаревшей" библиотеке QSerialDevice, разработка
которой остановлена, т.к. все силы срочно брошены на QtSerialPort.

Так что, кому интересно узнать про QSerialDevice - можете
продолжить чтение того, что написано ниже. :)


Вступление:

Я тут решил создать библиотеку для работы с последовательными портами.
Упор делался на возможность будущей интеграции в Qt4, поэтому желательно
собирать библиотеку имея Qt4 скомпилированную из исходников (а не готовую).
Причина такой рекомендации в том, что в готовых SDK может не быть некоторых приватных заголовков, которые используются в библиотеке QSerialDevice.

На текущий момент имеются две ветки разработки:
1. Это текущая ветка 1.0 "master" с нумерацией версий от 0 до 1 (0.3, 0.4)
2. Новая ветка 2.0, разработка которой начата 18.06.2011



Содержимое QSerialDevice ветки 1.0

Класс AbstractSerial
Собственно, является основным классом который управляет работой последовательного порта
и предоставляет следующие функциональные возможности:
- читать/писать данные
- конфигурировать порт:
  + любой скоростью обмена (в рамках разумного)
  + любым кол-вом бит данных (5-8)
  + любым типом паритета (None, Even, Add, Mark, Space),
  + любым кол-вом стоп-бит (1, 1.5, 2)
  + любым режимом контроля потоком (Off, Hardware, Software)
- получать состояние линий порта
- работать в буферизированном и небуферизированном режиме

Т.к. класс AbstractSerial унаследован от QIODevice, то он предоставляет все методы и сигналы от QIODevice,
а также дополнительные специфические методы и сигналы.

Поддерживается в ОС: GNU/Linux, MS Windows, MacOSX и др. POSIX совместимых.

Класс SerialDeviceEnumerator
Является вспомогательным классом, который предоставляет
следующие функциональные возможности:
- получать список имен всех имеющихся последовательных портов в системе
- получать определенную информацию о выбраном порте по его имени
- автоматически уведомлять о новых появившихся портах или об их исчезновении

Поддерживается в ОС: GNU/Linux, MS Windows, MacOSX (кроме уведомления).

----
PS: Разработка этой ветки приостановлена и будет оказываться только её поддержка.



Содержимое QSerialDevice ветки 2.0

Эта версия является (планировалась) "как-бы" более продвинутой,
оптимизированной на быстродействие (золотая середина).
Но, главной особенностью - является структура классов, более "заточенная" к возможности
принятия в Qt.

Класс SerialPort
Выполняет функции аналогичные AbstractSerial из более ранней ветки,
но более облегчен и "вылизан".

Планируется поддержка в ОС: GNU/Linux, MS Windows, MacOSX и др.

Уже реализована базовая поддержка: GNU/Linux, MS Windows, MacOSX, WinCE, Symbian.
Но необходима помощь "симбианщиков" для доделки.


Класс SerialPortInfo
Выполняет функции аналогичные SerialDeviceEnumerator из более ранней ветки,
но также более облегчен и "вылизан" и имеет переработанную структуру (наподобие QPrinterInfo).

Планируется поддержка в ОС: GNU/Linux, MS Windows, MacOSX и др.

Уже реализована базовая поддержка: GNU/Linux, MS Windows, MacOSX, WinCE, Symbian.

----
PS: Разработка и поддержка этой ветки идет полным ходом.

Где скачать?

Текуций репозиторий с исходными кодами находится тут: https://gitorious.org/qserialdevice
Как скачать, думаю, разберетесь.

==========
Для всех заинтересованных лиц, готовых принять участие в разработке, тестировании, генерации новых идей - милости просим на обсуждение в эту тему форума.


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Май 17, 2009, 18:38
Цитировать
1. Асинхронный
2. Поддержка waitForReadyRead и т.п. и т.д.
можно по подробнее насчёт асинхронности? Как она реализована?


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 17, 2009, 18:46
2 lit-uriy,

ну, это, исходники гляньте :) , я сам не знаю как

т.е с помощью объектов ядра мы ловим события по приходу или уходу символов в буфер и потом читаем их и т.п и т.д. .. эмм..  примерно так :)
т.е по факту наличия в буфере байт!


//
Me:

http://enos.itcollege.ee/~aandreim/Diplom/loputoo-arendus.pdf

http://library.developer.nokia.com/index.jsp?topic=/S60_3rd_Edition_Cpp_Developers_Library/GUID-35228542-8C95-4849-A73F-2B4F082F0C44/html/SDL_93/doc_source/reference/reference-cpp/C32/RCommServClass.html

http://www.koders.com/cpp/fid6E732C74FA1BA3E40D2A20EC9006D75DB6B3AA10.aspx?s=sort


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Май 18, 2009, 00:06
>>объектов ядра мы ловим события по приходу или уходу символов в буфер
ну вот в виндовозе у последовательного порта есть события и на них можно подписаться.
А в *nix-системах, я никгда не слышал про подобное.
И склонен считать, что в QextSerialPort соответствующей функциональности нет именно по этой причине.
В исходниках "qextserialport-1.1" есть кусок кода для виндовоза для работы в асинхронном режиме и он полностью закоментирован, видимо из-за отсутствия аналогичного для *nix'ов


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 18, 2009, 07:21
Цитировать
ну вот в виндовозе у последовательного порта есть события и на них можно подписаться.
А в *nix-системах, я никгда не слышал про подобное.

все там есть :) .. там все на вызов Select завязано.. да гляньте ж исходники в конце то концов (мои) !!! :)  


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 18, 2009, 07:31
ЗЫ:

я уже в "промышленных масштабах АСУТП" применял асинхронный режим под Windows и Linux, правда не используя QT. А теперь вот с QT вышел УПС! :)


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 18, 2009, 07:42
т.е алгоритм такой (что в виндах что в никсах):

1) Если хотим прочитать из порта 100 байт то:
1. Делаем waitForReadyRead и в качестве таймаута ставим время в течении которого будем ожидать прихода данных в Rx буфер порта!
2. Если время истекло - то п.1 вернет false
3. Если все нормуль (т.е пришел хотябы 1 байт) - то true
4. Теперь проверяем сколько пришло в буфер байт bytesAvaiable (эта в-я вызывается внутри readData)
5. Читаем эти байты и делаем инкремент счетчика: retVal+=bytesRead.
6. Делаем  waitForReadyRead и в качестве таймаута ставим время ожидания следующего СИМВОЛА!.
7. Если время истекло - то значит что посылка закончилась и можем возвратить прочитанные байты
8. Если опять пришли данные то см. п. 4 и так до того времени пока не прочитаем все 100 Байт из буфера

Теперь:
1. Если нужно прочитать 100 байт, а пришло в конце концов 200 - то прочитается 100 байт
2. Если нужно прочитать 100 байт а пришло в конце концов 50 - то прочитается 50

Вот примерно такая идея


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 18, 2009, 11:23
Попробуйте кто нить для эксперимента создайте класс наследник от QIODevice, переопределите bytesAvaiable примерно так:
Код:
...
...
qint64 TMyDevice::bytesAvailable () const
{
   qint64 mybav =0;
   qint64  bav = QIODevice::bytesAvailable () ;
   cout << "mybav = " << mybav << "| bav =  " << bav << endl;
   return mybav + bav ;

}
...
...
потом выполните в ф-ции main:
Код:
...
qint64 MyDevice.open();
qint64 rbav= MyDevice.bytesAvailable ();
cout<<" rbav = " << rbav << endl;
MyDevice.close();
...

и скажите, какое значение в выводе у гого переменых : mybav, bav, rbav !



Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 19, 2009, 11:46
Ничего не понимаю! :(

Сам сделал как тут постом выше написал - вывод mybav , bav , rbav нули везде (пробовал под QT4.3.4 под x86_64 ArchLinux) ,
но когда собираю библиотеку QSerialDevice и примеры к ней - то QIODevice::bytesAvailable () возвращает значение = 16384  !!!

Я уже не знаю в чем дело! :(


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: Racheengel от Май 19, 2009, 17:01
делали тоже подобную штуку, если интересно, сырцы тут:
http://ii-system.com/soft/devzone/serialport.2007.09.16.zip


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 19, 2009, 17:30
посмотрел, но там не то немного.. там все-равно на базе QextSerialPort сделано .. 
но спасибо ! :)


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 19, 2009, 18:47
Вроде нашел где "баг" наблюдается.... В общем если вызвать MyDevice->bytesAvaiable() - то функция возвращает правильное количество байт в входном буфере, НО если вызвать ее изнутри класса QSerialDevce , вот так - то возвращает те-же 16384 бйит!!! :
Код:
qint64 TPosixSerialDevice::readData(char * data, qint64 maxSize)
{
    int bytesRead=0;//кол-во реально прочитанных байт за один проход
    int retVal=0;//кол-во реально прочитанных байт за все проходы
    int bav=0;//количество байт готовых бля чтения, которые находятся в текущий момент в приемном буфере последовательного устройства
    do {
        if (maxSize>retVal) {
            bav=bytesAvailable(); // ВОТ ТУТ ОНА НЕПРАВИЛЬНО ВОЗВРАЩАЕТ ЗНАЧЕНИЕ = 16384 !!! о_О
            if (bav>0) {
                if ((maxSize-retVal)<=bav) {
                    bav=maxSize-retVal;
                }
bytesRead = ::read(fd, (void*)(data+retVal), bav);
                if  (bytesRead==-1) {
                TTY_PORTABILITY_DEBUG("TPosixSerialDevice::readData->bytesRead==-1! Error!");
                    return -1;
                }//if read == -1
                else {
                    if (bytesRead==bav) {
                        retVal+=bytesRead;//with OK
                    }//if bytesRead==bav
                    else {
                        TTY_PORTABILITY_DEBUG("TPosixSerialDevice::readData->(bytesRead!=bav) with OK! Error!");
                        return -1;
                    }//else bytesRead!=bav
                }//else read
            }//if bav>0
            else {
                TTY_PORTABILITY_DEBUG("TPosixSerialDevice::readData-> (bav<=0)! Error!");
                return -1;
            }//else bav<=0
        }//if maxSize>retVal
        else {
            return retVal;
        }
    } while (waitForReadyRead(parameters->charIntervalTimeout));//ожидаем прихода в приемный буфер устройства следующего символа
    return retVal;
}


Я не знаю в чем причина такого поведения! Подскажите кто нибудь!! МОжет нужно как-то по особенному переопределять виртуальные функции ??


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Май 25, 2009, 22:09
Все, разобрался где касяк! В общем в Qt 4.3.4 в файле qiodevice.cpp есть такое:
Код:
...
static const qint64 QIODEVICE_BUFFERSIZE = 16384;
...
...
qint64 QIODevice::read(char *data, qint64 maxSize)
{
...
...
     qint64 readSoFar = 0;
    bool moreToRead = true;
    do {
        int lastReadChunkSize = 0;

        // Try reading from the buffer.
        if (!d->buffer.isEmpty()) {
            lastReadChunkSize = d->buffer.read(data + readSoFar, maxSize - readSoFar);
            readSoFar += lastReadChunkSize;
            if (!sequential)
                d->pos += lastReadChunkSize;
#if defined QIODEVICE_DEBUG
            printf("%p \treading %d bytes from buffer into position %d\n", this, lastReadChunkSize,
                   int(readSoFar) - lastReadChunkSize);
#endif
        } else if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE) { // <<<<<<<< ========= ВОТ ИЗЗА ЭТОГО ЕСТЬ НЕПОНЯТКА!!!
            // In buffered mode, we try to fill up the QIODevice buffer before
            // we do anything else.
            int bytesToBuffer = qMax(maxSize - readSoFar, QIODEVICE_BUFFERSIZE);
            char *writePointer = d->buffer.reserve(bytesToBuffer);
...
...
}

при том в Qt 4.1. вообще другое содержимое у qiodevice.cpp

мне только вот непонятно зачем вообще нужно это:
Код:
...
else if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE)
...

Братцы! Выручайте! Скиньте кто-нить файл qiodevice.cpp от Qt 4.5 и выше! Оч нужно! :)

 


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: pastor от Май 25, 2009, 22:25
Братцы! Выручайте! Скиньте кто-нить файл qiodevice.cpp от Qt 4.5 и выше! Оч нужно! :)

Лови. Qt 4.5.1


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Май 26, 2009, 02:58
kuzulis, Вот тебе все файлы ветки 4.5, самый свежак: http://qt.gitorious.org/qt/qt/trees/4.5
Вот сам файл: http://qt.gitorious.org/qt/qt/blobs/4.5/src/corelib/io/qiodevice.cpp
(в низу страницы есть ссылка Raw blob data, чтобы скачать сам файл)


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июнь 01, 2009, 08:09
Всё, парни, спасибо! Вроде разобрался!


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Июнь 01, 2009, 09:32
тоды выкладывай новый релиз :)


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июнь 02, 2009, 12:01
Вот прицепил последнюю версию...

И в этой связи у меня вопросы:
1. Посоветуйте, на какой ресурс в инете можно выложить библиотеку?
2. Как вообще это делается? (Я имею ввиду всякие там git, svn и т.п.)
3. Что лучше: git или svn
4. В общем интересует сам процесс как это делать :)


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Июнь 02, 2009, 12:39
начну с №3
SVN - централизованное хранилище, нет доступа к интернету - нет работы;
Git - децентрализованное, у каждого своё хранилище, с возможностью двустороннего обмена между разными хранилищами.

Если работаешь в Виндовозе, то для SVN'а есть замечательный клиент TortoiseSVN.
Для Git'а ничего подобного нет, одни фикалии. Примитивно можно работать с Git-Gui (входит в дистрибутив).

Для SVN'а я пользовался assemla.com
---
Где-то тут на форуме эта тема обсуждалась.


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Июнь 02, 2009, 12:45
Вот нашёл: Где лучше размещать свои SVN репозитории?  (http://www.prog.org.ru/topic_8687_0.html)
Я думаю админы простят если в ней вести обсуждение и о других Системах Управления Версиями, а заодно может и переименовать :/


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июнь 02, 2009, 14:27
2 lit-uriy ,

спасибо за ссылку.. я уже и забыл что там уже задавал этот же вопрос :)

вот хорошо было бы если б на www.prog.org.ru завели бы для QT-шных поделок нечто вроде svn и им подобным



Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июнь 02, 2009, 14:45
И еще интересует возможность , чтобы при скачивании из svn и т.п. последней копии проекта - можно было давать команды серверу делать снапшоты (архивы с копией) а потом уже этот архив качать.. а то как то накладно получается :(


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Июнь 02, 2009, 15:08
Мы с админом на crossplatform.ru озадачились вопросом создания svn'а.
Пока там размещено только хранилище команды Qt RTT (http://trac.crossplatform.ru/qtrtt).
Проблема в том, что дисковое пространство довольно быстро исчезает. По этому специализированные ресурсы имеют больше шансов предоставить бесплатно хостинг.


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: Tonal от Июнь 03, 2009, 08:03
Что-то по адресу, указанному в http://trac.crossplatform.ru/qtrtt/wiki/Subversion (http://svn2.assembla.com/svn/qtrtt) говорит path not found. :(


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: lit-uriy от Июнь 03, 2009, 08:53
2 Tonal, это не в эту тему надо рапортавать


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июнь 15, 2009, 07:27
Вложение


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июнь 24, 2009, 15:29
Добавляю последний на текущий момент вариант библиотеки . В аттаче.

Можно пользоваться уже ею и тестить её .. (тем кому надо)  :)

Из изменений:
1. Навел красивости
2. Добавил некоторые методы

В связи с этим:
1. Как изменить название темы?
2. Все касяки при работе с библой кидать в эту тему!

ЗЫ: в линуксе могут быть "косяки" со сборкой.. т.к. я успел собрать только под виндоус.. и домой еще не дошел (а дома линукс) :)



Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июль 02, 2009, 07:28
Вот еще "окончательная" версия на 01.07.2009г

исправил некоторые ошибки.


Название: Re: Создаю библиотеку для работы с последовательными портами. Проблемы.
Отправлено: kuzulis от Июль 10, 2009, 09:09
итоговый результат выложил тут : http://fireforge.net/projects/qserialdevice/


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: Rcus от Июль 23, 2009, 16:23
Хм, что-то и QextSerialPort, и эта библиотека незаслуженно обходят темы девятибитного режима. Чувствую понапишу я своих велосипедов с квадратными колесами.


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Июль 24, 2009, 07:45
Цитировать
Хм, что-то и QextSerialPort, и эта библиотека незаслуженно обходят темы девятибитного режима. Чувствую понапишу я своих велосипедов с квадратными колесами.

это что за режим такой? ссылку в студию!


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: Rcus от Июль 24, 2009, 08:35
en.wikipedia.org search:Serial port

У меня вот есть девайс с которым нужно общаться по протоколу 9N1 (девять бит данных -- без контрольного бита (parity) -- один стоповый).
Кстати почитал я исходники немного... включать windows.h в заголовки это жестоко.
А еще надо было не слепо копировать реализацию для posix, а хотя бы почитать /usr/include/bits/termios.h (это я к предупреждениям по поводу непереносимости mark/space parity). Я конечно тоже не сразу прочитал его, сначала рыл статьи, потом дошел до исходников вайна :) а потом только вернулся.


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Июль 24, 2009, 09:10
вот нашел по этому поводу кое что http://www.lothosoft.ch/thomas/libmip/markspaceparity.php

добавлю для *.nix эту фичу :)

только все-же непонятно как из 8M2 или 8S2 получить 9N1 ... т.к. байт максимум составляет 8 бит.. и ф-я read хз что вернет.. но тож попробую

хотя под 9N1 скорее подразумевается 8M1 или 8S1 .. т.к. девайсы на микроконтроллерах и т.п. это используют.. но редко.. там 9-й бит программируемый

Цитировать
Кстати почитал я исходники немного... включать windows.h в заголовки это жестоко.
что имеется ввиду?


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: Rcus от Июль 24, 2009, 09:37
1. У меня есть legacy исходники, где 9N1 эмулируется через переключение 8M1/8S1 и обработкой ошибки parity (ага, wtf, но обычно эти девайсы не с компьютерами общаются, а между собой)
2. включение windows.h в файл winserialdevice.h вываливает дофига символов в глобальное пространство имен. Я бы вообще сделал это Qt-way - перенести все платформозависимые функции и данные в приватный класс, определять его отдельно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Июль 24, 2009, 09:41
Цитировать
1. У меня есть legacy исходники, где 9N1 эмулируется через переключение 8M1/8S1 и обработкой ошибки parity (ага, wtf, но обычно эти девайсы не с компьютерами общаются, а между собой)
скиньте ка на мыло исходнички то :)
Цитировать
включение windows.h в файл winserialdevice.h вываливает дофига символов в глобальное пространство имен. Я бы вообще сделал это Qt-way - перенести все платформозависимые функции и данные в приватный класс, определять его отдельно.
аха.. попробуем..


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: lit-uriy от Июль 24, 2009, 10:39
>>скиньте ка на мыло исходнички то
А губа-ТО у тебя не дура :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Июль 24, 2009, 10:49
Цитировать
А губа-ТО у тебя не дура Улыбающийся
а шо такого то? :)
шо так шо так я всё-равно докопаюсь до истины.. просто будет быстрее.. и всё

и еще, я так понял, что этот режим можно врубить только на передачу.. на прием думаю не получится..  хотя...


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: Rcus от Июль 24, 2009, 11:14
Думаю все же не место девятибитному режиму в библиотеке, ибо такие символы не укладываются в интерфейс QIODevice. Лучше потратить время на допиливание более общих вещей.


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Июль 24, 2009, 11:54
Цитировать
Лучше потратить время на допиливание более общих вещей.
например?


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: Rcus от Июль 24, 2009, 12:05
Например допилить определение портов (в qextserialport 1.2 alpha есть реализация для windows, правда со своими тараканами), в том числе при добавлении/удалении.


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Июль 24, 2009, 12:23
Цитировать
Например допилить определение портов (в qextserialport 1.2 alpha есть реализация для windows, правда со своими тараканами), в том числе при добавлении/удалении.
а в QSerialDevice разве не работает этот метод?


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Август 17, 2009, 19:51
Я решил переделать библиотеку так, чтобы она "соответствовала" идеологии QT4.
За основу взял реализацию QAbstractSocket и т.п. . Решил пока что начать реализацию библиотеки "чисто" для Unix. (хотя и для Windows есть куски)

Реализовал "с горем пополам" это:
abstractserialengine.cpp
nativeserialengine.cpp
nativeserialengine_unix.cpp
nativeserialengine_win.cpp
abstractserialengine_p.h
nativeserialengine_p.h
datatypes.h
(архив прилагается)

Но застопорился на реализации :
abstractserial_p.h
abstractserial.h
abstractserial.cpp
(назвал по аналогии с сокетами)

Как видно, я старался придерживаться структуры файлов такой же как и в реализации сокетов

Стопор у меня в том, что у меня нет сил больше разбираться в исходниках сокетов, т.к. тролли нагородили и навертели  там так, что я не могу отсеять уже лишнее и добавить то что нужно..

Меня интересуют следующие вопросы:
1. Зачем они  и в qabstractsocketengine_p.h и в qabstractsocket_p.h два раза определяют одни и теже переменные:
Код:
..
    QString hostName;
    quint16 port;
    QHostAddress host;
    QList<QHostAddress> addresses;

    quint16 localPort;
    quint16 peerPort;
    QHostAddress localAddress;
    QHostAddress peerAddress;
    QString peerName;
..
??

2. Для чего используется метод :    static QAbstractSocketEngine *createSocketEngine(int socketDescripter, QObject *parent); ?
Он меня вводит в ступор ...

И вообще, чо-то я в себе разочаровался :(

Не знаю как разгрести всё это. :(

Помогите хто нить в чем нить! На путь истинный наставте!

ЗЫ: решил занятся переделкой для того чтобы иметь возможность получения сигналов readyRead из евент лоопа. Но т.к. то что мне советовали на этом форуме в части использования нотификаторов - это мне показалось слишком простым, т.к. нужно еще и блокировать сообщения при вызове waitForReadyRead и т.п. В общем хотел сделать "все правильно" :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: Rcus от Август 17, 2009, 21:26
Не надо было копировать архитектуру сокетов Qt. Там такое разделение необходимо для прозрачной поддержки прокси соединений. Для последовательного порта прокси не бывает и не нужно усложнять структуру на ровном месте. Завтра посмотрю, может чего придумаю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Август 18, 2009, 07:17
:) оч жду! У меня "затык" в правильном применении нотификаторов в основном...  не знаю как подступится.

я тут подумал, а что если при вызове waitForReadyRead блокировать сигнал readyRead из петли сообщений путем времменного отключения нотификатора:
(используя void QSocketNotifier::setEnabled ( bool enable )   [slot] )
Код:
bool waitForReadyRead ( int msecs )
{
    readNotifier->setEnabled (false);
    /*
        тут выполняем действия
    */
    readNotifier->setEnabled (true);
}
но тут опять чо-то не так...


Название: Re: Создаю библиотеку для работы с последовательными портами. [РЕШЕНО].
Отправлено: kuzulis от Август 26, 2009, 18:54
Я тут вроде как реализовал практически все что хотел ... и как хоьел, НО что-то не собирается проект, пишет:
Цитировать
[den@myhost src]$ make
g++ -c -pipe -march=x86-64 -mtune=generic -O2 -pipe -fPIC -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include -Ibuild/moc -I. -o build/obj/abstractserial.o abstractserial.cpp
g++ -c -pipe -march=x86-64 -mtune=generic -O2 -pipe -fPIC -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include -Ibuild/moc -I. -o build/obj/abstractserialengine.o abstractserialengine.cpp
g++ -c -pipe -march=x86-64 -mtune=generic -O2 -pipe -fPIC -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include -Ibuild/moc -I. -o build/obj/nativeserialengine.o nativeserialengine.cpp
nativeserialengine.cpp: In constructor ‘NativeSerialEngine::NativeSerialEngine(QObject*)’:
nativeserialengine.cpp:13: ошибка: нет подходящей функции для вызова ‘AbstractSerialEngine::AbstractSerialEngine(NativeSerialEnginePrivate&, QObject*&)’
abstractserialengine.h:13: замечание: претенденты: AbstractSerialEngine::AbstractSerialEngine(QObject*)
abstractserialengine.h:10: замечание:              AbstractSerialEngine::AbstractSerialEngine(const AbstractSerialEngine&)
make: *** [build/obj/nativeserialengine.o] Ошибка 1
[den@myhost src]$  
Что компилятору не нравится? Я уже с этим измучился весь :( Подскажите, что не так?

И еще принимаю советы :)

ЗЫ: архив прилагается


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Rcus от Август 26, 2009, 19:02
Эм, говорит что подходящего конструктора нет, а его и правда нет :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 26, 2009, 19:15
как нет? а  это:
Код:
AbstractSerialEngine::AbstractSerialEngine(QObject *parent)
: QObject(parent), d_ptr(new AbstractSerialEnginePrivate)
{
}



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Rcus от Август 26, 2009, 19:21
Цитировать
nativeserialengine.cpp:13: ошибка: нет подходящей функции для вызова ‘AbstractSerialEngine::AbstractSerialEngine(NativeSerialEnginePrivate&, QObject*&)
Так прочитайте внимательней. В nativeserialengine.cpp:13 вы вызываете конструктор с двумя параметрами, а в AbstractSerialEngine только один конструктор и тот с одним параметром.

Эх, чувствую буду завтра оборачивать boost::asio::serial_port в cute интерфейс :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 26, 2009, 19:32
все равно не понимаю:
Код:
AbstractSerialEngine::AbstractSerialEngine(QObject *parent)
: QObject(parent), d_ptr(new AbstractSerialEnginePrivate)
{
}

NativeSerialEngine::NativeSerialEngine(QObject *parent)
: AbstractSerialEngine(*new NativeSerialEnginePrivate(), parent)
{
}

вот напримет в примере из сайта КДЕ так было:
Код:
/*** KFooBase ***/
KFooBase::KFooBase(QObject *parent)
    : QObject(parent), d_ptr(new KFooBasePrivate)
{
}
 
/*** KFooDerived ***/
KFooDerived::KFooDerived(QObject *parent)
    : KFooBase(*new KFooDerivedPrivate, parent)
{
}

у меня ничем не отличается от примера (в принципе), тем более, что если следовать примеру и сделать простенькие тестовые классы - то они собираются  нормально, а мой проект не хочет! Я не пойму..


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Rcus от Август 26, 2009, 19:39
Код
C++ (Qt)
while (!isEnlightened()) {
 read(http://techbase.kde.org/Policies/Library_Code_Policy/Shared_D-Pointer_Example);
}
Простите, я не верю в подобную невнимательность. В примере для KFooBase определяются два конструктора.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 26, 2009, 19:46
так Вы ж говорили (или не вы) - что конструктор из секции protected можно не писать :)
я и не писал


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Rcus от Август 26, 2009, 19:49
d'oh если мой русский настолько запутан, то, чувствую мой код невозможно читать /* и некому, но это уже факт :( */


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 31, 2009, 21:18
Итак, вроде-бы готова (я её добил) тестовая версия библиотеки для Windows!!! :)

При её тестировании необходимо иметь из девайсов:
1. Если нет в компе СОМ портов - то нужен конвертер USB<->RS-232
2. Нужен "кросс" кабель у которого контакты так должны быть (по минимуму):
   Разъем №1   Разъем №2
        2                  3
        3                  2
        5                  5
(если не ошибаюсь)

Также для тестирования можно пользоваться тестовыми утилитками : /examples/writer   /examples/reader (или /examples/sreader)

утилитка /examples/sreader использует цикл сообщений (т.е. сигналы) :)

Что реализовано:
1. Теперь РЕАЛЬНО поддерживается ЦИКЛ ОБРАБОТКИ СООБЩЕНИЙ!!! ( работает пока только для сигнала readyRead() )

Что непонятно еще:
1. Проверьте кто-нибудь, правильно ли емиттится сигнал readyRead при использовании /examples/sreader
Имею ввиду, что например при приеме пакета данных в порт - сигнал эмиттится несколько раз., причем количество емитов каждый раз разное. А как реально должно быть? Подскажите на примере сокетов плз.. как там с этим дело обстоит, чтобы я мог исправить если что...

Пример использования:
1. Запускаю /examples/writer
2. Указываю имя порта который нужно открыть на запись
3. Далее ввожу какое кол-во байт нужно отправить в порт
4. Жмакаю энтер и данные уходят!

5. Запускаю /examples/sreader
6. Открывается ПО УМОЛЧАНИЮ ПОРТ СОМ1 !!!! Внимание !! :)

7. Теперь соединаю шнурком оба порта
8. в /examples/writer жмакаю отправить 10 байт (к примеру)

9. утилита /examples/sreader реагирует и выдает сигналы readyRead!!! Но в моем случае количество этих сигналов варьируется. И я не знаю как ДОЛЖНО быть по НОРМАЛЬНОМУ!!! Подскажите плз!

Жду комментов :)

ЗЫ: еще пилить и пилить


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 07, 2009, 21:38
Здравствуйте! Очень интересна Ваша библиотека, подскажите пожалуйста начинающему как установить Parity и остальные параметры вручную ? т.е. есть Mydevice объект, как с помощью setParity установить парити в parity_even к  примеру ? Так же интересно как считывать данные из порта по сигналу readyRead()-набросайте пожалуйста маленький примерчик, если не сложно.(я так понимаю в слоте редирид нужно запрашивать bytesAvailable и потом вызывать read с размером полученным из bytesAvailable так ? ) Как вообще можно считывать все данные находящиеся в буфере порта при каждом вызове readyRead ?
Заранее спасибо!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 07, 2009, 22:41
Цитировать
Очень интересна Ваша библиотека, подскажите пожалуйста начинающему как установить Parity и остальные параметры вручную ?
1. Необходимо сначала устройство открыть (оно откроется с параметрами 9600 8N1 по умолчанию) Так задумано :)
Код:
...
MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
...
2. Потом установить паритет (к примеру even)
Код:
...
MyDevice->setParity(AbstractSerial::ParityEven);
...

Цитировать
Так же интересно как считывать данные из порта по сигналу readyRead()-набросайте пожалуйста маленький примерчик, если не сложно.

Примерчик
Код:
class Reader : public QObject
{
Q_OBJECT

public:
Reader(QObject *parent = 0) {
MyDevice = new AbstractSerial();
connect(MyDevice, SIGNAL(readyRead()), this, SLOT(slotReadData()));
if (!MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered)) {
qDebug() << "Open fail";
return;
}
                if (!MyDevice->setParity(AbstractSerial::ParityEven)) {
qDebug() << "Set parity fail";
return;
                }

qDebug() << "= Parameters =";
qDebug() << "Device name            : " << MyDevice->deviceName();
qDebug() << "Baud rate              : " << MyDevice->baudRate();
qDebug() << "Data bits              : " << MyDevice->dataBits();
qDebug() << "Parity                 : " << MyDevice->parity();
qDebug() << "Stop bits              : " << MyDevice->stopBits();
qDebug() << "Flow                   : " << MyDevice->flowControl();
qDebug() << "Char timeout, msec     : " << MyDevice->charIntervalTimeout();
}
~Reader() {
MyDevice->close();
delete MyDevice;
MyDevice = 0;
}
private slots:
void slotReadData() {
                QByteArray ba = MyDevice->read(10);
                qDebug() << "Readed " << ba.size() << "bytes";
        }
private:
AbstractSerial *MyDevice;
};
вот как то так. (в теории должно работать)

Цитировать
(я так понимаю в слоте редирид нужно запрашивать bytesAvailable и потом вызывать read с размером полученным из bytesAvailable так ? )
нет, в данной библиотеке не нужно! Идея в том, функция readData реализована таким образом, что она сама все вычитает что нужно (т.е внутри неё уже все реализовано)
т.е сам процесс чтения зависит от того что вам нужно... к примеру у Вас имеется некий протокол обмена через RS-232/485/422 (а может и не имеется - не важно),
и Вы точно знаете , что Вам в порт должен придти пакет размером ну скажем 250 байт - тогда по сигналу readyRead() Вы просто читаете все 250 байт...
если же вы не знаете сколько вам байт должно придти - то читаете или по одному или еще как нибудь - не важно :)
главное выставить правильно параметр charIntervalTimeout (опытным путем - но вообще он зависит от скорости)

Хотя, если обрисуете ситуацию, что вы хотите - то я более точнее отвечу...

Цитировать
Как вообще можно считывать все данные находящиеся в буфере порта при каждом вызове readyRead ?
ну вызывать метод read()  по сигналу readyRead().
суть здесь такова, что :
1. сигнал будет излучаться один раз при приходе первого байта и молчать при приходе остальных
2. если пришли  например в буфер 100 байт , мы вызвали метод чтения и прочитали 90 байт (осталось 10) - то сигнал вызовется еще раз, т.к. в порту еще есть 10 байт..
в общем вот такая вкратце логика работы

Я сейчас допиливаю "новую " версию библиотеки, я ее прикрепил в аттач... она вро-де как уже удовлетворительно работает и под *.nix и windows, осталось кое что подправить и т.п.  Возьмите её, желательно, т.к. она самая свежая на сегодня :)

ЗЫ: хотя нужно тестить.. времени нету.. и кстати, потестите заодно :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 07, 2009, 23:07
Вообщем описание моей проблемы- есть устройство которое общается с машиной по шине ibus, параметры - 9600, 8 бит данных, parity even, 1 stop bit.
Все устройства машины постоянно читают\пишут в нее...мне нужно соответственно отслеживать некоторые сообщения и посылать ответы на них. Пробовал использовать qt_comport который является дополнением проекта qext... в результате столкнулся с проблемой-бесследно пропадает часть информации и из-за этого часть выжных команд не обрабатывается...даже примерно не могу предположить в чем может быть проблема. Поэтому решил попробовать Вашу библиотеку.
Не могли бы Вы более подробно рассказать про charIntervalTimeout  ? Что это и для чего...
Так же интересно про ready read- Вы написали
Цитировать
если же вы не знаете сколько вам байт должно придти - то читаете или по одному или еще как нибудь
- как можно прочитать всю информацию находящуюся в данный момент в буфере ? Попробую завтра новую версию (впринципе если будет так же информация пропадать-это будет сразу видно)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Сентябрь 07, 2009, 23:49
>>даже примерно не могу предположить в чем может быть проблема.
Скорее всего из-за неакуратной работы с данными типа QByteArray, большенство функций считает, что код 0x00 - конец данных (нуль-терминированная строка)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 07, 2009, 23:53
В qt_comport все данные как массив char передаются, QByteArray вообще не используется.
Вот кусок кода - это происходит с данными сразу после получения:

Код
C++ (Qt)
QString MainWindow::transformInpData(const unsigned char *data, int size)
{
const QString tab = "  ";
QString res;
for (int i = 0;i < size;i++)
res = res+QString("%1").arg((int)data[i],0,16)+tab;
return res;
}
Код нужен для перевода данных в hex формат.

Кстати забыл добавить...данные пропадают не всегда т.е. к примеру получаем две команды какие-либо...потом еще кучу команд...и потом опять такие же как первые 2 должны быть....первый раз я вижу первые 2 команды..а в конце их нет, то что они были посланы это 100% - другой программой я могу увидеть их...не видно только из программы написаной на qt.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 08, 2009, 00:41
Цитировать
Вообщем описание моей проблемы- есть устройство которое общается с машиной по шине ibus, параметры - 9600, 8 бит данных, parity even, 1 stop bit.
Все устройства машины постоянно читают\пишут в нее...мне нужно соответственно отслеживать некоторые сообщения и посылать ответы на них.

ну так наверное используется же какой-то протокол обмена... т.е в заголовке запроса/ответа в принципе должна содержаться информация о длине пакета (хотя хз - я с ibus не знаком). тут Вам виднее.

Цитировать
Не могли бы Вы более подробно рассказать про charIntervalTimeout  ? Что это и для чего...
тут это "хитрый ход", суть которого в том что после например отлова сигнала readyRead() и вызове метода read(10) происходит в методе следующий алгоритм:
1. делается bytesAvailable
2. если есть байты готовые для чтения - то читается их количество, которое в данный момент есть в приемном буфере
3. это прочитанное кол-во байт сравнивается с изначально запрошенным
4. если равно - то метод возвращает массив и т.п.
5. если прочитали меньше чем запросили - то ожидаем в течении времени charIntervalTimeout следующих символов
6. при истечении времени - возвращает прочитанные до этого байты
7. если время еще не истекло и пришли байты - то переходим к п. 1

Нюанс работы с портом у этой библиотеки в том - что он открывается с асинхронными параметрами - таким образом - что операции чтения возвращаются немедленно!!! Этим мы облегчаем нам жизнь, т.к. отпадает необходимость в настройке множителей, времени ожидания окончания посылки и т.п... , а используем только лишь один "исскуственный" параметр charIntervalTimeout ! (т.к. так проще и меньше "геммороя" при расчете всех этих таймаутов, тем более, что они толком то и не работают реально) - а так - убиваем сразу всех зайцев. При этом - параметр charIntervalTimeout  - НЕ является параметром из COMMTIMEOUTS (win) или termios (*.nix)!!!

Цитировать
как можно прочитать всю информацию находящуюся в данный момент в буфере ?

чтобы прочитать именно ВСЁ то, что в ДАННЫЙ/ТЕКУЩИЙ момент находится в буфере - необходимо сначала вызвать bav = bytesAvailable, а потом уже read(bav)  :)

но опять же не факт, что прочитается всё из буфера, т.к. в интервале времени после вызова bytesAvailable,  и до вызова read - в буфер могут придти еще данные - и получится, что вычитается только то что ранее пришло







Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 08, 2009, 18:35
Проверил сегодня последнюю версию-по порядку о проблемах:
1) В примере sreader Вы забыли поправить pro файл- пути старые, в результате пример не комплится без их правки вручную.
2) Пример reader работает, но через скаждую строчку ругается на
Цитировать
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258
3) Написал маленькую тестовую програмку для проверки редирид-
.h Файл:
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtGui>
#include <QtCore>
#include <abstractserial.h>
#include "ui_mainwindow.h"
#include <iostream>
 
namespace Ui
{
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   AbstractSerial *MyDevice;
   QTextEdit *log;
 
private slots:
   void readmsg();
};
 
#endif // MAINWINDOW_H
.cpp файл:
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <QtDebug>
 
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   log = new QTextEdit(this);
   log->setReadOnly(true);
   log->setGeometry(10,10,800,500);
   log->setStyleSheet( "font-size: 12px;" );
   log->show();
       MyDevice = new AbstractSerial();
               connect(MyDevice, SIGNAL(readyRead()), this, SLOT(readmsg()));
                   MyDevice->setDeviceName("com4");
 
if (!MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered)) {
                       qDebug() << "Open fail";
                       return;
               }
if (!MyDevice->setParity(AbstractSerial::ParityEven)) {
                       qDebug() << "Set parity fail";
                       return;
               }
               qDebug() << "= Defaults parameters =";
               qDebug() << "Device name            : " << MyDevice->deviceName();
               qDebug() << "Baud rate              : " << MyDevice->baudRate();
               qDebug() << "Data bits              : " << MyDevice->dataBits();
               qDebug() << "Parity                 : " << MyDevice->parity();
               qDebug() << "Stop bits              : " << MyDevice->stopBits();
               qDebug() << "Flow                   : " << MyDevice->flowControl();
               qDebug() << "Char timeout, msec     : " << MyDevice->charIntervalTimeout();
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::readmsg() {
   qDebug() << "test1";
   QString test;
QByteArray ba = MyDevice->read(10);
 
               qDebug() << "Readed: " << test;
               log->append("test");
}
Вывод:
Цитировать
Запускается E:\QSerialDevice_07092009_bugs_version_23001\examples\creader\debug\creader.exe...
Windows: NativeSerialEnginePrivate::nativeOpen->Trying to open device:  "com4"
Windows: NativeSerialEnginePrivate::nativeOpen->Opened device succesfully. Ok!
= Defaults parameters =
Device name            :  "com4"
Baud rate              :  "9600 baud"
Data bits              :  "8 bit"
Parity                 :  "Even"
Stop bits              :  "1"
Flow                   :  "Disable"
Char timeout, msec     :  50
test1
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning!
Readed:  ""

Программа была запущена примерно 30 сек...после первого редирида больше ничего не делала...хотя данные идут по 2-5 сообщений в секунду.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 09, 2009, 09:17
Цитировать
1) В примере sreader Вы забыли поправить pro файл- пути старые, в результате пример не комплится без их правки вручную.
ну эт ладно

Цитировать
2) Пример reader работает, но через скаждую строчку ругается на
Цитировать
 Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258
это не ошибка, так задумано... просто отключите вывод в консоль всего этого

Цитировать
Программа была запущена примерно 30 сек...после первого редирида больше ничего не делала...хотя данные идут по 2-5 сообщений в секунду
в файле abstractserial.cpp нужно поменять одну строчку в методе readData : d->emittedReadyRead = false;
Код:
qint64 AbstractSerial::readData(char *data, qint64 maxSize)
{
Q_D(AbstractSerial);

qint64 ret = d->serialEngine->read(data, maxSize);
if (ret < 0)
emitStatusString(EReadDataIO);
d->emittedReadyRead = false;
return ret;
}



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 09, 2009, 16:02
В общем вроде всё подправил, должно работать...

В аттаче архив прицепил :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 09, 2009, 20:30
Обнаружились досадные баги:
1. В Linux - неправильно отрабатывает вызов ::select в методе
Код:
int NativeSerialEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
bool *selectForRead, bool *selectForWrite)
{
...
int ret = ::select(fd + 1, &fdread, &fdwrite, 0, timeout < 0 ? 0 : &tv);
...
}
см. файл nativeserialengine_unix.cpp

Неправильность заключается в том, что select почему-то всегда возвращает 1 !!! Хотя не должен этого делать.
Касяк заключается в присутствии &fdwrite, т.е. если это убрать и написать так:
Код:
int ret = ::select(fd + 1, &fdread, 0, 0, timeout < 0 ? 0 : &tv);
то все правильно отрабатывает! Убирая &fdwrite я тем самым отключаю возможность нотификации записи в порт...

В дальнейшем думаю вообще убрать нотификатор writeNotifier, т.к в принципе он не нужен нигде.. Нужна только возможность нотификации чтения!!!

2. В Windows - не всегда полностью отрабатывает нотификатор для чтения байт, суть например такая:

- в аппликухе /sreader или /reader я устанавливаю к примеру читать 4096 байт!!!
- в аппликухе /writer я передаю 4097 !!! байт!!!
- аппликуха /sreader или /reader вычитывает только 4096 байт! , хотя после этого она должна прочитать еше 1 байт! :)

если же я /writer шлю 5000 байт - то аппликуха /sreader или /reader правильно их читает: сначала читает 4096 а потом 904 байта

я пока не разобрался в таком странном поведении

На текущий момент библа впринципе готова к употреблению, только нужно аккуратно следить за ней :)







Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Сентябрь 09, 2009, 21:29
Обнаружились досадные баги:
1. В Linux - неправильно отрабатывает вызов ::select в методе
Что значит баг? select работает точно согласно документации...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 09, 2009, 21:50
Цитировать
Что значит баг? select работает точно согласно документации...

ну потому, что пстоянно срабатывает select и возвращает 1 !!! ведь по идее , если я не писал в порт до этого, то не должно ничего срабатывать, а вызов select должен возвратить 0 (т.е. таимаут)

а так получается, что если я вызваю waitForReadyRead(1000) (ожидаем в течении 1 секунды) - то он вечно зацикливается от того, что waitForReadOrWrite никогда не возвратит 0!!! а всегда возвращает 1

Код:
int NativeSerialEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
bool *selectForRead, bool *selectForWrite) const
{
fd_set fdread;
FD_ZERO(&fdread);
if (checkRead)
FD_SET(fd, &fdread);

fd_set fdwrite;
FD_ZERO(&fdwrite);
if (checkWrite)
FD_SET(fd, &fdwrite);


struct timeval tv;
tv.tv_sec = timeout / 1000;
tv.tv_usec = (timeout % 1000) * 1000;

//int ret = ::select(fd + 1, &fdread, &fdwrite, 0, timeout < 0 ? 0 : &tv); // <- ЕСЛИ ТАК - ТО НЕ РАБОТАЕТ, А ВСЕГДА ВОЗВРАЩАЕТ 1
int ret = ::select(fd + 1, &fdread, 0, 0, timeout < 0 ? 0 : &tv); // <- ЕСЛИ ТАК -ТО РАБОТАЕТ, НО БЕЗ НОТИФИКАЦИИ ЗАПИСИ

if (ret <= 0)
return ret;

*selectForRead = FD_ISSET(fd, &fdread);
*selectForWrite = FD_ISSET(fd, &fdwrite);

return ret;
}

Код:
bool NativeSerialEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
bool checkRead, bool checkWrite,
int msecs, bool *timedOut) const
{
Q_D(const NativeSerialEngine);

int ret = d->nativeSelect(msecs, checkRead, checkWrite, readyToRead, readyToWrite);

if (ret == 0) {
if (timedOut)
*timedOut = true;
if (checkRead) {
//
}
if (checkWrite) {
//
}
return false;
}
return ret > 0;
}

Код:
bool AbstractSerial::waitForReadyRead(int msecs)
{
Q_D(AbstractSerial);

if (!isOpen()) {
emitStatusString(EDeviceIsNotOpen);
return false;
}

QTime stopWatch;
stopWatch.start();

d->stopSerialNotifiers();
forever {
bool readyToRead = false;
bool readyToWrite = false;
if (!d->serialEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, true,
qt_timeout_value(msecs, stopWatch.elapsed()))) {
emitStatusString(EWaitReadyReadTimeout);
d->startSerialNotifiers();
return false;
}
if (readyToRead) {
d->waitForReadyReadCalled = true;
if (d->canReadNotification()) {
d->startSerialNotifiers();
return true;
}
}
if (readyToWrite)
d->canWriteNotification();
}
}



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Сентябрь 09, 2009, 21:55
ну потому, что пстоянно срабатывает select и возвращает 1 !!! ведь по идее , если я не писал в порт до этого, то не должно ничего срабатывать, а вызов select должен возвратить 0 (т.е. таимаут)
Ты не правильно понимаешь. select возвращает количество установленных бит во всех (!) массивах.
Он тебе скорее всего сообщает что запись не приведет к блокировки.
Проверять результаты работы select нужно только по битовым массивам. Код возврата проверяется только на случай ошибки.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Denjs от Сентябрь 09, 2009, 22:10
Возможно будет автору в помощь:
смотреть OTPD (https://developer.berlios.de/projects/otpd/), класс
t_seriallink_otpd (каталог исходников OTPD/classes/hardware_comm)

кросс-платформенный класс, "тупо в лоб"  заточенный под свои нужды и нужды работы с чековым принтером.
Возможно будет полезен как источник идей для функций/интерфейсов, и как пример "компоненты транспортного уровня" -
там рядом t_tcpiplink_otpd лежит который полностью может заменить данный класс - у него полностью идентичный интерфейс - только строку параметров при запуске надо другую передать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 10, 2009, 10:00
Цитировать
Ты не правильно понимаешь. select возвращает количество установленных бит во всех (!) массивах.
Он тебе скорее всего сообщает что запись не приведет к блокировки.
Проверять результаты работы select нужно только по битовым массивам. Код возврата проверяется только на случай ошибки.

дык я эти методы полностью передрал из сокетов! Почему они там работают норматьно, а тут нет? Непонятно

в доке по селекту следующее:
Цитировать
writefds
 Этот набор мониторится на возможность записи данных в один или несколько дескрипторов. После возврата из select набор writefds будет очищен от всех дескрипторов, кроме тех, в которые можно немедленно записать данные функциями send() (для сокетов) или write() (для каналов pipe, файлов и сокетов).

т.е. получается что ничо непонятно... т.е. в моем случае срабатывает селект writefds, т.к. в порт уже можно записать данные и он свободен для записи... НО почему-то это не срабатывает в реализации QAbstractSocket... !?

2 Denjs, спасибо, а как там из CVS не качая исходники, просмотреть просто нужные файлы? А то у меня что-то не получилось :)
А то неохото качать ~1.5 Mb


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Сентябрь 10, 2009, 11:36
kuzulis, потому что в Qt вызов waitForReadOrWrite из функции waitForReadyRead происходит с отключенным флажком checkWrite, если d->writeBuffer.isEmpty().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 10, 2009, 11:40
Ну, да, я уже тож "догадался" об этом...

И все-таки вопрос к заинтересованным людям: убрать ли лучше мне в библиотеке нотификацию записи? т.к. в принципе судя по идеологии она не нужна тут вообще.

Я склоняюсь у "убиранию " лишнего.
Оставлю только испускание сигнала bytesWritten(nbytes)  и все...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 10, 2009, 18:31
Чуть-чуть потестил сегодня последний билд - нашел баг...Вы писали, что если после сигнана редирид считать не все из буфера (пришло 2 байта, я мы считываем 1 - read(1)) - после считывания редирид имитится еще раз....вообщем он не имитится...считываются только по 1 байту каждый раз когда приходит сообщение (оно больше 1 байта 100%) - что с остальными данным я не проверял..может они удаляются при чтении (это может объяснить почему после чтения не имитится редирид) либо они остаются в буфере-хз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Сентябрь 10, 2009, 18:55
Чуть-чуть потестил сегодня последний билд - нашел баг...Вы писали, что если после сигнана редирид считать не все из буфера (пришло 2 байта, я мы считываем 1 - read(1)) - после считывания редирид имитится еще раз....вообщем он не имитится...считываются только по 1 байту каждый раз когда приходит сообщение (оно больше 1 байта 100%) - что с отсальными данным и не проверял..может они удаляются при чтении 11 (это может объяснить почму после чтения не имитится редирид) либо они остаются в буфере-хз.
А под какой платформой тестил?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 10, 2009, 18:59
windows


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 11, 2009, 08:07
Цитировать
Чуть-чуть потестил сегодня последний билд - нашел баг...Вы писали, что если после сигнана редирид считать не все из буфера (пришло 2 байта, я мы считываем 1 - read(1)) - после считывания редирид имитится еще раз....вообщем он не имитится...считываются только по 1 байту каждый раз когда приходит сообщение (оно больше 1 байта 100%) - что с остальными данным я не проверял..может они удаляются при чтении (это может объяснить почему после чтения не имитится редирид) либо они остаются в буфере-хз.

в буфере байты остаются, т.к. если во второй раз опять в вашем случае послать например 1 байт - то считается 2 байта... т.е. это какой то касяк.. я пока не могу понять в чем дело.. Виндовс меня угнетает :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 11, 2009, 19:18
Вообщем потестил еще чуть-чуть...новости 2...
1) Если по ready read читать всю информацию из буфера то все ок...информация не теряется как в случае qt_comport!
2) несколько раз порт отваливался...в дебаге видел это:
Цитировать
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning!
Readed:  "C8037F01B5"
Readed:  "7F04BF024187"
Windows: NativeSerialEnginePrivate::nativeLineStatus->function ClearCommError(err =  4 )
QIODevice::read: Called with maxSize < 0
Readed:  ""

Readed находится в блоке вызываемом по сигналу из readyread, выводит прочитаные данные в HEX.


Далее вопрос- как отключить дебаг...моя прога и так дебага выводит по 5 страниц за несколько секунд....а тут еще  библиотека спамит....кстати таймауты это вообще нормально ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 12, 2009, 08:14
Цитировать
Далее вопрос- как отключить дебаг...моя прога и так дебага выводит по 5 страниц за несколько секунд....а тут еще  библиотека спамит...
закомментировать в *.cpp файлах строчки вида:
Код:
...
#define NATIVESERIALENGINE_WIN_DEBUG
...
и пересобрать библиотеку

Цитировать
кстати таймауты это вообще нормально ?
в смысле?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 12, 2009, 10:24
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning! - Эти таймауты.

Если закоментить строку #define NATIVESERIALENGINE_WIN_DEBUG
Вылазит 4 ошибки при компиляции.
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected `;' before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected `;' before '}' token


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 12, 2009, 15:45
Цитировать
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning! - Эти таймауты.
эти таймауты нужны:

1. При вызове метода waitForReadyRead(msecs) этим таймаутом будет параметр msecs, т.е. таймаут ожидания прихода данных (вообще)
2. При вызове метода read() - этим таймаутом будет величина charIntervalTimeout , т.е. таймаут ожидания прихода следующего символа

По истечении этих таймаутов будет в консоль сыпаться эти сообщения. Просто вырубить их и всё!
Значение 258 - это значение DWORD  WAIT_TIMEOUT

Цитировать
Если закоментить строку #define NATIVESERIALENGINE_WIN_DEBUG
Вылазит 4 ошибки при компиляции.
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected `;' before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected `;' before '}' token

Исправил + в аттач добавил последнюю "рабочую" версию.

Замечания:
1. В этой версии последний раз я тестировал ее под Windows , поэтому под *.nix могут вылезти какие нить неучтенные проблемы
2. При тестировании в виндах мне не удалось устранить баг, который заключается в том, что:
   если настроить программы reader или sreader на прием/чтение данных на дефолтных настройках размером ~ >500 байт (например 1000 байт) - и с помощью программки writer записывать в порт на 1 байт больше (т.е. например 1001) - то почему-то утилитки reader или sreader прочтут только 1000 байт, и метод waitForReadyRead (для reader) или сигнал (для sreader) не отработает!!! Такое впечатление, что винда не успевает мониторить события !

Чтобы прочитался этот оставшийся байт - нужно утилитой writer записать в порт еще несколько байт (минимум еще 1), и тогда утилиты reader или sreader прочтут все байты (т.е. в нашем случае прочтут 2 байта)

Такое поведение наблюдается при приеме сразу большого кол-ва байт (более 500) у меня по крайней мере.

Но если утилитой writer передать не на 1 , а на большее кол-во байт (например на 2) больше (т.е. 1002) - то утилиты reader или sreader прочитают сначала 1000 а потом 2 байта.. т.е. все как надо...

ЗЫ: замучался я с виндой... ужос...  был касяк с тем еще, что при получении реального кол-ва  байт в приемном буфере после отработки события, т.е. вызове ClearCommError - эта функция не обновляла в структуре COMSTAT  поле DWORD cbInQue - всегда получал я величину = 0 !! О_О ...
В общем с виндувсом одни проблемы :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 12, 2009, 22:39
Эт не винды проблемы а qt Имхо =)
Я тут недавно на одну странность наткнулся...
в .h файле объявляю:
struct messages {
          QString msg;
          int index;
        } message[4];
Так вот если после этого попытаться что-либо записать в message - прога тихо падает...типа сегфолта...но если в конце добавить строку объявления любой другой переменной (не структуры) то все ок-
struct messages {
          QString msg;
          int index;
        } message[4];
int sdfsdf;
Может я чего-то не понимаю.... ? Или лыжи действительно не едут...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 13, 2009, 12:37
Цитировать
Эт не винды проблемы а qt Имхо =)

Qt здесь ваапче ни при чем!!!

Цитировать
в .h файле объявляю:
struct messages {
          QString msg;
          int index;
        } message[4];
Так вот если после этого попытаться что-либо записать в message - прога тихо падает...типа сегфолта...но если в конце добавить строку объявления любой другой переменной (не структуры) то все ок-
struct messages {
          QString msg;
          int index;
        } message[4];
int sdfsdf;
Может я чего-то не понимаю.... ? Или лыжи действительно не едут...

Надо писать на С++ классы, а не структуры! И это не относитмя к теме топика :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 13, 2009, 14:14
Итак!!!

Вышеуказанная проблема с чтением в ОС Windows вроде побеждена! Для этого пришлось делать хитрый финт (лишние телодвижения с бубном :) )

Теперь при чтении вплоть до 4096 байт ниего не теряется! Проверено мною! Больше не проверял!

Осталось доделать и проверить еще:
1. В *.nix режимы маркер и пробел
2. Документацию до ума довести
3. Выложить на ресурс fireforge.net

Протестируйте плз! В аттач добавил!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Сентябрь 13, 2009, 14:55
3. Выложить на ресурс fireforge.net

Закинь и на http://qt-apps.org/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 15, 2009, 08:40
Итак, добавил новую версию библиотеки
сюда: http://fireforge.net/projects/qserialdevice/
и
сюда: http://qt-apps.org/content/show.php?content=112039

Номер версии поставил v 0.1.0



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Denjs от Сентябрь 15, 2009, 16:52
сюда: http://fireforge.net/projects/qserialdevice/
А почему не в разделе "Qt Components" ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 15, 2009, 17:55
хз, не обратил внимания


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 15, 2009, 21:46
Цитировать
Эт не винды проблемы а qt Имхо =)

Qt здесь ваапче ни при чем!!!

Цитировать
в .h файле объявляю:
struct messages {
          QString msg;
          int index;
        } message[4];
Так вот если после этого попытаться что-либо записать в message - прога тихо падает...типа сегфолта...но если в конце добавить строку объявления любой другой переменной (не структуры) то все ок-
struct messages {
          QString msg;
          int index;
        } message[4];
int sdfsdf;
Может я чего-то не понимаю.... ? Или лыжи действительно не едут...

Надо писать на С++ классы, а не структуры! И это не относитмя к теме топика :)
Извиняюсь за повторный отход от темы, не могли бы Вы написать пример...? Как заменить структуру на класс (причем некоторые структуры используются в QList объектах).

Так же есть вопрос про структуру qt- возможно ли без создания очереди типа fifo и отдельного потока для ее обработки задерживать отправку сообщений ? Т.е. к примеру у меня есть функция которая отправляет данные \либо слот, он принимает только 1 параметр типа QString (сами данные), но в моем случае отправлять их нужно только если с момента получения последнего сообщения прошло больше 11мс...если сделать отдельную нить то это можно реализовать..но все это криво...возможно ли как то отложить выполнение сигнала ? Типа на текущем  цикле программа его пропускает по какому либо условию, на следующем проверяет условие опять и по результату пропускает\либо выполняет(сигнал т.е.). Ведь все сигналы в qt выполняются в порядке очереди...(первый вызвали первый выполнился). QTimer использовать нельзя т.к. во первых он не надежен (бывает подвисает и потом ускорено проматывает время) + не совсем понятно куда девать данные...опять же городить fifo очередь прийдется...лишние операции и процессорное время.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Denjs от Сентябрь 16, 2009, 10:41
но в моем случае отправлять их нужно только если с момента получения последнего сообщения прошло больше 11мс...если сделать отдельную нить то это можно реализовать..но все это криво...возможно ли как то отложить выполнение сигнала ? Типа на текущем  цикле программа его пропускает по какому либо условию, на следующем проверяет условие опять и по результату пропускает\либо выполняет(сигнал т.е.). Ведь все сигналы в qt выполняются в порядке очереди...(первый вызвали первый выполнился).
usleep вам не поможет? и почему "отдельную нить" - это криво?
создаете отдельный класс вида "отложенная отсылка сигнала", наследуемый от QThread, в run() которого всего 2 строчки - usleep(), emit чего вам надо и deleteLater()... все.
когда надо - создаете объект этого класса и делаете ему start(). все, он сам отправит сигнал когда надо, а после сам за собой все подчистит.
Почему это не красиво? очень даже красиво...



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 16, 2009, 10:48
О возможности динамического создания не подумал....спасибо! Буду пробывать.

Если ставить deletelater в конце run() то вылазит ошибка QThread: Destroyed while thread is still running и приложение полностью падает...+соответственно потом это дело болтается в памяти..так ?
Как лучше создавать класс?
sdf rfsf();
или
sdf *tc = new sdf();
? В чем разница ?


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: Denjs от Сентябрь 16, 2009, 12:42
О возможности динамического создания не подумал....спасибо! Буду пробывать.

Если ставить deletelater в конце run() то вылазит ошибка QThread: Destroyed while thread is still running и приложение полностью падает...+соответственно потом это дело болтается в памяти..так ?
ну падать оно не должно... но не проверял...
попробуйте сигнал  QThread::finished() подключить к  самому себе к deleteLater() ?

Цитировать
Как лучше создавать класс?
... в смысле "объект"....
класс - он отдельно описывается один раз в программе. (class-name.h + class-name.cpp как правило...)
Цитировать
sdf rfsf();
или
sdf *tc = new sdf();
? В чем разница ?
в принципе - имхо без разницы.дело вкуса и локальных предпочтений.
в первом случае сам объект получаете, а во втором ссылку на него.

rfsf.start() и tc->start() - последствия для процесса одинаковые...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Сентябрь 16, 2009, 12:47
Если ставить deletelater в конце run() то вылазит ошибка QThread: Destroyed while thread is still running и приложение полностью падает...+соответственно потом это дело болтается в памяти..так ?
Нужно не в конце run вызывать, а связать сигнал класса QThread - finised() со слотом deleteLater(). Тогда объект будет разрушать после завершения работы потока.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Сентябрь 16, 2009, 14:42
Понял, спасибо !


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Barmaglodd от Октябрь 01, 2009, 10:22
Работаю с устройством, которое подключается по USB и создаёт виртуальный COM-порт. Обрабатываю сообщения появления нового и удаления устройства, ловлю WM_DEVICECHANGE. При отключении устройства вызываю close, получаю падение программы, т.к. цикл обработки сообщений qt пытается обратиться к разрушенному экземпляру класса QWinEventNotifier. Если close не вызывать, падения нет, но при повторном подключении в устройство не посылаются данные, если снова переподключить, то посылка работает нормально, т.е. срабатывает стабильно на второе переподключение. Проблему обошёл, вызывая в обработчике WM_DEVICECHANGE таймер с нулевым интервалом, и на его timeout уже вызываю close, т.е. позволив отработать qt-шному обработчику сообщений от винды.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Октябрь 10, 2009, 11:50
up теме.
Подскажите пожалуйста-эта реализация умеет работать с RTS\CTS ? Если да - не могли бы Вы написать как это делать, нашел в функциях setRTS, но вот как смотреть за состоянием CTS - не понятно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 14, 2009, 07:32
Цитировать
Подскажите пожалуйста-эта реализация умеет работать с RTS\CTS ?
Насчет установки/снятия RTS -  см. в сторону: bool setRts(bool set);
Насчет контроля CTS - см. в сторону: ulong lineStatus();

Если имеется ввиду аппаратный контроль RTS/CTS , DTR/DSR - то в текущей версии библиотеки он отключен, т.е. эти состояния не контролируются и можно обмениваться данными, имея всего 3 провода: GROUND, Tx, Rx.  В будущем планирую добавить методы включения/отключения аппаратного контроля этих линий (для применения например в обмене данными с модемом).

А пока что библиотека "заточена" на обмен данными с минимальным использованием проводов -  только по трем проводам! :)
(для связи с промышленными устройствами по RS-232/485)  

ЗЫ: времени щас нету :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: yesrus от Октябрь 14, 2009, 10:08
Отключены имеется ввиду вообще не работают ? т.е. если я сделаю запрос linestatus оно не покажет, что CTS в положении 1 (т.е. линия свободна) ?
Очень нужен этот функционал =( Если можно, реализуй пожалуйста работу rts\cts первым приоритетом  :-[


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 14, 2009, 11:25
Цитировать
Отключены имеется ввиду вообще не работают ?
Не не не... Должны работать! Просто аппаратно не контролируется алгоритм "рукопожатия" или как там его.. Т.е. модемы работать в данном случае не должны! (Вроде)

Цитировать
т.е. если я сделаю запрос linestatus оно не покажет, что CTS в положении 1 (т.е. линия свободна) ?
Должен показать

Цитировать
Если можно, реализуй пожалуйста работу rts\cts первым приоритетом
Эмм... вроде работать методы должны! Проверь сам! Я не проверял. :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: akorud от Декабрь 10, 2009, 18:25
Вышеуказанная проблема с чтением в ОС Windows вроде побеждена! Для этого пришлось делать хитрый финт (лишние телодвижения с бубном :) )

Теперь при чтении вплоть до 4096 байт ниего не теряется! Проверено мною! Больше не проверял!
А можно спросить какие именно? Т.к. такая же проблема наблюдается с QextSerialPort а передельть на QSerialDevice нет возможности :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 10, 2009, 20:06
Ох.. много чего.. так и не упомнить... Посмотрите исходники

Изначально библиотека разрабатывалась под Qt4.1.1, а т.к. в более поздних версиях Qt4 были значительные изменения (в частности классе QIODevice) поэтому были различия в работе.

Насчет QextSerialPort не знаю что там и как... А вот в QSerialDevice я поправил кое-что в SVN и теперь можно читать и более 4096 байт :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Январь 19, 2010, 11:22
скачал QSerialDevice_v0.1.0.zip. Собираю как доктор прописал. make дает ошибку
Код:
In file included from nativeserialengine_win.cpp:24:
/usr/local/Trolltech/Qt4.6-static/include/QtCore/qt_windows.h:63:21: error: windows.h: Нет такого файла или каталога
nativeserialengine_win.cpp: In constructor ‘NativeSerialEnginePrivate::NativeSerialEnginePrivate()’:
nativeserialengine_win.cpp:42: error: class ‘NativeSerialEnginePrivate’ does not have any field named ‘hd’
....

пробовал src.pro и project.pro. Из кансоли и из KDevelop-a - результат один "error: windows.h: Нет такого файла или каталога". Собирай под Debian lenny, Qt4.6. Это как-то лечится?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Январь 19, 2010, 11:38
чё-то с DEFINE криво видимо, windows.h на линухе не нужен


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Январь 19, 2010, 12:04
Цитировать
чё-то с DEFINE криво видимо, windows.h на линухе не нужен
заново распаковал zip, заново создал проект - собрался )).

Есть такой замечательный метод QStringList AbstractSerial::serialDevicesAvailable( )const, но к сожалению он не статический. А задача следующая: Пользователю нужно дать возможность выбрать компорт из доступных в системе. Т.е. до создания объекта AbstractSerial. Можно конечно с костылём это сделать, например создать объект AbstractSerial с дефаултным именем, получить список и уничтожить этот объект. А в идеале было бы не плохо иметь статический метод serialDevicesAvailable.

Ну и как-бы до кучи,,,,, если не AbstractSerial, то как можно получить список доступных компортов в системе?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 19, 2010, 13:14
Берите из SVN, т.к. в версии 0.1.0 есть корявости: http://fireforge.net/snapshots.php?group_id=199

Насчет статического метода - сделаете - и я сразу его добавлю :) (у меня нет времени сейчас) + к тому не просто его будет сделать. см. исходники . ИМХО


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2010, 18:28
Итак, новшества:

1. в qserialdevice:
- подчищен код
- убрал я метод:  QStringList serialDevicesAvailable(bool friendlyName = false) const .
Теперь для получения списка портов и других вещей применять нужно класс: qserialdevicewatcher

2. добавлен класс: qserialdevicewatcher, который следит за добавлением/удалением последовательных устройств, а также возвращает их список и т.п.

3. добавлен пока что шаблон класса: qserialdeviceinfo , который будет выполнять соответствующие функции (пока не реализованы методы и т.п., займусь в ближайшее время)

скачать срез SVN тут: http://fireforge.net/snapshots.php?group_id=199

----

Кому библиотека нужна - просьба постить отзывы, пожелания и т.п. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2010, 14:09
Итак, близок тот день когда выйдет версия 0.2.0.

Готовый (то что планировалось мною) на 95% срез SVN тут: http://fireforge.net/snapshots.php?group_id=199
остались "мелкие" штрихи.

Милости просим к тестированию и т.п.

PS: Зарелизить думаю сегодня после 18:00 :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Amigo_sa от Март 02, 2010, 16:45
Добрый день. Не могли бы вы рассказать о плюсах и мунусах вашей библиотеки по сравнению с компонентом, который выложили недавно на crossplatform (http://www.crossplatform.ru/node/929)?
ЗЫ Большое спасибо за вклад в общее дело  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2010, 16:57
Цитировать
Добрый день. Не могли бы вы рассказать о плюсах и мунусах вашей библиотеки по сравнению с компонентом, который выложили недавно на crossplatform?
ЗЫ Большое спасибо за вклад в общее дело  Улыбающийся
Прочитайте, если не трудно, файлики:
manpage.dox
Readme_ru

:)

Изменений оч много (хотя понятие "оч много" относительное). Я даж и не знаю о чем расскатать то. Посмотрите сами и сравните.

Могу о минусах:

- класс AbstractSerial:
1. Тестировал только в GNU/Linux и Windows XP, поэтому могут в других ОС быть проблемы со сборкой
2. Реально имеется проблема со сборкой в Solaris , т.к. там другие ABI/API вызовы (не могу потестить т.е. нету солярки)
3. Может быть в Linux проблема с режимами Mark/Space (тут еще нужно потом поделать)
4. В *.nix до сих пор не понял как получить имя запущеноого приложения. Это имя, помимо pid и uid,  должно использоваться в LOCK файле.


- Класс SerialDeviceInfo:
1. Толком еще не определился с набором методов для вывода информации о последовательном устройстве. т.е. имею ввиду соответствия информации в Windows и Linux
2. в *.nix этот класс (а также SerialDeviceWatcher) тянет за собой UDEV, поэтому в других осях помимо GNU/Linux может ваапче не работать и не собраться

ЗЫ: в принципе пока всё :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Март 02, 2010, 17:05
он про другой инструмент речь вёл, про QPort в сравнении с твоим.

Как я понял, QPort - это просто обёртка над QextSerialPort, для засовывания его в дизайнер, в стиле всяких Борландов.
Т.е. сделать кашу из визуальных элементов - виджетов, и класса не имеющего ничего общего с графическим интересом.

Принцип ешьте мух вместе с котлетами, ведь и там, и там мясо


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2010, 17:08
ааа!!!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Amigo_sa от Март 02, 2010, 17:55
Спасибо! Посмотрел внимательнее исходники QPort - действительно обертка QextSerialPort. Сделана только интеграция в дизайнер, чтоб в свойствах можно было настройки порта устанавливать. Извините за нубство, правильнее было бы спрашивать про отличия от QextSerialPort. Я так понял, что ваша библиотека позволяет дополнительно мониторить состояние СОМ-портов, получать информацию об устройствах... А что вас побудило написать свою библиотеку? :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2010, 17:59
Цитировать
А что вас побудило написать свою библиотеку?
не мог смотреть на QextSerialPort  ;D + для собственного познания (развития)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2010, 19:17
Итак, анонсирую релиз: QSerialDevice v 0.2.0

Изменений много, писать нет смысла, поэтому предоставляю краткую вырезку аннотации:

QSerialDevice - это кросс-платформенная библиотека для работы с последовательными устройствами, которая использует фрэймворк Qt4 (см. http://qt.nokia.com/).

Требования:

OC : Win2K/WinXP/WinVista/Win7 или любой дистрибутив GNU/Linux
Qt4 : >= 4.5.0
Процессор : любой (который поддерживается Qt4)
Компилятор : любой (который поддерживается Qt4)

Заметки:

В силу того, что Я (автор) не имею возможности протестировать библиотеку на всех возможных операционных системах, всех компиляторах, процессорах и т.п. - то возможно что библиотека в некоторых случаях не будет работать :( .
Библиотека тестировалась только на:
OC : Windows XP Pro Sp3 (win32) и GNU ArchLinux x86_64
Qt4 : от 4.5.3 до 4.6.2
Процессор : AMD Athlon 4400+ 64x2 Socket AM2
Компилятор : gcc, MinGw
Теоретически (с небольшими исправлениями исходного кода) можно добиться того, чтобы библиотека работала и на других платформах.

Библиотека QSerialDevice содержит следующие классы:

  • AbstractSerial
  • SerialDeviceWatcher
  • SerialDeviceInfo

AbstractSerial

Класс AbstractSerial - предоставляет самодостаточный набор методов и свойств для легкой и простой работы с последовательными устройствами (последовательными портами) вашего PC (или другого устройства).
Класс поддерживает следующие возможности:

  • устанавливать скорость обмена данными
  • устанавливать количество бит данных
  • устанавливать количество стоп-бит
  • устанавливать режимы контроля четности
  • устанавливать режимы контроля потока
  • устанавливать таймаут ожидания символа
  • записывать данные в последовательное устройство
  • читать данные из последовательного устройства
  • управлять такими линиями порта как: DTR, RTS
  • читать состояния таких линий порта как: CTS, DSR, DCD, RI, RTS, DTR, ST, SR
  • автоматически получать нотификацию при:
    • приеме хотя бы одного байта (символа) в входной буфер
    • записи последнего байта в выходной буфер
    • изменении состояния последовательного устройства (при ошибках и т.п.)
  • получать текущее значение количества байт в приемном буфере
  • устанавливать таймаут ожидания прихода хотя бы одного байта (символа) в входной буфер

(более подробно см. описание AbstractSerial и исходный код)

SerialDeviceWatcher

Класс SerialDeviceWatcher - является вспомогательным классом для мониторинга последовательных устройств.
Класс предоставляет следующие возможности:

  • получать список имен всех последовательных устройств, которые имеются в системе
  • автоматически получать нотификацию при добавлении/удалении какого либо последовательного устройства

(более подробно см. описание SerialDeviceWatcher и исходный код)

SerialDeviceInfo

Класс SerialDeviceInfo - также является вспомогательным классом для получения информации о последовательном устройстве.
Класс предоставляет следующие возможности:

  • получать "дружественное" имя интересуюшего нас последовательного устройства
  • получать "описание" интересуюшего нас последовательного устройства
  • получать VID и PID интересуюшего нас последовательного устройства (experimental)
  • проверять интересующее нас последовательное устройство на существование
  • проверять интересующее нас последовательное устройство на занятость (блокировку)
  • и т.д.

(более подробно см. описание SerialDeviceInfo и исходный код)

Скачать релиз можно с домашней страницы проекта: http://fireforge.net/frs/?group_id=199
Скачать последние срезы SVN: http://fireforge.net/snapshots.php?group_id=199



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: OS2 от Март 16, 2010, 12:26
Не знаю как у остальных, а у меня ругается на твою конструкцию, типа: "QString(0)" и "Qstring имя_переменной(0)".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: OS2 от Март 16, 2010, 12:28
ЗЫ: Qt 4.7.0, WinXP Pro, MSVC2008.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 16, 2010, 12:35
Ругается с ошибкой или варнингом?
Если с ошибкой - то я уберу (0) и оставлю ().

Не, точнее ты убери и проверь.. если все будет "путем", то и я уберу.

ЗЫ: у мну нету MSVS и проверить не могу


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: OS2 от Март 16, 2010, 13:24
Именно с ошибками!
Я просто везьде заменил ХХХ(0), на ХХХ().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Март 16, 2010, 13:24
kuzulis, а что за инициализация строки нулём?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 16, 2010, 13:40
Типа пустой класс :)

нужно по идее писать что-то вроде : return QString() вместо : return QString(0)

так по крайней мере (QString()) в исходниках Qt делают

До этого момента прокатывало :) Поменяю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Март 16, 2010, 14:23
Типа пустой класс :)


Цитировать
Distinction Between Null and Empty Strings
For historical reasons, QString distinguishes between a null string and an empty string. A null string is a string that is initialized using QString's default constructor or by passing (const char *)0 to the constructor. An empty string is any string with size 0. A null string is always empty, but an empty string isn't necessarily null

Либо приводи к (const char *) либо используй конструктор по умолчанию. НО чесно сказать я смысла конструкции (const char *)0 невижу


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Март 16, 2010, 15:14
>>Типа пустой класс
первый раз такой термин слышу. И еслиб не данное обсуждение, то подумал бы что речь идёт о:
Код
C++ (Qt)
class MyClass{}


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 16, 2010, 18:14
фсё, исправил и закинул в SVN


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Март 18, 2010, 15:54
- Класс SerialDeviceInfo:
1. Толком еще не определился с набором методов для вывода информации о последовательном устройстве. т.е. имею ввиду соответствия информации в Windows и Linux
2. в *.nix этот класс (а также SerialDeviceWatcher) тянет за собой UDEV, поэтому в других осях помимо GNU/Linux может ваапче не работать и не собраться

Решил посмотреть. На OpenSuse 11.1 ошибка.
Попросила

/usr/include/libudev.h:28:2: error: #error "#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE is needed to use this experimental library version"           
serialdeviceinfo_unix.cpp: In member function ‘QString SerialDeviceInfoPrivate::nativeSystemPath()’:                                                         
serialdeviceinfo_unix.cpp:111: error: ‘::udev_device_get_property_value’ has not been declared                                                               
....
И т.д. ошибки.

libudev какая версия нужна?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 18, 2010, 16:39
Цитировать
libudev какая версия нужна?
Лучше посвежее... Точнее скажу после 18:00.

Нашел в инете кое что по этому поводу: http://www.openframeworks.cc/forum/viewtopic.php?p=17500

цитирую оттуда:
Цитировать
solved :)

just necessary to update libudev-devel to at least 137-15.1 and all compiles nice. Sorry i did not see it already yesterday.

segment from libudev.h after update

      /* sys enumeration */
      struct udev_enumerate;
      extern struct udev_enumerate *udev_enumerate_new(struct udev *udev);
      extern struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate);
      extern void udev_enumerate_unref(struct udev_enumerate *udev_enumerate);
      extern struct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate);
      extern int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem);

в общем у меня Udev v 151


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Март 22, 2010, 10:20
Вообщем, мне так не удалось пока собрать. То обновить usbutils надо, то теперь udev не собирается (151 как я понимаю в самом последнем ядре) - просит gobject-introspection-1.0 >= 0.6.2... Не очень-то и удобно получается...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 22, 2010, 12:50
Цитировать
То обновить usbutils надо, то теперь udev не собирается (151 как я понимаю в самом последнем ядре) - просит gobject-introspection-1.0 >= 0.6.2... Не очень-то и удобно получается...
а в репозитариях нету что-ли, обновиться не судьба ? О_о

ЗЫ: ох уж эта суся


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Март 23, 2010, 12:04
Давайте не будем начинать холивар. Все обновления которые предлагает Сусе установлены. Вручную обновлять список предлагаемых библиотек желания нет, по причине того, что у меня на компьютере еще много чего установлено и так же есть зависимости. И хочу время тратить на разработку, а не на постоянное администрирование.
А вообщем, я уважаю Ваш труд. И хотел использовать данную библиотеку, так как мне понравились изменения, которые были внесены и не хочу "изобретать велосипед".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 24, 2010, 08:49
Упс, в ВИНДЕ выплыл очень приочень нехороший "касяк", который заключается в крэше приложения. Пока не получается побороть, т.к. нечем отловить его.

В связи с этим, просьба - ПОМОГИТЕ :)

Я попожже (вечером по москве после 18 00) прикреплю тестовый проект, который облегчен для выявления бага и представляет собой два приложения:
1. мастер (шлет ведомому запросы и читает ответ)
2. слейв (ждет от мастера запросов, читает их и обратно отправляет мастеру)

Мастер каждую транзакцию формирует запрос рандомными значениями.
Длина запроса каждую транзакцию увеличивается (для более полного тестинга),
т.е сначала запрос равен 1 байт, потом каждый раз его длина увеличивается и максимальное ограничение выбрано в 1024 байт.

В общем пак "по кругу" мастер шлет ведомому эти запросы.

Тестировать только тем, у кого в компе имеется 2 СОМ порта.

ЗЫ: держаться нету больше сил (с)  :(
ЗЫЗЫ: хотя, кому не терпится оттестировать с "полной версией библиотеки" могут скачать из SVN примеры AnyMaster и AnySlave и заняться тестингом


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Март 24, 2010, 15:49
Тестировать только тем, у кого в компе имеется 2 СОМ порта.

А если использовать программу VSPE? Отличная софтина.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 24, 2010, 18:57
Цитировать
А если использовать программу VSPE? Отличная софтина.
не пробовал .. может быть.

Вот выкладываю тестовые проекты для Windows, которые сегфолтятся.
Я бессилен.

Кто нибудь, если не трудно (у кого есть студия), прогоните пжлста на утечки это дело.  >:(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Март 24, 2010, 19:55
я вот эту:
http://com0com.sourceforge.net/
 пользую, настроить только надо, чтобы имена портов были нормальный

П.С. VSPE, надо глянуть


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 25, 2010, 13:02
Вот упростил до минимума тестовые примеры, но все-равно сегфолтится!

Помогите!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 28, 2010, 16:33
В Windows имеется какая-то проблема с QByteArray, а именно, приложение завершается вот с этим:
Цитировать
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

D:\TMP\transactions\anymaster\build\release>

Что это может быть?

---
Нашел похожий баг тут:
http://bugreports.qt.nokia.com/browse/QTBUG-6227?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: ufna от Март 30, 2010, 19:31
Привет!

Не подскажешь пожалуйста, можно ли собрать библиотеку для использования на WinCE?>

И еще - если библиотека и приложение собираются для разных версий Qt, работать будет? :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Март 30, 2010, 20:17
И еще - если библиотека и приложение собираются для разных версий Qt, работать будет? :)

собирай приложение и либу с одной версией Qt


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: ufna от Март 30, 2010, 20:25
пасиб :)

главной проблемой правда стало то, что ни QSerialDevice, ни  QextSerialPort не работают с WinCE, т.к. не поддерживают GetCommConfig и overlapped I/O. Я слабо разбираюсь в нативном API винды, чтобы понять как нужно сделать ((


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Spicos от Март 31, 2010, 07:39
я вот эту:
http://com0com.sourceforge.net/
 пользую, настроить только надо, чтобы имена портов были нормальный

П.С. VSPE, надо глянуть

Спасибо, не знал про такую.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 12, 2010, 10:51
Итак, вроде исправил сегфаулт!!!

ЗЫ: Нужна помощь в реализации и тестировании классов SerialDeviceInfo & SerialDeviceWatcher под Mac OSX

т.е. хто бы это всё реализовал бы? :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Апрель 12, 2010, 15:28
Есть пара предложений по оформлению комментариев.
Свои комментарии оформляю следующим образом

Хедер:

Код:
#if defined(SKDDEVICE) && defined(ARM_DEBUG)
    #include <QtDebug>
    #define SKD_DBG qDebug
#else
    #define SKD_DBG if(0) qDebug
#endif

class SKDDevice: public QObject
{
    ...
}

где ARM_DEBUG - дефайн для отладки классов, входящих в один модуль(библиотеку) ARM
     SKDDEVICE - название разрабатываемого класса, приведенное к верхнему регистру
     SKD_DBG    - дефайн для вывода отладочных сообщений класса SKDDevice

ARM_DEBUG и SKDDEVICE определяю через DEFINES в *.pro файле

Файл CPP:

Код:
...
    SKD_DBG() << "This is debug message 1" << "\nThis is debug message 2";
    либо
    SKD_DBG("New value for param XYZ: %02d", XYZ);
...

вместо:

Код:
#if defined(SKDDEVICE)
   qDebug() << "This is debug message 1" << "\nThis is debug message 2";
#endif

Положительные моменты такого решения:
- большая ясность и компактность кода
- при отключении отладки отладочные выражения не вычисляются
- можно включать/отключать отладку для нескольких классов, входящих в один модуль, установкой всего одного дефайна (ARM_DEBUG)(крайне полезно при релизе продукта)

Минусы - нельзя "закомментировать" большие куски кода.


Применительно к QSerialDevice (классам в каталоге qserialdevice):

abstractserial.h:

Код:
#if defined(ABSTRACTSERIAL) && defined(QSERIALDEVICE_DEBUG)
    #include <QtDebug>
    #define ABS_DBG qDebug
#else
    #define ABS_DBG if(0) qDebug
#endif

abstractserial.cpp:

до:

Код:
#if defined (ABSTRACTSERIAL_DEBUG)
    qDebug() << "AbstractSerial::setBaudRate(const QString &) returned false because input parameter  speed:" <<  baudRate << "\n is not defined in hash. Error!";
#endif

после:

Код:
ABS_DBG() << "AbstractSerial::setBaudRate(const QString &) returned false because input parameter  speed:" <<  baudRate << "\n is not defined in hash. Error!";






Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 12, 2010, 18:01
ОК, приму к сведению.

Ну а по теме то что?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Апрель 14, 2010, 08:18
Итак, вроде исправил сегфаулт!!!

А коммит на сайт fireforge делали? Там последняя версия от 05.04.2010. Хотелось бы самую последнюю версию качнуть.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 14, 2010, 09:48
Цитировать
А коммит на сайт fireforge делали? Там последняя версия от 05.04.2010. Хотелось бы самую последнюю версию качнуть.
Да, в SVN коммиты все есть. Всё самое новое в SVN! Качайте! :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Апрель 14, 2010, 15:01
Применил в проекте Вашу библиотечку. Впечатления наилучшие - отлично проработан код и документация. Спасибо за труд!!!

Теперь к делу. Возникло предложение добавить в класс AbstractSerial функцию типа lastError или currentStatus. Применение этому следующее. К примеру, вызываю функцию открытия порта open(...), она возвращает false. Вызовом lastError определяю причину, почему порт не удалось открыть. Конечно можно определять причину, подписавшись к сигналу signalStatus, но это не всегда удобно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 14, 2010, 15:20
Цитировать
Теперь к делу. Возникло предложение добавить в класс AbstractSerial функцию типа lastError или currentStatus. Применение этому следующее. К примеру, вызываю функцию открытия порта open(...), она возвращает false. Вызовом lastError определяю причину, почему порт не удалось открыть. Конечно можно определять причину, подписавшись к сигналу signalStatus, но это не всегда удобно.

первоначально у меня была такая мысль - но я от нее отказался по ряду причин:

1. зачем при ошибках вызывать lastError, потом анализировать код ошибки и т.п? ., если можно просто приконнектиться к сигналу signalStatus и автоматом получать все уведомления об изменении статуса последовательного у-ва!!
ИМХО, гораздо удобнее сразу после создания объекта - приконнектится к signalStatus чем вызывать постоянно lastError, тем более, что signalStatus  - отражает не только ошибки, но и другие изменения состояния (по крайней мере так планировалось)

т.е. мы сможем вести (если, конечно это необходимо - иначе это можно просто в выключить) подробный лог работы устройства привязанный ко времени и т.п., что ИМХО, очень удобно.

2. а если у вас порт работает в многопоточном приложении и, к примеру, вы одним потоком/нитью читаете данные из порта - а другим пишете в порт...  и, вдруг при чтении мы получаем ошибку .. мы вызываем lastError - но там другая уже ошибка, а не та, что от чтения.. (каламбур)... и допустим, что и в процессе записи тоже случилась ошибка и lastError => вернет последнюю ошибку..
т.е. в данном случае lastError  сможет "зафиксировать" только последнюю ошибку на момент вызова lastError(), т.е. о промежуточных ошибках мы дажне не узнаем!

+ не охота мне было (не осилил) городить огород из shared pointer, атомарных операций и т.п. - т.е. я поступил как проще.

-------------

Если и что-то добавлять - то может быть имеет смысл добавить дополнительный режим открытия у-ва типа AbstractSerial::Shared (помимо ReadOnly, WriteOnly и т.п.) при котором у-во будет открываться в режиме "мультидоступа" :)... но опять - же, в MSDN написано, что Windows не поддерживает шаред моде в отношении последовательных портов (хотя нужно проверить - может врут? :)  )
Хотя, как я понял, этот режим может поддерживаться - но все зависит от драйвера последовательного порта.. т.е. не все девайсы это могут поддерживать... Опять - же НУЖНО ПРОВЕРИТЬ!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Апрель 22, 2010, 14:02
Здравствуйте, kuzulis. Обнаружили с напарником глюк в работе библиотеки под виндой (под линуксом проблема также возможна). Последовательность следующая:

-открываю порт и настраиваю его (OK)
-записываю данные в порт (OK)
-закрываю порт (OK)
-вызываю функцию isOpen() - возвращает true

Ну и соответственно, если попытаться заново открыть порт - выдается сообщение:

Device is already open. Error!

Баг вроде исчез после исправления функции

Код:
bool NativeSerialEnginePrivate::nativeClose()
{
           ...
if (closeResult)
this->m_isOpen = false;

return closeResult;
}

Вроде все заработало.






Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 22, 2010, 17:22
Prm, доброго времени.

Да, эта проблема была. Но она уже давно исправлена.
Код:
bool NativeSerialEnginePrivate::nativeClose()
{
...
...
    if (closeResult) {
        this->m_isOpen = false;
        this->hd = INVALID_HANDLE_VALUE;
    }
   
    return closeResult;
}

Да и много чего изменилось...
Смотрите SVN:

svn checkout svn://scm.fireforge.net/svnroot/qserialdevice


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Апрель 22, 2010, 19:56
Блин...фигня какая получилась. Я исходники брал со страницы http://fireforge.net/scm/?group_id=199 (http://fireforge.net/scm/?group_id=199), кликал по ссылке [Загрузить свежую SVN базу репозитория]. Значит сайт косячит... :( В архиве скачивается версия qserialdevice-scm-2010-04-05.

Завтра на работе попробую исходники SVN-ом затянуть. Ложный вызов  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 22, 2010, 20:24
Цитировать
Значит сайт косячит...
дада, есть такая хрень


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 13, 2010, 11:33
fireforge.net сдох?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 13, 2010, 11:43
По ходу да... Они там переезжают куда-то..

Думаю на google code перенести SVN, т.к. расстраивают такие вещи.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Май 13, 2010, 13:17
>>Думаю на google code перенести SVN
Переберайся на гиториус, git рулит. Всю историю с SVN'а можно стянуть в локальное git-хранилище, а потом отправить на гиториус


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 13, 2010, 14:18
Цитировать
Переберайся на гиториус, git рулит. Всю историю с SVN'а можно стянуть в локальное git-хранилище, а потом отправить на гиториус
Вопросы:
1. Чем GIT лучше SVN?
2. Есть мануал по переходу с SVN на GIT ?
3. Какие клиенты GIT под винду есть?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Май 13, 2010, 21:11
1) Моя тема на кросплатформе - Git против SVN (http://www.forum.crossplatform.ru/index.php?showtopic=4152)
2) вот он:
md myrepo
cd myrepo
git svn clone https://myrepo.svn.sourceforge.net/svnroot/myrepo -T trunk -b branches -t tags ./
всё
3) Git-1.7.0.2-preview20100309.exe (http://code.google.com/p/msysgit/downloads/list), другие в этом списке не качай
при установке выбрать:
a) для окончания строки, "всё как есть"
b) для встраивания в проводник "Git bash и Git GUI", вместо "Git-Cheetah"
c) для авторизации - ssh
всё



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 14, 2010, 15:40
Заменил сим произведением QextSerialPort бету, спасибо, правильный класс :)

Тут ошибочку нашел, случайно: в SerialDeviceWatcherPrivate::setEnabled(bool enable)

        availableNotifier->setEnabled(enable);
        m_enabled = enable;

По умолчанию нотифер не создается и в итоге при уничтожении класса, происходит обращение по нулевому указателю. На сколько свежая у меня версия не знаю, брал с qt-apps.

И еще, если создать объект в одном потоке, а ::open вызвать в другом, QObject выдаст warning, на тему того что parent'ом нельзя указывать объект другого потока.

UPD
Сейчас еще с винды на линуксе в релиз начал компилить, функцию free() почему-то в паре файлов (где она используется) компилятор у меня не нашел (kubuntu 10.04, i386). В Debug все ок было, а так пришлось stdlib.h добавить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 14, 2010, 17:17
Цитировать
Тут ошибочку нашел, случайно
уже давно в SVN исправлено

Цитировать
И еще, если создать объект в одном потоке, а ::open вызвать в другом, QObject выдаст warning, на тему того что parent'ом нельзя указывать объект другого потока.
вот тут хз.. поподробнее бы...

Цитировать
Сейчас еще с винды на линуксе в релиз начал компилить, функцию free() почему-то в паре файлов (где она используется) компилятор у меня не нашел (kubuntu 10.04, i386). В Debug все ок было, а так пришлось stdlib.h добавить.
из SVN возьмите. я там убрал вообще вызовы free и т.п. и заменил их на UDEV-ные ф-ции .. теперь компилятор не ругается, но хз, могут быть утечки.

ЗЫ: из SVN тянуть клиентом! (но не кликать по ссылке на fireforge.net)
ЗЫЗЫ: кстати, fireforge вроде заработал





Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 14, 2010, 17:29
Цитировать
1) Моя тема на кросплатформе - Git против SVN
2) вот он:
md myrepo
cd myrepo
git svn clone https://myrepo.svn.sourceforge.net/svnroot/myrepo -T trunk -b branches -t tags ./
всё
3) Git-1.7.0.2-preview20100309.exe, другие в этом списке не качай
при установке выбрать:
a) для окончания строки, "всё как есть"
b) для встраивания в проводник "Git bash и Git GUI", вместо "Git-Cheetah"
c) для авторизации - ssh
всё


такс.. а теперь попорядку, как я понял, нужно:
1. Сначала скачать Git-1.7.0.2-preview20100309.exe (ок, ты про это написал)
2. Потом его установить  (ок, ты про это написал)
3. Потом клонировать проект из удаленного SVN сервера в локальный GIT репозиторий (или как там его)  (ок, ты про это ВРОДЕ написал)
4. Потом из локального GIT добавить проект на удаленный сервак (типа Гиторгиус), так? (тут непонятен момент)

Непонятные моменты:
1. Обязательно ли клонировать SVN и для чего это нужно?
2. Нельзя ли сразу создать новый проект на GIT ?
3. Или клонируют SVN только для того, чтобы, если вдруг кто-то исправил в проекте SVN какую нить багу - то можно было бы автоматом это дело потом добавить и в GIT?
4. Автоматом ли происходит дальнейшая синхронизация сервера с проектом GIT с сервером с проектом на SVN, т.е. без участия "меня" ? (или я чо-то не так понял)


ЗЫ: просьба не пинать, т.к. это в диковинку для меня.
ЗЫЗЫ: lit-uriy , если у тебя имеются твои проекты на GIT (на гиторгиусе) - то дай на них ссылку. Хочу посмотреть пример оформления и т.п. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Май 14, 2010, 17:44
Про непонятные моменты:
1) Да, просто git-хранилище - это хранилище и оно должно содержать всю историю, как и svn-хранилище.
2) можно, но разве тебе не будет удобнее иметь историю? "А вдруг чё!"
3) и для этого тоже
4) не понял такой формулировки вопроса. Но попробую ответить. Git-хранилище - это только хранилище. Само оно ничего не делает.

про ЗЫЗЫ:
да нечего там оформлять, или я не понял о чём вопрос

про то что понял:
...
4) Сначала сделай локальное хранилище и вытяни историю из SVN'а. потом про гиориус


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 14, 2010, 18:12
ok,
А github чем хуже гиториуса?

ЗЫ: Почитал тут на хабре статьи про git - голова идет кругом


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Май 14, 2010, 20:28
>>А github чем хуже гиториуса?
о нём мало что знаю. На гиториусе троли сидят - удобно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 18, 2010, 14:18
А можно глупый вопросик задам :) ? Зачем перенесли defaultDeviceName в AbstractSerialEnginePrivate::m_defaultDeviceName?
Я QSettings в качестве параметра по умолчанию подсовывал это поле класса.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 18, 2010, 18:22
Цитировать
А можно глупый вопросик задам  ? Зачем перенесли defaultDeviceName в AbstractSerialEnginePrivate::m_defaultDeviceName?
Я QSettings в качестве параметра по умолчанию подсовывал это поле класса.

Незачем ее выносить на всеобщее обозрение т.к она используется только  в конструкторе Engine Private при "автоматичечком" определениии и больше не нужна никому  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 18, 2010, 20:19
Очень жаль, т.к. пользоваться этим параметром для определения порта по-умолчанию, очень удобно.
Код:
    m_exch = new ExchangerPolycrystal(this);
    m_exch->setPortName(m_settings->value("port/portName", AbstractSerialEnginePrivate::m_defaultDeviceName).toString());

PS
Смена лицензии на LGPL не планируется :) ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 19, 2010, 07:21
Цитировать
Очень жаль, т.к. пользоваться этим параметром для определения порта по-умолчанию, очень удобно.
а чем QString AbstractSerial::deviceName() const не устраивает?

Цитировать
Смена лицензии на LGPL не планируется Улыбающийся ?
Может быть, только после того как для MacOSX будет реализован функционал SerialDeviceWatcher и SerialDeviceInfo.

Также планирется переезд на GIT :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 19, 2010, 10:17
Цитировать
Очень жаль, т.к. пользоваться этим параметром для определения порта по-умолчанию, очень удобно.
а чем QString AbstractSerial::deviceName() const не устраивает?

Он не статический.
Чтение/запись в порт у меня происходит не в головном потоке. При чтении настроек экземпляр класса AbstractSerial еще не создан.
А если создать AbstractSerial в основном потоке, а открытие порта в рабочем, Qt выдает предупреждение, о том что родитель из другого потока не может быть назначен создаваемому классу, в функции "NativeSerialEngine::setReadNotificationEnabled" вот на этой строке:

Код:
d->readNotifier = new WinSerialNotifier(d->hd, WinSerialNotifier::Read, this);

что в Linux, что в Windows.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Май 20, 2010, 14:59
Офтоп: Хочу выразить благодарность автору библиотеки. Большое спасибо!
Правда из-за проблем со старой версией udev пришлось немножко подправить.
Сам тоже писал разные классы для работы из Win и из Linux, но как-то руки не доходили оформить в приличный вид.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 25, 2010, 14:19
В nativeClose не хватает в конце:

Код:
if (closeResult)
    this->m_isOpen = false;


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 25, 2010, 14:59
Цитировать
В nativeClose не хватает в конце:
давно это есть. см. SVN


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Май 25, 2010, 16:24
Давно быть не может, с неделю назад сливал версию :) Неделя это недавно :)

PS
Спасибо :)

UPD
serialdeviceinfo.h, serialdeviceinfo_p.h, В файле заменен дефайн с:
Код:
#ifndef SERIALDEVICEINFO_H
#define SERIALDEVICEINFO_H

на:
Код:
#ifndef SERIALDEVICEWATCHER_H
#define SERIALDEVICEWATCHER_H

Это все верно? Я бы не засомневался, но классы как бы разные, заголовочные файлы тоже, да и в комментарии к #endif'у остался прежний:
Код:
#endif // ABSTRACTSERIALINFO_H


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Июнь 16, 2010, 21:09
йайрфорж снова лежит который день, появилось-ли у проекта более стабильное зеркало?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2010, 21:59
Цитировать
йайрфорж снова лежит который день, появилось-ли у проекта более стабильное зеркало?

Сегодня вроде оно заработало. И сегодня я новые обновления забацал.. Качайте быстрее пока сайт опять не сламался :).

А по теме - планирую перевести на Git где-то после 17-го числа.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июнь 22, 2010, 22:02
большая просьба выложить исходники версии больше чем 0.2.0 куда нибудь кроме файрфоджа
что то ни разу не заметил его работающим  :(  (почему бы просто в архив и на файлообменник?)
скачал с qt-apps.org  версию 0.2.0 ну и собственно  вся работа встала  на проблеме  отлавливания выдергивания шнурка преобразователя усб-рс232  если порт открыт
(при закрытом порте все пучком)
(не совсем понял , решили или нет эту проблему в следующих версиях)

+ еще глюк или что: если разрешить "слежку" setEnabled(true)  в коде до разрешения выдачи сигнала статуса enableEmitStatus(true)  то сигнал signalStatus   не отсылается при открытии \ закрытии порта  

но за библиотеку все равно большое спасибо!
в отличие от qextserialport  все работает  прекрасно (ну кроме обозначенных проблем)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 22, 2010, 23:18
Я приаттачил последний вариант библиотеки.
Протестируйте, может что-то поломалось опять. :)

Да и думаю хватит уже в этой теме мне аттачить.. Много уже итак мусора.

ЗЫ:
Прошу помощи.
Создал тут: http://gitorious.org/qserialdevice "проект", но не получается добавить туда в репозиторий файлы.  :-\

Подскажите по шагам, как нужно это сделать?
Как добавить туда проект с "нуля" , т.е. у меня на компе есть каталог с файлами и их нужно туда залить.
1. Я скачал Git (для винды) : msysGit-fullinstall-1.7.1-preview20100612.exe ,
2. установил
3. он там что-то при установке компилил.. компилил...
 в итоге имею на C:\ ~1.5 GB сырцов и бинарей Git-утилит + открылась автоматом Git-консоль.
4. я ввел туда то что было согласно рекомендациям с gitorious типа "начало для новичков". (сначала имя свое, потом емайл и т.п.)

Но Git консоль ругнулась что что-то у меня не правильно (не помню что)
5.  Потом мне надоело и я закрыл консоль
6. Винда ругнулась что Git у меня установлен неправильно.
7. Я плюнул на всё.  >:(

Напишите по шагам решение то! А то информация скудная. Даже в личку напишите чтобы не засорять топик.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 23, 2010, 00:42
Цитировать
компилил.. компилил...
Не должен был такого делать. Ну да не важно.
Все команды выполняются из под git console, либо из обычного cmd.exe, если git при инсталляции добавлялся в PATH.
Мы должны сгенерировать rsa ключ. Затем сгенерированную публичную часть ключа вставить в gitorious.
Код:
ssh-keygen -t rsa
Код:
cat ~/.ssh/id_rsa.pub
Копируем содержимое и вставляем в gitorious.
Имеем папку с проектом.
В папке с проектом делаем файл названием
Код:
.gitignore
В данный файл пишем
Код:
doc/html/
sql/
winbuild/
build/
*.dll
!doc/src
bin
lib

# object files
*.[oa]
*.so
*.so.*

# qt creator projects
*.cbp
*.user

# qt creator cmake directories
qtcreator*/

# manually cmake build directories
build*/

# win32 libs
*.dll
# win32 impl
*.lib

# temporary dirs
tmp/

# logger dirs
log/

# html docs because it's generated by doxygen
doc/html/

# test
test/
test*/

# qmake mocs
moc_*.cpp

# qt ui headers
ui*.h

# qt translations files
*.qm

# temporary files
*~

# emacs temporary files
##*##

# make files
Makefile

# cmake build system
CMakeFiles/
CMakeCache.txt

# cmake mocs
moc*.cxx
*.moc

# include cmake build file
#!CMakeLists.txt
В папке с проектом делаем
Код:
git init
Код:
git add .
Код:
git commit -a -m "initial commit"
Код:
git remote add origin @gitorious.org/qserialdevice/qserialdevice.git
Код:
git push origin master

Далее редактируем проект, добавляем новые файлы и соответственно делаем:
Код:
git add .
Код:
git commit -a -m "we change build system"
Код:
git push


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 07:28
2 Filonenko.Mikhail ,

Цитировать
Не должен был такого делать. Ну да не важно.
Согласен, ерунда какая-то... Неправильно как-то. Нелогично.
Может нужно другой Git скачать, а не тот что предлагают по ссылке на gitorious при создании проекта?

Цитировать
В папке с проектом делаем файл названием
Код:

.gitignore

В данный файл пишем
А зачем создавать .gitignore и какой смысл содержимого .gitignore?
Мне один в один копировать то что Вы предоставили или с какими-то отличиями?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 23, 2010, 07:54
В .gitignore мы перечисляем имена/шаблоны имен файлов, которые не будут учитываться git'ом и соответсвенно эти файлы не появятся в репозитории.
Цитировать
Может нужно другой Git скачать, а не тот что предлагают по ссылке на gitorious при создании проекта?
Нет не нужно, у меня имя файла инсталяции также звучит кроме версии.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2010, 08:52
kuzulis, я делаю это с помощью Git GUI, это очень просто.
Как говорилось, нужно сделать ключ. В своём локальном хранилище запусти Git GUI, меню "Помощь", пункт "Показать ключ SSH", если его нет, то нажать кнопку "Создать ключ", полученный ключ зарегистрируй на gitorious'е.

В главном окне Git GUI в меню "Внешние репозитарии" выбрать пункт "Добавить". Ввести название (понятное для тебя) и "push URL" который тебе показан на gitorious'е, переключатель поставить, например, в положение "Больше ничего не делать" и нажать кнопку "Добавить".

Затем в этом же меню выбрать пункт "Отправить", выбери ветвь, которую хочешь отправить и хранилище (то самое понятное тебе название из предыдущей операции), установи галку "намеренно переписать существующую ветвь", остальные пожеланию и нажми кнопку "Отправить".

Всё




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июнь 23, 2010, 12:55
Я приаттачил последний вариант библиотеки.
Протестируйте, может что-то поломалось опять. :)
спасибо, кумекаю
перестал работать watcher - не посылает сообщения , ни в моем коде , ни в Вашем примере

что еще интересно: при прописывании коннекта qtcreator не видит сигнал hasChanged в всплывающем окошке (но при исполнении консоль не ругается на эту строчку , как она ругается если не может найти какой-либо слот\сигнал)

ну  и devicesAvailable() возвращает пустой список


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 14:43
Цитировать
спасибо, кумекаю
перестал работать watcher - не посылает сообщения , ни в моем коде , ни в Вашем примере
...
ну  и devicesAvailable() возвращает пустой список

В какой ОС?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июнь 23, 2010, 15:00
ой забыл
XP sp3


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 15:37
Цитировать
ой забыл
XP sp3
А эта ветка в реестре имеется?

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Serenum]

И вообще, проверьте : при втыкании и вытыкании шнурка в этой ветке должна создаваться подветка /Enum в которой перечислены все последовательные девайсы. У вас она имеется? И если ДА - то покажите что именно имеется в /Enum!



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июнь 23, 2010, 16:26

А эта ветка в реестре имеется?
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Serenum]
И вообще, проверьте : при втыкании и вытыкании шнурка в этой ветке должна создаваться подветка /Enum в которой перечислены все последовательные девайсы. У вас она имеется? И если ДА - то покажите что именно имеется в /Enum!

такой ветки в реестре нет ,но я просканировал состояние  ветки \services на момент  воткнутого преобразователя и отключенного
разница в  ветках
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\lowcdc
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\usbser


судя по названиям они связаны исключительно с моим типом преобразователя AVR CDC-232(http://www.recursion.jp/avrcdc/cdc-232.html (http://www.recursion.jp/avrcdc/cdc-232.html))

выкладываю обе ветки в подключенном и отключенном состоянии



если подключено то для обоих (lowcdc  usbser) папок в /Enum
имя  =  значение
0       =   USB\Vid_16c0&Pid_05e1\5&c0d662f&0&2
Count =   1
NextInstance = 1

при отключении остаются тока последние два и значения их = 0
так же нашел мой девайс в  HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
параметр \Device\USBSER000  значение - название его порта


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 17:14
Цитировать
такой ветки в реестре нет
оч плохо. :(

Тут даж и не знаю к чему привязаться. Придется наверное мониторить помимо ветки:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Serenum]

еще ветки:
[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\lowcdc]
и
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\usbser]

Но, думаю, проблема решаема.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2010, 17:23
еще ветки:
[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\lowcdc]
и
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\usbser]

Но, думаю, проблема решаема.
зря, в следующий раз какой-нибудь пионер напишет драйвер, который новую ветку создаст.
лучше мониторь дополнительно
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

в прилепленном снимке
COM1 - Реальный порт
COM3 - FTDIный шнурок

П.С. ОСь: MS Windows XP SP2


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июнь 23, 2010, 17:28
хотел как раз написать  про HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

к тому же у меня в системе есть какой то еще один порт (как раз в этой ветке сидит  параметр Winachsf0  с соответствующим номером порта)  , его watcher тоже не видит


кстати: в версии 0.2.0 класс наблюдателя прекрасно видел все порты  и следил за их изменением!! (но опять же до момента , пока я не открою один из портов)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 18:04
2 lit-uriy ,

не получается ничего!

1. Скачал : Git-1.7.1-preview20100612.exe
2. Установил (при установке воспользовался твоим советом)
3. На гиторгиусе сохранил RSA ключ, создал проект, создал пустой репозиторий.
4. Запустил Git-GUI
5. Открылось диалоговое окно в котором я выбрал: "создать новый репозиторий" (или как-то так"
6. Выбрал путь к нему на ЖД.
7. Открылось основное окно Git-GUI в котором слева вверху под красной полосой "Изменено (не будет сохранено) " перечислены все файлы и каталоги с файлами моего проекта.
8. В меню "Внешние репозитории" выбрал пункт "Добавить" ,
ввел название: QSerialDevice + ввел положение: git@gitorious.org:qserialdevice/qserialdevice.git
9. В том же меню "Внешние репозитории" выбрал пункт "Отправить", выбрал название QSerialDevice , поставил галку "Намеренно переписать ... "
10. Жмакнул кнопку "Отправить"...
11. И.. НИЧЕГО! Совсем ничего!

У меня кривые руки? :)

Цитировать
лучше мониторь дополнительно
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

Дык если ее мониторить, то возникает известная проблема - которая заключается в следующем:
если открыть порт и потом не закрывая выдернуть его - то ключи из ветки : HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
не удаляются! Раньше так оно ибыло, т.е. была привязка именно к этой ветки.. Есть ли смысл дополнительно ее мониторить то? Надо подумать...

Цитировать
зря, в следующий раз какой-нибудь пионер напишет драйвер, который новую ветку создаст.
имхо, проще добавить в QStringList путь к еще одной ветке чем еще дополнительно мониторить и читать HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

т.е. ставлю отлов уведомлений на изменения в ветке : [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services] , и если оно пришло - то пытаюсь по очереди открыть из списка :
1. Сначала \Serenum и если ее нет - то п.2
2. Потом \usbser , потом ...
т.е. по очереди перебираю варианты... их немного будет.. ну , скажем штук 5.. это ерунда... :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 23, 2010, 18:29
Цитировать
7. Открылось основное окно Git-GUI в котором слева вверху под красной полосой "Изменено (не будет сохранено) " перечислены все файлы и каталоги с файлами моего проекта.
А тогда надо добавить файлы для того чтобы гит за ними следил и сохранить первоначальное состояние git commit -a -m "initial commit"

И подозреваю что нужно почитать http://progit.org/book/ru/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2010, 18:35
Цитировать
3. На гиторгиусе сохранил RSA ключ, создал проект, создал пустой репозиторий.
4. Запустил Git-GUI
5. Открылось диалоговое окно в котором я выбрал: "создать новый репозиторий"
где-то ты не там запустил Git GUI.
Надо было щёлкать по корневому каталогу проекта.
Т.к. если Git GUI видит хранилище в текущем  или выше стоящем каталоге, то он тебе ни когда не покажет окно создания проекта, а покажет окно с проектом


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2010, 18:37
Цитировать
если открыть порт и потом не закрывая выдернуть его - то ключи из ветки : HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
не удаляются!
всё верно, так и должно быть.
Порт (ресурс) занят системой. Я тебе уже об этом объяснял.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 18:43
Цитировать
всё верно, так и должно быть.
Порт (ресурс) занят системой. Я тебе уже об этом объяснял.

Да, все это так.. Но другие ветки исчезают :).. Поэтому пока сделаю как в сообщении №182


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 19:22
Все, добавил в Git !!! Парни, спасибо за разъяснения!!

ИТАК: проект QSerialDevice переехал на Git!!!

Брать все новое отсюда: http://gitorious.org/qserialdevice/qserialdevice


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2010, 19:28
а чёж историю-то из SVN'а не сохранил?
Яж объяснял, как с SVN'а склониовать


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 19:37
Цитировать
Яж объяснял, как с SVN'а склониовать

Дык fireforge.net лежит! Не буду ж я ждать когда его починят! А как я без него склонирую то? У мну нет локального SVN хранилища.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2010, 21:27
А у меня есть копия твоей истории до 147 правки (2010-06-17)
:)

Сделал клон твоего хранилища ни Гитоиусе, и в ветку svn_trunk (http://gitorious.org/~lit-uriy/qserialdevice/lit-uriys-qserialdevice/commits/svn_trunk) залил имеющуюся у меня историю твоего SVN'а


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2010, 22:01
Ой СПАСИБО! :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2010, 14:25
lit-uriy ,

а как теперь объединить мою ветку master и твою lit-uriys-qserialdevice ? И можно ли это в принципе?

А то непонятно куда изменения сливать...  

И вообще, принцип Git в том, чтобы каждый делал свои ветки, а потом их в одну "корневую" master по возможности сливал? Или в чем идея? Кратко, на пальцах. :)

Или я опять что-то недопонял?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 24, 2010, 14:59
>>потом их в одну "корневую" master по возможности сливал?
если это необходимо, то можно и так сделать.

>>а как теперь объединить мою ветку master и твою lit-uriys-qserialdevice ?
есть несколько способов.

>>И можно ли это в принципе?
конечно!

Способы объединения:
== 1 ==
* ты добавляешь в своём локальном хранилище новое внешнее, на основе моего клона.
* тянешь из него к себе
* от "головы" (HEAD) вытянутой ветки из внешнего хранилища делаешь локальную ветку, например с названием "svn"
* если необходимо, то сливаешь с веткой "master"

== 2 ==
* я делаю запрос на слияние (merge request) на гиториусе
* ты его либо одобряешь, либо отклоняешь.

Чтобы не нарушать имеющееся состояние ветки master у тебя, лучше воспользоваться 1-ым вариантом. Т.к. в SVN'е я, возможно, не скачал самое последнее состояние. То, когда он станет доступен, я скачаю оставшееся. И тогда можно будет воспользоваться вторым вариантом (к этому моменту у тебя будет ветка отражающая только историю из SVN'а)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2010, 15:34
Цитировать
Чтобы не нарушать имеющееся состояние ветки master у тебя, лучше воспользоваться 1-ым вариантом. Т.к. в SVN'е я, возможно, не скачал самое последнее состояние. То, когда он станет доступен, я скачаю оставшееся. И тогда можно будет воспользоваться вторым вариантом (к этому моменту у тебя будет ветка отражающая только историю из SVN'а)

По моему, ты с SVN слил последнее состояние (коммиты), т.к. текущая правка SVN = 147. (как назло сегодня fireforge.net заработал :) )
Я в ветку master (свою) еще ничего нового не добавлял, поэтому нечего терять и можно попробовать вариант №2 ?!
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 24, 2010, 17:08
у тебя в ветке master какие исходники лежат?
копия правки 147 из SVN'а?
Я вижу отличия. поэтому делай по первому пункту, но не сливай с мастером, как вытянишь мой клон, через меню "Внешние репозитарии" так отпишись


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2010, 17:22
Цитировать
у тебя в ветке master какие исходники лежат?
копия правки 147 из SVN'а?
Я вижу отличия. поэтому делай по первому пункту, но не сливай с мастером, как вытянишь мой клон, через меню "Внешние репозитарии" так отпишись

1. В мастер лежат новые исходники, которые к SVN никоим образом не относятся... т.е я эти исходники уже дорабатывал после правки №147 когда SVN был мертв. И я не заливал эти изменения (новые исходники) в SVN (т.к. он был в нагдауне)  - а залил в Git в мастер!

2. Я сравнил Git master твой и мой и обнаружил, что дерево исходных кодов и у тебя и у меня одинаковое. С той лишь разницей, что у тебя там есть история коммитов..

Поэтому, имхо, можно действовать по п.2 :) ...  Если что - восстановить всегда можно. Давай, делай уже мне Merge  ;D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 24, 2010, 17:56
>>т.е я эти исходники уже дорабатывал после правки №147
вот и я про тоже, у тебя версия свежее, будет куча конфликтов.
Нужно наоборот, в мою ветку слить твой master.

Ну да ладно, я слил как положено у себя в хранилище и отправил тебе запрос на слияние.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2010, 18:50
Вроде слил.. а вроде и не слил....  Проверь пжлста.. Почему - то висит твой запрос на слияние.. Его нужно закрывать после слияния?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 24, 2010, 19:28
Инструкция:
* в Git GUI своего локального хранилища "Вспомогательные операции" -> "Добавить"
* в открывшемся диалоге:
** "Название" = merge_request
** "Команда" = git pull git://gitorious.org/qserialdevice/qserialdevice.git refs/merge-requests/$ARGS
** ставим галки: "показать диалог перед запуском" -> "Запрос доп аргументов"
* нажимаем кнопку "Добавить"
(Эти команды полагалось в водить в консоли, но я ленивый)

Теперь, мы можем создать ветку от текущего мастера, например "integration", чтобы его не коцать. (Смотри меню "Ветки")

Вытаскиваем запрос на слияние из гиториуса:
* "Вспомогательные операции" -> "merge_request"
* В появившемся диалоге запроса параметров, введи номер запроса на слияние, можно посмотреть в адресе:
Цитировать
http://gitorious.org/qserialdevice/qserialdevice/merge_requests/1

После того, как ты изучишь изменения сливаешь так:
Переходишь в ветку master (или ту в которую хочешь слить), затем меню "слияние". Если конфликтов нет, то будет тишина.

Затем отправляешь ветвь мастер на гиториус, чтобы её там обновить.

вот оригинальная инструкция:
Код
Bash
One way to merge in these changes is to pull them into a local branch for review, verifying the changes and then merge to back to master.
# Check out a new branch for integration
git checkout -b integration
 
# Fetch the merge request into this branch
git pull \
 git://gitorious.org/qserialdevice/qserialdevice.git \
 refs/merge-requests/1
 
# Show the commits, assess they are okay
git log --pretty=oneline --abbrev-commit master..integration
 
# To apply the changes to your master branch:
git checkout master
git merge integration
git push origin master



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2010, 20:23
Вот на этих пунктах:
Цитировать
Вытаскиваем запрос на слияние из гиториуса:
* "Вспомогательные операции" -> "merge_request"
* В появившемся диалоге запроса параметров, введи номер запроса на слияние, можно посмотреть в адресе:
Цитировать
http://gitorious.org/qserialdevice/qserialdevice/merge_requests/1

Выскакивает диалоговое окно " ... Вспомогательные операции merge_requests "

c ошибкой красным цветом:

Цитировать
fatal: Couldn't find remote ref refs/merge-requests/http


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 24, 2010, 21:14
c ошибкой красным цветом:

Цитировать
fatal: Couldn't find remote ref refs/merge-requests/http
ты не внимательно читаешь:
Цитировать
В появившемся диалоге запроса параметров, введи номер запроса на слияние, можно посмотреть в адресе:
и в адресе я выделил, что посмотреть.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 25, 2010, 20:43
Что-то  опять не получается. Решил с нуля все начать:
1. Удалил на компе директорию в которой находился локальный репозитарий (вместе с .git)
2. Запустил Git-GUI
3. В показавшемся диалоге выбрал "Склонировать существующий репозиторий"
4. Показались поля ввода:
 "исходное положение" вставил: git://gitorious.org/qserialdevice/qserialdevice.git
 "каталог назначения" вставил путь типа D:\Git\qserialdevice (т.е. чтобы сюда слить)
5. Жмакнул "склонировать"
6. Программа создала у меня в D:\Git\qserialdevice дерево исходных кодов проекта
7. Одновременно с этим открылось окно с з-мя фреймами:
 красный - Изменено (не будет сохранено) - пустой
 зеленый - Подготовлено (будетсохранено) - пустой
 желтый - пустой.

Текущая ветвь : master

В пункте меню "Внешние репозитории"->"Получение из" : origin

8. В пункте "Вспомогательные операции"->"Добавить" пишу:
 Название : merge_request
 Команда : git pull git://gitorious.org/qserialdevice/qserialdevice.git refs/merge-requests/$ARGS

Ставлю галки: "Показать диалог перед запуском"->"Запрос доп аргументов"
9. Жму "Add"

10. В меню "Ветвь"->"Создать" пишу:
 Название: integration

При этом курсор в окне подсвечивает синим "локальная ветвь" - master
Остальное по умолчанию остается.
11. Жмакаю "Создать"
12. В главном окне Git-GUI теперь стало:
Текущая ветвь: integration
Фреймы:
 красный - Изменено (не будет сохранено) - пустой
 зеленый - Подготовлено (будетсохранено) - пустой
 желтый - пустой.

13. В пункте меню "Вспомогательные операции"->merge_request
пишу в поле Аргументы : 1

14. Жму "ОК"
15. Программа сообщает что процесс успешно завершен.

16. Я проверяю что это так:выбираю  в меню "Репозиторий"->"Показать историю ветви: integration" и вижу что есть история коммитов которая была в SVN.

17. В меню "Ветвь"->"Перейти" выбираю master.
18. Жму "Перейти"
19. Теперь у меня в главном окне с фреймами Текущая ветвь : master , при этом фреймы пустые.
20. Выбираю меню "Слияние"->"Локальное слияние" и выбираю :
Локальная ветвь : integration
21. Жму "Слияние"
22. Программа говорит что процесс успешно завершен.
23. Проверяю (аналогично п. 16) . Все ОК.. История есть.

24. Выбираю меню "Внешние репозитории"->"Отправить"
Выбираю
Исходные ветви: master
Репозиторий назначения :Внешний: origin
Ставлю галку: Намеренно переписать существующую ветвь

25. Жму "Отправить"
26. Получаю:

Цитировать
Pushing to git://gitorious.org/qserialdevice/qserialdevice.git
fatal: protocol error: expected sha/ref, got '
----------------------------------------------
The git:// protocol is read-only.

Please use the push url as listed on the repository page.
----------------------------------------------'

Ошибка: не удалось выполнить команду.

------------

ЧЯДНТ?










   


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 25, 2010, 21:12
Чтобы отправлять, нужен "push URL" (адрес для отправки), владельцу хранилища он обычно по умолчанию показывается.
Обычно используют SSH, тогда адрес выглядит примерно так:
git@gitorious.org:~lit-uriy/qserialdevice/lit-uriys-qserialdevice.git


посмотри его на Гиториусе, затем
в файле .git/config
исправь в разделе origin адрес:
git://gitorious.org/qserialdevice/qserialdevice.git
на "push URL"

На гиториусе возле адреса знак вопроса есть, глянь туда, должен увидеть примерно такую инструкцию:
Цитировать
Adding this repository as a pushable origin:
git remote add origin git@gitorious.org:~lit-uriy/qserialdevice/lit-uriys-qserialdevice.git
# to push the master branch to the origin remote we added above:
git push origin master
# after that you can just do:
git push



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 25, 2010, 21:25
lit-uriy ,

все, вроде получилось. Спасибо!  ::)

Делал так:

1. Залогинился на gitorgious
2. Посмотрел там адрес.
3. В Git-GUI в меню "Внешние репозитории"->"добавить"

Добавил репозиторий с названием "OK" и адресом из п.2.
При этом галку поставил "Ничего не делать"

4. Выполнил п.24,25 из предыдущего моего поста с той лишь разницей, что в качестве репозитория назначения выбрал с меткой "OK"
5. Отправка без ошибок прошла..

6. Чтобы проверить выполнил п.  1-6 предыдущего поста а потом п. 16.
7. Вроде все нормально..

--------------

Только на сайте висит запрос.. Его нужно закрыть?

---

Все.. вроде закрыл.. вопрос снимается


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 25, 2010, 22:25
>>Его нужно закрыть?
На будущее: если ты слил изменения, то не закрывай, а выбирай статус "Merged", чтобы тот, кто посылает запрос знал, что изменение было принято.
Если отклоняешь, то соответствующий статус и комментарий, почему отклонено.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 02, 2010, 18:16
юрамеханик,

вроде бы я исправил код, должно работать, проверьте!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 03, 2010, 17:16
Недавно столкнулся с проблемой под *.nix (также и в MacOSX) , которая заключается в следующем:

если извлечь открытый порт (преобразователь USB/Serial) из PC происходит вечное излучение сигнала readyRead()!!!

т.е. срабатывает QSocketNotifier типа Read, т.е. реально вызов ::select() начинает возвращать > 0 как будто бы в порт пришли данные. Но реально никаких данных там и в помине нет!!! Почему так происходит я не знаю. Нужно разбираться.
Пока эта проблема не решена!!!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 03, 2010, 17:36
>>Нужно разбираться.
может стоит написать автору драйвера?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Magvaj от Июль 04, 2010, 09:46
kuzulis, тут повылазили проблемки. Очень неприятные. Отписываю.

1) Под виндой при попытке опросить порт, скажем COM1, где никого нет- библиотека повисает внутри себя. Версия 0.2. Виснет намертво. Пробовали на 3-х компах.
2) При работе с расширителями портов(типа USB-Com или PCI-Com) частенько присылает неправильные данные. Благо оборудование отправляет CRC и я эти пакеты быстро дефектую. Пробовал QExtSerialPort- данные тоже не всегда правильные, но реже. С другими библиотеками данные правильные всегда.
3) Под линью на версии 0.2 библиотека даже последней сборки не освобождает открытый порт. Приходится пользовать версию 0.1.
4) Прислали тут хитрое устройство- убил два дня, пытаясь понять где беда. Библиотека версии 0.1 отправляет данные нормально, но принимает всякую ерунду, то байт один не дошлёт, то дублирует сообщение два раза. Версия 0.2 вылетает сразу при попытке что-то прочитать. Устройство сейчас работает на QExtSerialPort. Смысл в том, что устройство очень критично к таймаутам и лишним чтениям. Нет ли в библиотеке лишних очисток или проверок порта?
5) есть такие хитрые чековые принтеры- они подключены по USB, но настраиваются через драйвер Virtual Com для прямого доступа к ним. Так вот, если при такой ситуации открывать порт на версии 0.2 винда валится в синий экран. Нашёл драйвер по новее. Синий экран перестал беспокоить. НО! При попытке удалить экземпляр класса QSerialDevice- прога повисает намертво. Если сначала вручную закрыть порт, а потом сделать delete- всё отлично. Но прога имеет свойсто быть убитой извне. Поэтому повисания довольно неприятны. На других библиотеках повисаний и синих экранов не наблюдается.

По всем пунктам, если потребуется, могу выслать подробные логи записи/чтения порта.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 04, 2010, 11:09
А про какие другие библиотеки речь идёт?
и на какой ОСьке происходят все эти казусы?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 04, 2010, 17:29
Цитировать
может стоит написать автору драйвера?
Эт все хорошо, но по ходу сразу у нескольких девайсов такая ситуация появляется.
Юрий, не можешь проверить со своим шнурком? У тебя же он наверное имеется? :)
Я проверял на шнурке с чипом PL2303 у меня под Linux косячит.
Также один итальянец под MacOSX проверял (только не знаю что у него за шнурок) - и у него тоже косяки.

2 Magvaj,

используй из Git-а библиотеку. И если и тут будет нечто такое же - то присылай готовый компилящийся тестовый проект который воспроизводит твои проблемы. Может что не так делаешь!?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 04, 2010, 18:02
kuzulis у меня только виндовоз


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 04, 2010, 18:26
Цитировать
Цитата
kuzulis у меня только виндовоз
Жаль.

---

Итак, я обновил Git и теперь чтобы продемонстрировать сей баг - нужно просто собрать пример /examples/sreader , запустить его а потом выдернуть шнурок. И программка начнет вечно читать то чего нету :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Июль 07, 2010, 18:10
Отзыв и предложение: Почему бы в документации не написать как эти классы прикрутить к проекту, в каких *.h эти классы описаны? например что-то типа

"В *.pro файл добавте
INCLUDEPATH     += D:\soft\Qt\serportM\trunk\qserialdevice
QMAKE_LIBDIR    += D:\Soft\Qt\serportM\trunk\build\lib\qintegratedserialdevice\release
LIBS            += -lqserialdevice"

А то приходится по примерам лазить. Мелочь - а не приятно. Ну хотя бы какой *.h файл включать нужно - это уж в первую очередь нужно было в доке прописать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Июль 07, 2010, 18:30
хотя "См. определение в файле serialdeviceinfo.h  строка 35" - нашел, но где-то в конце описания. В асистанте - название класса, файл описания. В справочнике на с++ перед описанием функции или класса - инклуде
Цитировать
atoi()

#include <stdlib.h>
int atoi(const char *str);
  В справочник на СИ - аналогично. А тут как-то всё наоборот, сначало
Цитировать
Начало работы с классом необходимо начинать с создания экземпляра объекта SerialDeviceInfo.
Пример:
Код:
        ...
        SerialDeviceInfo *sdi = new SerialDeviceInfo(this);
        ...
Пробую по примеру создать - не компилируется. нужен инклуде. лазишь по примерам, находишь. Далее делаешь постепенно все по тексту,,,,, описание заканчивается. в самом конце контакты автора и вдруг "См. определение в файле serialdeviceinfo.h  строка 35" ))


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Magvaj от Июль 13, 2010, 09:55
А про какие другие библиотеки речь идёт?
и на какой ОСьке происходят все эти казусы?


либы: winapi, qextserialport, какойто qserial и прочие.. многие перепробовал.. но они весьма неудобны.
проблемы на разных осях- в винде в основном проблемы с пустыми портами и виртуальными. под линью- самая крупная проблема это ненормальное закрытие порта на версии 0.2

2 Magvaj,

используй из Git-а библиотеку. И если и тут будет нечто такое же - то присылай готовый компилящийся тестовый проект который воспроизводит твои проблемы. Может что не так делаешь!?

использовал из гита- не помогает... в скорем времени выдерну весь код для работы с портами и пришлю. сейчас могу отделаться только логами. сдаём проект,времени нема.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 13, 2010, 16:51
>>какойто qserial
это обёртка над qextserialport


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: zenden от Июль 13, 2010, 19:45
Так эту библиотеку можно использовать в не Qt приложениях?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 13, 2010, 20:18
её придётся дорабатывать для этого. Но зависимости от Qt останутся


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июль 16, 2010, 23:11
Большое спасибо за проделанную работу. Не хочу показаться умником, но хотелось бы, чтобы в в папку своего проекта
    - в include/qserialdevice скопировать abstractserial.h, serialdeviceinfo.h, serialdevicewatcher.h
    - в lib - libqserialdevice.a
Проблема 1: зависимость abstractserial от "../qserialdevice_global.h", который тоже придеться копировать. Можно конечно править руками, но не хочеться лишний раз вмешиваться.
Проблема 2: если я не включаю qobject.h раньше serialdevicewatcher.h, наблюдателю за последовательным портом не хватает QObject. Те в serialdevicewatcher.h необходимо включение  <QtCore/QObject>
Возможно макросы экспорта более красиво делать как trolltech (ссылка на источник qthelp://com.trolltech.qt.460/qdoc/sharedlibrary.html)
Код:
#if defined(MYSHAREDLIB_LIBRARY)
 #  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
 #else
.........
class MYSHAREDLIB_EXPORT MyClass



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июль 17, 2010, 13:49
юрамеханик,

вроде бы я исправил код, должно работать, проверьте!
работает , но только один раз, так сказать с "защелкиванием" -
при первой посылки сигнала hasChanged  при вызове setEnabled
в случае, если шнурок был в системе до вызова setEnabled,  то посылается сигнал hasChanged
и я вижу номер порта , но затем при любых манипуляциях с портом (всовываем высовываем) этот сигнал уже не посылается
в случае если шнурка не было в системе до этого момента, то посылается сигнал hasChanged с теми портами что есть (какой то виртуальный у меня имеется порт , хотя как его убрать не знаю) , затем подсоединяем шнурок, сигнал высылается еще раз и я вижу номер нужного порта , и затем опять при любых манипуляциях сигнал уже больше не высылается

что интересно во втором случае при получении номера порта я не могу его открыть
signalStatus возвращает строку Error Openig. Error!
, а SerialDeviceInfo::isBisy()  возвращает false
как мне вытащить номер системной ошибки наподобие GetLastError  в винАпи?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 18, 2010, 14:14
2 Филоненко Михаил,

Цитировать
Проблема 1: зависимость abstractserial от "../qserialdevice_global.h", который тоже придеться копировать. Можно конечно править руками, но не хочеться лишний раз вмешиваться.
Цитировать
зможно макросы экспорта более красиво делать как trolltech (ссылка на источник qthelp://com.trolltech.qt.460/qdoc/sharedlibrary.html)

Да, это все так. Но я "навертел" макросы таким образом для того чтобы без проблем можно было бы собирать и использовать библиотеку как статически/кую так и динамически/кую. Если делать как по инструкции то ЭТО работает только для динамических библиотек.

Цитировать
Проблема 2: если я не включаю qobject.h раньше serialdevicewatcher.h, наблюдателю за последовательным портом не хватает QObject. Те в serialdevicewatcher.h необходимо включение  <QtCore/QObject>

Ок, если не забуду - добавлю.

2 юрамеханик,
 Ох.. разберайтесь значит сами :) . Ваш шнурок - вам и карты в руки. Решите проблему - присылайте патч.
Это все имхо, глюки драйвера и т.п.

Цитировать
как мне вытащить номер системной ошибки наподобие GetLastError  в винАпи?
Ну и используйте GetLastError. По аналогии как в классе SerialDeviceInfo.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июль 18, 2010, 15:35
Ну и используйте GetLastError. По аналогии как в классе SerialDeviceInfo.
разобрался ,всего лишь надо было добавить qt_windows.h ,
 при ошибке, которую я описал выше, при вызове данной функции я получаю ноль , то-бишь "все хорошо", что странно


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: юрамеханик от Июль 18, 2010, 15:55
2 юрамеханик,
 Ох.. разберайтесь значит сами :) . Ваш шнурок - вам и карты в руки. Решите проблему - присылайте патч.
Это все имхо, глюки драйвера и т.п.

ну тут многое в теме можно было списать на глюки драйверов , да вот не списали а решение нашли  :)
я конечно понимаю, что низкоквалифицированные тестеры  типа меня порой могут вывести разработчика на тропу еще больших багов, но раз уж взялись то будьте любезны быть терпеливым
Если с меня требуется какая то дополнительная информация по проблеме, проведения дополнительных программных  тестов  и т.д. то я всегда готов , главное укажите  мне путь.
А вот копаться в вашем коде мне пока ни время ни квалификация не позволяют.
я же выкладывал вам необходимые ключи реестра и следил, как они себя ведут при включении выключении , судя по количеству скачиваний вы их  и не смотрели (хотя может это и не нужно было я не знаю)

я  вообще на вашу библиотеку (да и вообще на qt   с VS и с сpp билдера) перешел поскольку у вас была обещана  обещана возможность слежения за портами  в случае если они открыты ну и соответственно трезвой работы "читалки"  в случае пропадания порта в системе

так что пока  видимо придется использовать "смотрелку" из старой версии  библиотеки  +  дополнительные таймеры на задержку прихода пакетов, а "читалку" из новой


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Август 05, 2010, 22:46
Доброго времени суток. Мне нужно написать программу для управления устройством через COM порт. Для связи с устройством используется CP210x USB to UART Bridge Controller. Необходимо выполнять стандартные операции (запись/считывание). Решил выбрать для реализации библиотеку QSerialDevice.
Использование примеров желаемого результата не дало (например writer): порт открывается, но то ли запись не происходит, то ли устройство не реагирует. Однако, когда пробую произвести запись через стандартный HyperTerminal в Windows, то устройство реагирует (при записи например "KEY=R"  в устройстве происходит переход по меню вправо).
Подскажите пожалуйста, что я не так делаю? Ато уже мозг себе сломал....


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Август 05, 2010, 23:36
Установить какой-нибудь снифер COM порта и сравнить трафик гипертерминала и своей программы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: labview от Август 05, 2010, 23:39
Подслушай с помощью Free Serial Port Monitor на самом ли деле ты отправляешь то же самое, что и через Hyper Terminal. Причин может быть много - настройки порта, терминаторный символ (ы), или Hardware Handshake. Так же некоторые USB адаптеры (я знаю, что их всего два типа FTDI и Prolific) не одинаково хорошо/плохо поддерживаются разными библиотеками.

ЗЫ пока писал уже ответили  :D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: eugene от Август 06, 2010, 07:07
Доброго времени суток. Мне нужно написать программу для управления устройством через COM порт. Для связи с устройством используется CP210x USB to UART Bridge Controller. Необходимо выполнять стандартные операции (запись/считывание). Решил выбрать для реализации библиотеку QSerialDevice.
Использование примеров желаемого результата не дало (например writer): порт открывается, но то ли запись не происходит, то ли устройство не реагирует. Однако, когда пробую произвести запись через стандартный HyperTerminal в Windows, то устройство реагирует (при записи например "KEY=R"  в устройстве происходит переход по меню вправо).
Подскажите пожалуйста, что я не так делаю? Ато уже мозг себе сломал....
Проверь настройки порта. Я работаю с этой библиотекой и c переходником сделаным на CP210x USB to UART. Всё работает отлично.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Август 06, 2010, 08:00
Настройки проверил - все правильные... сейчас буду пробовать со снифером.
to: eugene
А можно посмотреть работающую программу, если не затруднит?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Август 06, 2010, 12:36
Ура  :) спасибо за снифер. С его помощью определил, что был неправильный формат пакета - нужно было в конце добавлять символ возврата коретки (а в гипертерминале это происходит после нажатия enter).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Август 11, 2010, 12:32
Подскажите пожалуйста как прикрутить библиотеку к своему проекту... по аналогии с примерами не получилось. При сборке выскакивает ошибка:
c:/qt/4.6.2/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot find -lqserialdevice.
Пути вроде все прописывал правильно. Если можно, то по-подробнее...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 11, 2010, 13:48
Aibalit,

Чтобы не "заморачиваться" - проще прикрутить либу, прикрутив *.pri !!!
Это при условии, что Вам требуется ее статически слинковать с вашим проектом (это тоже самое что и делается в примерах,
только в примерах используется уже скомпиленная библиотека, но Вы можете использовать сорцы *.pri не компиля библиотеку - а компиля
сразу ваш проект).

Цитировать
Пути вроде все прописывал правильно. Если можно, то по-подробнее...

Если все-таки не передумали, то:
1. Покажите *.pro вашего проекта.
2. Приведите структуру каталогов где лежит либа и где лежит ваш проект



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 12, 2010, 19:59
Сегодня добавил новый класс SerialDeviceEnumerator который в будущем должен заменить два класса: SerialDeviceWatcher+SerialDeviceInfo (т.е. я их планирую удалить вообще).  В новом классе по идее должны работать любые девайсы.. Прошу потестить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Август 13, 2010, 13:34
kuzulis,

1) *.pro
TARGET = Proga
TEMPLATE = app


OBJECTS_DIR     = ../../build/obj
MOC_DIR         = ../../build/moc

DEPENDDIR       = .
INCLUDEDIR      = .

DEPENDPATH      += .
INCLUDEPATH     += ../../qserialdevice

QMAKE_LIBDIR    += ../../qintegratedserialdevice/release

HEADERS  += dialog.h\

SOURCES += main.cpp \
        dialog.cpp\


LIBS       += -lqserialdevice

FORMS    += dialog.ui
 

2) Соответственно в корневой директории лежит папка qserialdevice и qintegratedserialdevice (их внутренняя структура  аналогична примерам).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: ufna от Август 13, 2010, 13:35
а у меня вопрос - для WinCE планируется или вообще когда нибудь ожидается? :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 13, 2010, 14:21
2 Aibalit,

И?

2 ufna,

Цитировать
а у меня вопрос - для WinCE планируется или вообще когда нибудь ожидается? Улыбающийся

Я делать это не собираюсь. Сами сделайте, раз у вас есть девайсы с Win CE


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: ufna от Август 13, 2010, 14:47
ну я для WinCE ручками WinAPI юзаю. Хотел в твоей библиотеке класс унаследовать, а поковырялся - там в первичном классе для WinCE "невозможно" сделано. Просто очень много людей меня спрашиваю как с COM на WinCE работать, мучаются пытаясь заставить либы работать, но толку то - там другой тип чтения данных. Мое дело спросить, спасибо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 13, 2010, 15:47
Цитировать
ну я для WinCE ручками WinAPI юзаю.

Ну так поделился бы кодом бы., если б хотел бы чтобы WinCE пподдерживалось. А то шото хотите - а взамен ничо не даете! :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: ufna от Август 13, 2010, 16:37
Дак тут все просто.

Подключение к COM порту:

Код
C++ (Qt)
   hComm = CreateFile( "COM1:",
       GENERIC_READ | GENERIC_WRITE,
       0,
       0,
       OPEN_EXISTING,
       FILE_FLAG_OVERLAPPED,
       0);
 
   if (INVALID_HANDLE_VALUE == hComm) {
       qDebug("Unable to open the port");
       return false;
   }
 
   GetCommState(hComm, &PortDCB);
   PortDCB.BaudRate = m_baudRate;
 
   if (FALSE == SetCommState(hComm, &PortDCB)) {
       qDebug("Unable to configure the serial port");
       return false;
   }

Чтение:

Код
C++ (Qt)
   DWORD lpNumberOfBytesRead;
   char* lpBuffer = new char[m_readBufferLength];
 
   ReadFile(
       hComm,
       lpBuffer,
       m_readBufferLength,
       &lpNumberOfBytesRead,
       NULL);

Просто на WinCE читать получается только так.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Август 13, 2010, 20:50
kuzulis,


Если все-таки не передумали, то:
1. Покажите *.pro вашего проекта.
2. Приведите структуру каталогов где лежит либа и где лежит ваш проект


вот я структуру привел... так что весь во внимании как прикрутить либу?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 14, 2010, 14:53
2 Aibalit,

я жду по библиотеке вопросов несколько иного характера нежели "как прикрутить". У меня нет никакого желания разбираться с вопросами типа "как прикрутить".. Честно.. Без обид... У вас есть примеры.. У вас есть все чтобы разобраться самому. Меняйте как вам угодно *.pri, *.pro, делайте структуру каталогов проекта так как вам хочется. Пробуйте, экспериментируйте...

Наводящий вам ответ: поиграйтесь с "../" в QMAKE_LIBDIR и INCLUDEPATH . Удачи.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: labview от Сентябрь 06, 2010, 13:43
Здрасьте!

Насколько я понимаю главным отличием этой библиотеки от QExtSerialPort является возможность передачи данных в синхронном режиме. Поясните пожалуйста, что имеется в виду?

Для синхронного режима нужен дополнительный такт между партнёрами и скорость передачи данных задаётся этим тактом, а не устанавливается в настройках при открытии. Для этого по-моему используются (кроме обычных RX/TX и GND) дополнительные линии:
RTS, CTS, DSR и прочие.

Получается эта библиотека поддерживает такую связь, а другая нет? Я правильно понимаю?

Спасибо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 06, 2010, 14:16
Нет. Режим только асинхронный (на физическом уровне).  Синхронный режим м/сх UART в PC не поддерживают.
Откуда вы про синхронный вообще прочитали? о_О

Просто когда еще я создавал библиотеку QSerialDevice , то у QextSerialPort и в помине небыло асинхронного режима.
Т.е. под асинхронным в данном случае понимается неблокирующий режим с использованием для ожидания данных объектов ядра ОС.
Это потом уже они добавили режимы EvenDrive и т.п.

Т.е. у меня при чтении данных на "низком уровне" драйвер порта не ждет следующего байта, а возвращает сразу всё что есть в данный момент в приемном буфере, но на более "высоком уровне" (в моем коде) это ожидание реализуется иными способами.

В общем, читайте документацию и смотрите код. 

ЗЫ: так вот путаница в названиях и повелась с тех пор. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: labview от Сентябрь 06, 2010, 15:12
Просто когда еще я создавал библиотеку QSerialDevice , то у QextSerialPort и в помине небыло асинхронного режима.
Т.е. под асинхронным в данном случае понимается неблокирующий режим с использованием для ожидания данных объектов ядра ОС.

Понятно, спасибо за разьяснения.
Разница в терминологии.
Пожалуйста, не нужно путать людей синхорнным/асинхронным режимом работы порта и polling/event based программированием/использованием драйвера порта.

По-Вашему получается QExtSerialPort раньше не поддерживал асинхронный режим, значит он поддерживал синхронный? И тут же пишите, что PC UART вообще не поддерживает синхронный режим. То, что вы подразумеваете под асинхронностью в моём понимании асинхронностью не является.

Спасибо!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 06, 2010, 15:19
Цитировать
По-Вашему получается QExtSerialPort раньше не поддерживал асинхронный режим, значит он поддерживал синхронный? И тут же пишите, что PC UART вообще не поддерживает синхронный режим. То, что вы подразумеваете под асинхронностью в моём понимании асинхронностью не является.
Он (QExtSerialPort ) не поддерживал асинхронный I/O: http://msdn.microsoft.com/en-us/library/aa365683(v=VS.85).aspx для примера о чем я говорю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: labview от Сентябрь 06, 2010, 15:30
Разобрался, спасибо ещё раз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Сентябрь 17, 2010, 06:04
где используется время установленное функцией setCharIntervalTimeout? в read?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 17, 2010, 07:29
Цитировать
где используется время установленное функцией setCharIntervalTimeout? в read?
В принципе ДА, а точнее в методах nativeSelect, которые используются при чтении.
В общем, ожидает символ с помощью select (unix) или WaitSingleObject (win).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Aibalit от Сентябрь 22, 2010, 16:41
Подскажите пожалуйста, как программным образом определить имя COM порта, на который село устройство (CP210x USB to UART Bridge Controller)?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 23, 2010, 07:25
Посмотри тут: http://forum.vingrad.ru/forum/topic-309616.html


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: alexcpp от Сентябрь 29, 2010, 01:07
Здравствуйте.
Не осилил всю тему.
Не понял одного: зачем "это" ?
Есть прекрасная, мультиплатформенная, асинхронная, потокобезопасная, паттерн-ориентированная библиотека. Зовется Asio (http://think-async.com/Asio/). Находится на рассмотрении во включение в стандарт С++. В ней, помимо работы с COM портами, есть все что необходимо для реализации асинхронной работы с потоками, сетью, дескрипторами ввода-вывода.
Искренне не понял смысл этого создания.

спасибо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 29, 2010, 07:30
2 alexcpp

Вот если бы Вы писали код только на С++ или использовали Boost - то пожалуйста, используйте то что хотите.
Использование Qt классов при этом неуместно.
Но если вы пишете на Qt - то "не очень" уместно в некоторых случаях использовать сторонние библиотеки.

QSerialDevice создан как класс, который использует не просто асинхронный IO (тут можно было и не придумывать вообще ничего) , а он использует все "фичи" Qt, т.е. он и сделан в Qt-like стиле по аналогии с QAbstractSocket.

Если следовать вашей мысли, то и QAbstractSocket в Qt нафиг не нужен!? Ведь можно использовать Boost или еще что нибудь. И если продолжить - то и вообще Qt не нужно?! Так? (по крайней мере те классы которые не есть компоненты GUI)!

Если честно, то для меня Ваш вопрос странен.. Такое впечатление что это вброс какой-то чтобы пофлеймить...

Имхо. 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Denjs от Сентябрь 29, 2010, 13:10
Есть прекрасная, мультиплатформенная, асинхронная, потокобезопасная, паттерн-ориентированная библиотека. Зовется Asio (http://think-async.com/Asio/). Находится на рассмотрении во включение в стандарт С++.
Asio умеет использовать signal-slot? её объекты можно погрузить в QtScriptEngine? она знает о существовании системы метаданных QT (которая иногда таки очень полезна)? она умеет работать с QByteArray и QString?
нет?  у вас ещё есть вопросы?

Находится на рассмотрении во включение в стандарт С++.
Ну и отлично) когда её включат в C++, а значит и в gcc и mingw - (возможно) будем пользовать)))))

ну и конечно, сердечно желаем Asio обзавестись QT-оберткой)))


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Декабрь 14, 2010, 11:35
kuzulis, прошу обратить внимание.
Под WinXP(32bit) происходит вот что:
Сделал по примеру чтение по сигналу readyRead() в "привязаном" слоте определяется количество принятых байтов, проверка на размер, и их чтение. Под WinXP(32bit) приходят сигналы, а количество равно нулю. И если не сделать чтение, сигналы больше не приходят.
p.s. linux версия работает


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 14, 2010, 13:03
Пример кода в студию. Как открывали порт, как конфигурировали, как проверяли кол-во байт и т.п.
Но лучше всего, приведите готовый минимальный компилябельный проект.
--
Ещё: про какую версию библиотеки Вы говорите: 0.3.0 или текущую ветку master?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Декабрь 14, 2010, 16:42
Прошу прощения, что не указал.
Значит версия 0.3.0, взял с git 13.11.10 (в Readme_ru.txt написано 0.2.0)
Пример кода в студию. Как открывали порт, как конфигурировали, как проверяли кол-во байт и т.п.
Но лучше всего, приведите готовый минимальный компилябельный проект.
--
Ещё: про какую версию библиотеки Вы говорите: 0.3.0 или текущую ветку master?

Всё привести вряд ли смогу.
Код:
void MainWindow::slot_readUart()
{
    // Поставил на всякий случай
    if (!m_pSerial->isOpen()) {
        return;
    }

    qint64 numBytes;
    numBytes = m_pSerial->bytesAvailable();
    if ( numBytes < 0) {
        m_pSerial->close();
        //qDebug("Read port error %ld", m_pSerial->lastError());
        qDebug("Read port error ");
        return;
    }
    if ( numBytes == 0) {
        //qDebug("Read 0");
        // Windows patch
        m_pSerial->read(numBytes);
        return;
    }
....
}
Открытие:
Код:
#if defined(Q_OS_WIN32)
        m_pSerial->setDeviceName(m_pCBSerialPort->currentText());
#else
        m_pSerial->setDeviceName(QString("/dev/") + m_pCBSerialPort->currentText());
#endif
        if (!m_pSerial->open(AbstractSerial::ReadWrite)) {
            qDebug("Error open port");
            return;
        }
/*
            qDebug() << "= New parameters =";
            qDebug() << "Device name            : " << m_pSerial->deviceName();
            qDebug() << "Baud rate              : " << m_pSerial->baudRate();
            qDebug() << "Data bits              : " << m_pSerial->dataBits();
            qDebug() << "Parity                 : " << m_pSerial->parity();
            qDebug() << "Stop bits              : " << m_pSerial->stopBits();
            qDebug() << "Flow                   : " << m_pSerial->flowControl();
            qDebug() << "Char timeout, msec     : " << m_pSerial->charIntervalTimeout();
//*/
        switch (m_pCBSerialSpeed->currentIndex()) {
        case 0: m_pSerial->setBaudRate(AbstractSerial::BaudRate1200);   break;
        case 1: m_pSerial->setBaudRate(AbstractSerial::BaudRate2400);   break;
        case 2: m_pSerial->setBaudRate(AbstractSerial::BaudRate4800);   break;
        case 3: m_pSerial->setBaudRate(AbstractSerial::BaudRate9600);   break;
        case 4: m_pSerial->setBaudRate(AbstractSerial::BaudRate19200);  break;
        case 5: m_pSerial->setBaudRate(AbstractSerial::BaudRate38400);  break;
        case 6: m_pSerial->setBaudRate(AbstractSerial::BaudRate57600);  break;
        case 7: m_pSerial->setBaudRate(AbstractSerial::BaudRate115200); break;
        }
        m_pSerial->setDataBits(AbstractSerial::DataBits8);
        m_pSerial->setParity(AbstractSerial::ParityNone);
        m_pSerial->setStopBits(AbstractSerial::StopBits1);
        m_pSerial->setFlowControl(AbstractSerial::FlowControlOff);
        m_pSerial->flush();
    }


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 14, 2010, 17:57
Цитировать
Значит версия 0.3.0, взял с git 13.11.10 (в Readme_ru.txt написано 0.2.0)
Да, это 0.3.0. , не смотрите на то что написано в Readme.

Цитировать
Сделал по примеру чтение по сигналу readyRead() в "привязаном" слоте определяется количество принятых байтов, проверка на размер, и их чтение. Под WinXP(32bit) приходят сигналы, а количество равно нулю.
хм.. у меня приходит так как надо (я изменил для этого пример sreader, где вместо readAll() вставил bytesAvailable() и вывожу в консоль количество принятых байт).
Тестировал на шнурке PL2303 и встроенном в мамку портом. Хотя, в винде может быть всё что угодно.

Цитировать
И если не сделать чтение, сигналы больше не приходят.
Да, в винде так и будет. Это её фича!  ;D
Сигнал приходит только в момент приема символа, после этого ничо не будет. Увы.
---
Могу только посоветовать использовать версию библиотеки из Master: http://gitorious.org/qserialdevice/qserialdevice/archive-tarball/master
может быть, оно поможет.





Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 15, 2010, 08:23
Цитировать
Сам по себе класс защищён от копирования (Q_DISABLE_COPY(AbstractSerial)), что очень сильно затрудняет его использование в множественных потоках. В принципе это правильно, так как последовательный порт, с которым мы работаем, является уникальным. Это гуд. Но каждый раз (при моих задачах) приходится его перемещать в нужный поток - это уже не гуд, я бы сказал просто мрак, тем более при отладке. Подумав на досуге, пришел к выводу, что нужно использовать статическую переменную isOpen, что позволит копировать экземпляр класса куда нам надо, со всеми его настройками. Естественно, что нам придётся при этом контролировать использование его IO - методов, то есть ставить что то вроде ioUsed или  какой-то мьютекс при приёме или передаче данных. Так же при этом возникнет ещё более (я бы сказал не слишком значительная) интересная задача. Связана она с тем, что в большинстве случаев нам приходится общаться с приборами в режиме запрос-ожидание-ответ. Тогда для этого режима надо будет ввести, что б не сильно напрягаться, пользовательский флаг монопольного доступа на некий промежуток времени, допустим до завершения некой операции, точнее до прихода ответа, ну если конечно не возникнет исключение таймаута ожидания.
Ох... Ну, раз Вы поняли что Вам надо, то пробуйте, я заниматься этим не буду.
Но ИМХО, вы не правильно спроектировали приложение.
В чем смысл перемещать объект в по разным потокам? Создали бы в одном потоке и всё, в чем проблема то?
Этож не "ночная бабочка" чтобы по рукам переходить! :)

Цитировать
PS: с проблемой получения перечней портов так ни фига и не поняли.
В смысле?
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: MrLink от Декабрь 15, 2010, 10:57
Да, в винде так и будет. Это её фича!  ;D
Сигнал приходит только в момент приема символа, после этого ничо не будет. Увы.
Делал у себя рефакторинг кода, поэтому и наткнулся на данную фичу. :) Лезть в исходники и разбираться, если честно, лень было, потому и написал. Да вообщем-то фиг с ним, главное теперь везде работает.
p.s. еще раз благодарю за библиотеку.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 22, 2010, 12:48
Важно!

Мне нужна консультация/мнения уважаемого сообщества по следующему вопросу:

Как известно,  в данный момент уведомления в классе SerialDeviceEnumerator для Windows реализованы через приватный Qt-класс QWinEventNotifier.
Этот класс "ловит" события при изменении соответствующей ветки в реестре.
Данный подход в принципе был бы "ничо так", если бы класс QWinEventNotifier не был бы приватным.

Я недавно реализовал уведомления (в Windows) иным способом: через создание окна (не QWidget) и отлова его мессаги WM_DEVICE_CHANGED через calbac-функцию окна (по аналогии с QEventDispatcherWin32).

* Так вот, стоит ли обновить репозиторий новым кодом?

В принципе, при этом, мы делаем наш код независимым от версии Qt, но при этом ухудшается возможность "интеграции" кода библиотеки в Qt4.

** Под интеграцией я подразумеваю гипотетическую возможность в будущем наложить некий патч на  исходники Qt чтобы добавить в неё поддержку последовательных портов как части Qt, т.е. при этом патчатся конфиги (*.pro и т.п.)  Qt и в опции configure добавляются опции для сборки QtSerial.
В будущем подумываю (есть мысли) , также создать некие патчи для интеграции QSerialDevice с исходниками Qt, чтобы была возможность собрать QSerialDevice  двумя путями:
1. Когда имеется уже откомпиленная Qt4 и мы хотим собрать QSerialDevice отдельно.
2. Когда имеются исходники Qt4 и мы хотим интегировать QSerialDevice туда и собрать всё это вместе.

Кто что думает по поводу * и **  ?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Декабрь 22, 2010, 13:41
* - стоит, т.к. использование окна Windows способ, мне кажется, прямее использования приватных внутренностей qt;
** - насколько это нужно и кому? Текущий вариант вполне лично меня устраивает.

Вышесказанное мнение - мое имхо, и т.д. и т.п. Спасибо за отличную библиотеку :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 22, 2010, 14:34
Цитировать
Под интеграцией я подразумеваю гипотетическую возможность в будущем наложить некий патч на  исходники Qt чтобы добавить в неё поддержку последовательных портов как части Qt

На MeeGo Conference 2010 общался с менеджерами Нокия по Qt части. Сами троли не будут и не желают добавлять поддержку работы с последовательным портом в Qt, т.к., грубо говоря, им это ненужно (хотя на Qt Dev Days 2010 дали надежду). При этом сказали, если есть наработки - смелее вливайте, только следуйте всем правилам оформления и прочее.

Так что могу сказать - давай!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 22, 2010, 14:42
Цитировать
WM_DEVICE_CHANGED

А разве это сообщение справедливо для подлючаемых последовательных устройств? И какой эвент ты обрабатываешь после прихода этого сообщения? (Если чесно, меня беспокоит жизнеспособность этого метода)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 22, 2010, 15:30
Цитировать
А разве это сообщение справедливо для подлючаемых последовательных устройств? И какой эвент ты обрабатываешь после прихода этого сообщения? (Если чесно, меня беспокоит жизнеспособность этого метода)
А больше никакой метод не "прокатит". Увы.

Использую стандартный виндовый подход., сначала:
Код:
...
    ::DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
    int size = sizeof(::DEV_BROADCAST_DEVICEINTERFACE);
    ::ZeroMemory(&notificationFilter, size);

    notificationFilter.dbcc_size = size;
    notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;

    size = sizeof(guidDevInterfaceList);
    for (int i = 0; i < size; i++) {
        notificationFilter.dbcc_classguid = guidDevInterfaceList[i];
        ::HDEVNOTIFY hDeviceNotify = ::RegisterDeviceNotification(this->internalHwnd, &notificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
        if (!hDeviceNotify) {
            // Handle the error...
            qWarning("Notificator: Failed call RegisterDeviceNotification: %d\n", (int)GetLastError());
        }
...
где :
this->internalHwnd - это дескриптор виндового окна созданного с помощью CreateWindowEx.
guidDevInterfaceList - список class-guid -ов для разного рода интерфейсов портов (в часности стандартный PORTS CLASS GUID).

Далее в callbac обработчике окна this->internalHwnd ловлю WM_DEVICECHANGE и "тупо" получаю список присутствующих в данный момент устройств в системе с помощью SetupDiGetClassDevs и SetupDiEnumDeviceInfo :
Код:
//callbac обработчик сообщений от окна
...
::LRESULT CALLBACK internal_proc(::HWND hwnd, ::UINT message, ::WPARAM wp, ::LPARAM lp)
{
    switch (message) {
    case WM_DEVICECHANGE: {
             //тут "тупо" перебор имеющихся в системе портов с помощью SetupDiGetClassDevs и SetupDiEnumDeviceInfo
        }
        break;
    default:
        return ::DefWindowProc(hwnd, message, wp, lp);
    }
    return 0;
}
...

Это вкратце.

Также винда предоставляет еще один способ, где в функции RegisterDeviceNotification вместо дескриптора окна можно подсунуть дескриптор сервиса, но для этого нужно сначала этот сервис создать, запустить и хз что еще с ним делать.
ИМХО, проще всего делать через дескриптор окна.

Иных решений я не вижу/не знаю/не представляю.

Цитировать
Сами троли не будут и не желают добавлять поддержку работы с последовательным портом в Qt, т.к., грубо говоря, им это ненужно (хотя на Qt Dev Days 2010 дали надежду). При этом сказали, если есть наработки - смелее вливайте, только следуйте всем правилам оформления и прочее.
Хм... Я тут http://bugreports.qt.nokia.com/browse/QTBUG-9980?focusedCommentId=125228&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel
предложил попробовать интегрировать QSerialDevice в Qt, но так ничо не получил в ответ от Nokia. ( Может не туда я предлагал?)
Хотя, еще рано об этом говорить (много ляпов в библиотеке + работает только в Linux/Win/Mac ).. Но попытка не тытка (с)






Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 22, 2010, 18:10
По поводу WM_DEVICECHANGE: как ты проверяешь приход этого эвента? Случайно не через эмулятор ком порта (USB-to-COM)? Насколько я знаю, то этот эвент приходит даже тогда, когда вставляешь\извлекаешь флешку, т.е. на каждый чиш ты будешь выполнять обновление портов. Как по мне, анализ ветки реестра самое то


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 22, 2010, 18:37
Цитата: pastor
По поводу WM_DEVICECHANGE: как ты проверяешь приход этого эвента? Случайно не через эмулятор ком порта (USB-to-COM)? Насколько я знаю, то этот эвент приходит даже тогда, когда вставляешь\извлекаешь флешку, т.е. на каждый чиш ты будешь выполнять обновление портов.
Блин, точно. Только что проверил (втыкал/вытыкал флешку) и WM_DEVICECHANGE тоже срабатывал!  :-[
Какой тогда глубинный смысл в Win API функции RegisterDeviceNotification , если в окно "сыпятся" мессаги от любого устройства?
Я то думал, что будут отлавливаться только те мессаги, на которые мы подписались.

Цитата: pastor
т.е. на каждый чиш ты будешь выполнять обновление портов. Как по мне, анализ ветки реестра самое то
Дык и с реестром тоже самое. В текущей реализации также отлавливается любое изменение в реестре по пути
"SYSTEM\\CurrentControlSet\\services"

Иначе никак. ИМХО.  :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Декабрь 22, 2010, 18:43
>> Так вот, стоит ли обновить репозиторий новым кодом?
просто сделай ветку, и отправь в хранилище. Кому надо тот возьмёт из неё вместо мастера


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 22, 2010, 18:55
Дык и с реестром тоже самое. В текущей реализации также отлавливается любое изменение в реестре по пути
"SYSTEM\\CurrentControlSet\\services"

Иначе никак. ИМХО.  :(

А почему обрабатывается эменнто этот путь реестра?

Года 4 назад мы также разрабатывали класс для работы с последовательным портом. Мы мониторили ветку "HKLM\HARDWARE\\DEVICEMAP\\SERIALCOMM". Здесь можно полусить список всех COM портов системы, а также отследить добавление\удаление виртуальных COM портов. Если нужно, есть пример "монитора", правда на Qt3


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 22, 2010, 19:24
Цитировать
А почему обрабатывается эменнто этот путь реестра?
Потому что если открыть порт и выдернуть его - то из этой ветки устройство не исчезнет! На crossplatform.ru уже обсуждали.

Цитировать
просто сделай ветку, и отправь в хранилище. Кому надо тот возьмёт из неё вместо мастера
А я не понял как ветки делать, т.е боюсь что после манипуляций моих я затру ветку master.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 22, 2010, 19:36
Потому что если открыть порт и выдернуть его - то из этой ветки устройство не исчезнет! На crossplatform.ru уже обсуждали.

Интересно, никогда не наблюдал такого. Кинь ссылку на топик.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 22, 2010, 19:53
Тут: http://www.forum.crossplatform.ru/index.php?showtopic=3012&hl=SERIALCOMM&st=40
см. начиная с поста №44 и далее.. №56 и т.п.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Hvzh от Декабрь 24, 2010, 10:58
kuzulis,

Попытался скомпилировать Вашу библиотеку под Виндозой используя MSVC 8.0. Компайлер споткнулся на файле nativeserialengine_win.cpp вот на этой строке:

   
Код:
 if (::WriteFile(this->descriptor, (PCVOID)data, (DWORD)len, &writeBytes, &this->oWrite))
 


Ему не понравился PCVOID. Все скомпилячилось после замены на LPCVOID. Как я понимаю, PCVOID - это приблуда mingw, для мелкософтовских компайлеров неприемлимая


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Barmaglodd от Декабрь 24, 2010, 11:34
Абсолютно точно надо через создание окна ловить события. Сам делал так (правда через QWindow и winEvent), т.к. с QWinEventNotifier (в вашей старой реализации :) ) периодический access violation в недрах системы обработки событий Qt при извлечении устройства. К тому же такая реализация проще для понимания, а в QWinEventNotifier чёрт ногу сломит.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 24, 2010, 11:52
Цитата: Hvzh
Ему не понравился PCVOID. Все скомпилячилось после замены на LPCVOID. Как я понимаю, PCVOID - это приблуда mingw, для мелкософтовских компайлеров неприемлимая
Ок, исправлю.

Цитата: Barmaglodd
Абсолютно точно надо через создание окна ловить события. Сам делал так (правда через QWindow и winEvent), т.к. с QWinEventNotifier (в вашей старой реализации :) ) периодический access violation в недрах системы обработки событий Qt при извлечении устройства. К тому же такая реализация проще для понимания, а в QWinEventNotifier чёрт ногу сломит.
Наоборот, через QWinEventNotifier  проще!
Тем более, QWinEventNotifier  используется в AbstractSerial для уведомлений для сигналов readyRead, dtrChanged и т.п.

Цитировать
периодический access violation в недрах системы обработки событий Qt
так нужно смотреть от чего это.

Я что то передумал что-то менять QWinEventNotifier на WM_blabla, т.к. всё-равно WM_blabla - это костыль (ИМХО).  :)
Понятно, что если отказываться от приватных методов, то заменить в классе SerialDeviceEnumerator  на WM_blabla в принципе можно, НО
не чем заменить QWinEventNotifier в классе AbstractSerial!

Мда, дилема.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Barmaglodd от Декабрь 24, 2010, 12:05
так нужно смотреть от чего это.
Я уже не найду этот код.
Вспомнил, я уже писал об этом http://www.prog.org.ru/index.php?topic=9537.msg65014#msg65014

чем заменить QWinEventNotifier в классе AbstractSerial!
Я заменил на поток, блокирующий IO и поллинг. Но это для моего узкого случая. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 24, 2010, 12:21
Цитировать
Я заменил на поток, блокирующий IO и поллинг. Но это для моего узкого случая.
Допустим 20 ком портов, тогда придется создавать 20 потоков!? ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Barmaglodd от Декабрь 24, 2010, 12:31
У меня сейчас в firefox'е 24 потока. ;) И я же не говорю, что это универсальное решение.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Декабрь 25, 2010, 19:57
>>Интересно, никогда не наблюдал такого. Кинь ссылку на топик.
Речь идёт об устройствах типа USB<->RS-485, кода пользователь выдёргивает на горячую такой переходник, то программисту хотелось бы иметь возможность отследить эту ситуацию


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 26, 2010, 14:33
Покопаюсь как будет время с своих исходниках, вроде такой проблемы у нас не было.  Мы работали с IrDA-tp-COM, USB-to-COM


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Декабрь 26, 2010, 14:50
Заглянул в свои исходники: у нас такое событие обрабатывалось извне библиотеки. В общем есть цикл в отдельном потоке, который проверяет кол-во доступных байт для чтения при помощи метода bytesWaiting. Если этот метод возвращает -1 (ошибка) мы закрываем порт и освобождаем ресурсы. Метод bytesWaiting асинхронный, реализованный при помощи WaitCommEvent и WaitForSingleObject


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Декабрь 27, 2010, 18:11
Потому что если открыть порт и выдернуть его - то из этой ветки устройство не исчезнет! На crossplatform.ru уже обсуждали.
Интересно, никогда не наблюдал такого. Кинь ссылку на топик.
начало тут (http://www.forum.crossplatform.ru/index.php?showtopic=3012&view=findpost&p=34397)

Если этот метод возвращает -1 (ошибка) мы закрываем порт и освобождаем ресурсы.
Моё (http://www.forum.crossplatform.ru/index.php?showtopic=3012&view=findpost&p=34418):
Цитировать
я использую QxtSerialPort в виндовозе, для отлова отключения преобразователя USB-RS232 при открытом порте всегда проверяю кол-во принятых байт. Драйвер FTDI'ного преобразователя всегда отрицательное значение возвращает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 27, 2010, 19:29
Цитировать
я использую QxtSerialPort в виндовозе, для отлова отключения преобразователя USB-RS232 при открытом порте всегда проверяю кол-во принятых байт. Драйвер FTDI'ного преобразователя всегда отрицательное значение возвращает.
А если, к примеру, байты начнут передаваться только через час, два, три (к примеру, так задумано) - то и о исчезновении устройства ты узнаешь тоже через час, два, три?!
А может и вообще не узнаешь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Декабрь 27, 2010, 19:34
>>то и о исчезновении устройства ты узнаешь тоже через час, два, три?!
да. Но на практике это и нестрашно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 08, 2011, 15:11
Доброго времени.
Цитировать
Да собственно проблема в следующем. Эта ошибка возникла у нас на рабочем месте разработчика и её можно обойти, раз, другой, изменяя предлагаемые исходники (что очень сильно надоедает). Но что если, она возникнет уже на стороне клиентов, использующих наш софт. Они же в первую очередь обратятся к нам и что мы им скажем? Разведём руками. Пинайте админа!? В лучшем случае, как говорят на востоке - потеряем лицо (не такие уж мы и гордые). А если вопрос возникнет в некий критический момент, да на нас потом всех собак спустят.
Ну так, для себя один раз измените исходники, они ж опен-сурц, в чем проблема?
Как вариант - возьмите очень старые исходники библиотеки на fireforge.net , там по моему, "тупо" читался реестр, может быть, этой проблемы не будет, измените их и добавьте себе.

Цитировать
Поэтому ещё раз прошу рассмотреть использование в библиотеке альтернативных вариантов получения списка портов.
Найдите альтернативное решение сами, предъявите их общественности (ну и мне) и, может быть, их можно будет добавить в основную ветку через дефайны.
Я сам не намерен этим заниматься.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 08, 2011, 18:25
Цитировать
Обнадёжьте хотя бы тем, что позже вы попытаетесь найти решение.
Увы, это будет костыль. Тем более, в
Цитировать
возьмите очень старые исходники библиотеки на fireforge.net
это было.

Смотрите, разбирайтесь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Январь 08, 2011, 19:32
Скачал тарбол qserialdevice_30122010_DTR_RTS.zip и что-то ненахожу я вызова функции SetupDiOpenDevRegKey, наверное по той причине что SerialDeviceEnumerator отсутствует в данном тарболе


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 08, 2011, 20:42
Цитировать
Скачал тарбол qserialdevice_30122010_DTR_RTS.zip
Ненене. Не качайте вообще ничего с вложений в этой теме, т.к. я на первую страницу (первый мой пост) заливаю промежуточные результаты при добавлении/тестировании новых фич сидя на работе.
Просто у нас (на работе) доступ к TCP/IP портам SVN или GIT закрыт и мне приходится сидя на работе (когда есть свободное время) что-то новое выкладывать таким образом, чтобы потом придя домой взять это отсюда и закоммитить в Git.  :)

Вот такая беда-беда.

А речь шла про старые исходники библиотеки в  https://fireforge.net/projects/qserialdevice/
там изначально были реализованы уведомления (и всё всё всё) без SetupDiOpenDevRegKey.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Январь 09, 2011, 21:57
Так откуда всё-же брать последние работоспособные версии?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 10, 2011, 08:20
Цитировать
Так откуда всё-же брать последние работоспособные версии?
http://gitorious.org/qserialdevice


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 27, 2011, 21:28
При ознакомлении с кодом библиотеки я обратил внимание на излишнюю ее сложность. Что заставляет очень много сил тратить на поиск нужных функций.
1. Зачем миллион приватных классов? (я так понимаю, класс сдирался с QAbstractSocket, который упоминается троллями, как пример неудачного проектирования)
2. Почему головной класс содержит слово Abstract? Как-будто им пользоваться напрямую нельзя и предполагается несколько вариантов реализации.
3. Зачем QSerialEnumerator следит за изменением списка доступных портов? Неужели это кому-то может быть нужно?!?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Январь 27, 2011, 22:04
п.3 - обсуждался выше


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 27, 2011, 22:22
Цитировать
1. Зачем миллион приватных классов? (я так понимаю, класс сдирался с QAbstractSocket, который упоминается троллями, как пример неудачного проектирования)
Да, сдирался.
Насчет упоминания о неудачном проектировании ссылочку пжлста.
Насчет милиона приватных классов - пусть пока будет так, хотя, если предложите иной рабочий варант (или хотя бы общую структуру файлов/классов)  я только за.
В принципе, я согласен что их многовато - но пока альтернативы откуда скопипастить нет :), тем более, у меня был очень долгий путь к анализу и понимания работы и устройства QAbstractSocket со всеми его плюшками. Не хотелось городить самодельный огород, а хотелось взять готовое и сделать по аналогии, чтобы и поведение совпадало и т.п., тем более ИМХО, QAbstractSocket подходил для этого как никакой другой класс.

Цитировать
2. Почему головной класс содержит слово Abstract? Как-будто им пользоваться напрямую нельзя и предполагается несколько вариантов реализации.
Опять же копипаста и аналогия с сокетами, а также я думал, что кто-нить сможет отнаследоваться от AbstractSerial и реализовать что-нить специфическое. Я даже сам представить не могу что это может быть, но оставил на всякий случай.

Цитировать
3. Зачем QSerialEnumerator следит за изменением списка доступных портов? Неужели это кому-то может быть нужно?!?
Да, нужно. Например чтобы в ГУЕ заполнить именами QComboBox и обновлять его при втыкании/выдергивании USB/Serial конвертера к примеру.
Также некоторые просили реализовать получение Vod, Pid и других вещей для отображения в ГУЕ.


 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 27, 2011, 23:06
1. ссылочка (http://qt.gitorious.org/qt/pages/ApiDesignPrinciples#Static+Polymorphism)
Я не сильно разбираюсь в специфике работы порта под Windows, поэтому могу не учитывать ее особенности. Из-за сильной усложненности QSerialDevice, я начал писать свою реализацию (работает только под *nix).
QSerialPort : QIODevice
QSerialPortPrivate (имеет вариант под *nix и под win32) : QSerialPortPrivateData (общий)
QSerialPortInfo - содержит описание устройства и статический метод получения списка портов
QSerialPortInfoPrivate (имеет вариант под *nix и под win32)
Делал по аналогии с QPrinter.
Задача автоматического уведомления о подключении/отключении устройств не стоит из-за бесполезности. Кому надо, тот может поставить таймер на пол секунды с опросом списка устройств.
2. без комментариев.
3. а стоит ли оно того? На счет deviceId и vendorId я не спорю, может кому-то и пригодится. А вот слежение...


Итак, почему я начал писать свою реализацию всего этого дела? Мне необходимы жесткие временные характеристики и четность Space/Mark. Основная ОС у меня GNU/Linux. По ТЗ я должен отправлять посылки первый байт с битом четности равным 1, остальные с 0. При приеме у меня ограничение в 5 мс между байтами и 20 таймаут ответа. Вроде ничего страшного да? Но вот ядро Linux, например, при выполнении команды tcdrain() делает минимальное ожидание порядка 16 мс, если данные еще не ушли. А мне необходимо поставить четность Mark, отправить первый байт, дождаться завершения отправки, поставить четность Space, отправить остальные данные... Это еще что, а что делать на других *nix, когда четность менять нужно при отправке почти каждого байта (эмуляция Space/Mark через even/odd)?
Под Windows у меня сделать не очень получается. Там как-то оочень заморочено. Тем более, что я не просто хочу не игнорировать существование понятия ошибки четности, а еще дать возможность пользователю задавать способ ее обозначения: пропускать, обнулять, игнорировать, маркировать. Но судя по документации это как-то очень будет сделать нетривиально.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 28, 2011, 08:27
Цитата: b-s-a
1. ссылочка
Прочитал по ссылке.
И не увидел ничего страшного. Вот если Nokia переделает свою реализацию - тогда и я вслед за ними на их примере... По крайней мере это лучше, ИМХО, чем изобретать собственный велосипед и не факт что он будел лучше. Все-таки в Nokia не одна голова трудится над этим - а коллектив.

Также не увидел по ссылке вообще "положительные" отзывы Nokia о реализации каких-нибудь IO классах (унасдедованных от QIODevice), если бы был пример с чего брать - то тогда уже другой разговор.

 
Цитата: b-s-a
QSerialPort : QIODevice
QSerialPortPrivate (имеет вариант под *nix и под win32) : QSerialPortPrivateData (общий)
QSerialPortInfo - содержит описание устройства и статический метод получения списка портов
QSerialPortInfoPrivate (имеет вариант под *nix и под win32)
Делал по аналогии с QPrinter.
Можно ссылочку на исходники? Или это проприетарщина? :)

Цитата: b-s-a
Задача автоматического уведомления о подключении/отключении устройств не стоит из-за бесполезности. Кому надо, тот может поставить таймер на пол секунды с опросом списка устройств.
...
а стоит ли оно того? На счет deviceId и vendorId я не спорю, может кому-то и пригодится. А вот слежение...

Это то все понятно, но таймер это лишняя трата ресурса и процессорного времени (ИМХО).

Цитата: b-s-a
Я не сильно разбираюсь в специфике работы порта под Windows, поэтому могу не учитывать ее особенности. Из-за сильной усложненности QSerialDevice, я начал писать свою реализацию (работает только под *nix).

Ну, если бы стояла конкретная задача (как у вас) - это одно дело... А вот если стоит задача сделать унифицированный кроссплатформенный класс который бы позволял в "любой" ОС выполнять аналогичные задачи - это другое дело.

ЗЫ: но ИМХО, сколько людей - столько мнений.






Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 28, 2011, 11:17
Нет. моя библиотека не проприетарна. Исходники приложил. Когда ее писал впал в другую крайность - минимальной потери скорости, поэтому очень много чего размещено в хидерах...

Раз ты прочитал, что было по ссылке написано, то мог обратить внимание на другие требования к коду. В частности, про минимализм интерфейса. Сейчас интерфейс QAbstractSocket содержит методы, настраивающие по текстовым названиям настроек. Это вещь конечно нужная, но при попытке включить в состав Qt ее потребуют удалить.
То что в Nokia целый коллектив трудится, это еще ничего не говорит об отсутствии ошибок. Ошибки будут всегда, даже когда будет трудиться миллион людей. Кто-то поленится подумать на 2 хода вперед, кто-то в силу своих особенностей не сможет...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Январь 29, 2011, 11:34
Может вопрос уже поднимался ...... Как установить у AbstractSerial скорость обмена 230400?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 29, 2011, 16:57
Может вопрос уже поднимался ...... Как установить у AbstractSerial скорость обмена 230400?

Код:
...
setBaudRate(230400);
...

Теперь оно должно работать, я недавно добавил возможность устанавливать пользовательскую скорость обмена. Хотя я не проверял, негде проверить.
Попробуйте и отпишитесь.

--
Упс, отставить! Эта скорость является стандартной, поэтому должно без проблем установиться.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Январь 31, 2011, 08:56
Цитировать
Попробуйте и отпишитесь.
Отписываюсь. Попробывать так и не удалось. Я использовал библиотеку 0.2.0. Там нет 230400. Обновился до 0.4.0. Там в справке не увидел 230400, но в *.h вроде есть. но слишлом уж 0.4 отличается от 0.2. Код не компиляется. Придется код перелопатить. Первый косяк... в 0.2 была функция
bool AbstractSerial::setCharIntervalTimeout(int), в 0.4 такой нет, вместо неё есть void AbstractSerial::setCharIntervalTimeout(int). Смотрю хелпник
Цитировать
void AbstractSerial::setCharIntervalTimeout  ( int  usecs = 0 )  

Устанавливает время ожидания прихода символа в приемный буфер последовательного устройства.

Аргументы:
[in] usecs Желаемое время ожидания прихода символа, в мксек.  

Возвращает:
False в случае ошибки.
См. определение в файле abstractserial.cpp строка 1346

Перекрестные ссылки ESetCharIntervalTimeout.

функция по объявлению возвращаяет void, а в хелпе "Возвращает: False в случае ошибки. Не понятно??? могу конечно её использовать как void, но вдруг это ошибка и в следующем релизе эта функция уже будет bool.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Январь 31, 2011, 09:14
Ну и до кучи ещё вопросы
Код:
01346 void AbstractSerial::setCharIntervalTimeout(int usecs)
01347 {
01348     Q_D(AbstractSerial);
01349     if (this->isOpen())
01350         d->serialEngine->setCharReadTimeout(usecs);
01351     else
01352         this->emitStatusString(ESetCharIntervalTimeout);
01353 }
в 0.2 по возвращаемуму булу судил о том, установлен ли таймаут. если ошибка - вываливал юзеру MessageError. Как сейчас это проверяется? В  d->serialEngine->setCharReadTimeout() есть сигнал какой-то?

смотрю сигналы у AbstractSerial
Код:
void AbstractSerial::signalStatus  ( const QString &  status,  
  QDateTime  current 
 )  [signal]

Этот сигнал автоматически испускается при изменении статуса AbstractSerial.
Изменение статуса может быть вызвано следующими причинами:

•При ошибках конфигурировании устройства.
•При его открытии/закрытии.
•При ошибках I/O.
Допустим при  открытии/закрытии не нужно не чего делать, а вот при ошибках конфигурировании устройства или при ошибках I/O нужно что-то сделать и пользователя сообщением уведомить. Как отличить излучился сигнал из-за ошибки или из-за открытия/закрытия? Парсить QString&  status?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 31, 2011, 11:16
Цитата: juvf
Отписываюсь. Попробывать так и не удалось. Я использовал библиотеку 0.2.0. Там нет 230400. Обновился до 0.4.0. Там в справке не увидел 230400, но в *.h вроде есть. но слишлом уж 0.4 отличается от 0.2. Код не компиляется. Придется код перелопатить. Первый косяк... в 0.2 была функция
bool AbstractSerial::setCharIntervalTimeout(int), в 0.4 такой нет, вместо неё есть void AbstractSerial::setCharIntervalTimeout(int). Смотрю хелпник
функция по объявлению возвращаяет void, а в хелпе "Возвращает: False в случае ошибки. Не понятно??? могу конечно её использовать как void, но вдруг это ошибка и в следующем релизе эта функция уже будет bool.
Я не успел добавить это в Ru документацию. Кое где будут огрехи.

Цитировать
Допустим при  открытии/закрытии не нужно не чего делать, а вот при ошибках конфигурировании устройства или при ошибках I/O нужно что-то сделать и пользователя сообщением уведомить. Как отличить излучился сигнал из-за ошибки или из-за открытия/закрытия? Парсить QString&  status?
В текущей реализации особого смысла в возвращении ошибок от установок таймаута символа нет.
Т.е. таймауты символов можно применять только в режиме Unbuffered. И то , если setTotalReadConstantTimeout(int msecs) ,  msecs = -1 (т.е режим автоматического вычисления общего таймаута пакета данных).
В общем, если оч нужен таймаут - то используйте setTotalReadConstantTimeout - оно установит таймаут не на символ - а на весь читаемый пакет, что ИМХО, более правильно и быстрее будет работать/читать.
Минимальный размер читаемого пакета 256 байт - поэтому минимальный таймаут пакета не может быть ниже чем для 256 байт. :) (хотя и больше тоже не может быть)
Поэтому если у вас размер передаваемых данных < 256 байт - то ставьте смело или 0 или 1 мс и не заморачивайтесь.
А если > 256 байт - то рассчитайте общий таймаут на 256 байт (с учетом скорости, кол-ва бит данных, стоп-бит и т.п.).

А чтобы не заморачиваться с расчетом - делайте setTotalReadConstantTimeout(-1), а  setCharIntervalTimeout не трогайте вообще. И оно само подберет "оптимальный" таймаут. Т.е. если будете менять скорость и т.п. то не нужно переустанавливать таймауты.

ЗЫ:
Там с таймаутами сейчас полный песец - хотелось универсальности - а получилось хз что. :)
В общем, не обращайте внимание на ошибки от таймаутов вообще, считайте что оно всегда true! :)




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Январь 31, 2011, 20:19
моё преложение не собирается.

Собрал serialDevice 0.4.0. В своём .pro прописал
Код:
INCLUDEPATH += $$(QTPATH)/serportM04/src/qserialdevice \
$$(QTPATH)/serportM04/src/qserialdeviceenumerator

QMAKE_LIBDIR += $$(QTPATH)/serportM04/src/build/release

LIBS += -lqserialdevice

QTPATH = d:/soft/Qt/
при компиляции получаю ошибки
Код:
d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x89a): undefined reference to `_imp__SetupDiGetDeviceRegistryPropertyW@28'

d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0xfb3): undefined reference to `_imp__SetupDiGetClassDevsW@16'

d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x100a): undefined reference to `_imp__SetupDiEnumDeviceInfo@12'

d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x1170): undefined reference to `_imp__SetupDiOpenDevRegKey@24'

d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x27de): undefined reference to `_imp__SetupDiDestroyDeviceInfoList@4'

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug/TestProg.exe] Error 1

mingw32-make: *** [debug] Error 2
Как это победить?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 31, 2011, 21:00
Ох, juvf, juvf ....

Смотри примеры и найти отличия в *.pro файлах примеров и твоего.
ЗЫ: Неужто так лень разобраться? Или всё нужно разжевывать и в рот класть?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Февраль 11, 2011, 10:17
А где можно взять последнюю версию Вашей библиотеки...и желательно с примерами....?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 11, 2011, 11:09
http://gitorious.org/qserialdevice/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Февраль 18, 2011, 13:44
Код:
char command[4];
AbstractSerial *port;
...
port->write(command, 4);
...
write в таком коде глючит. Бывалые подсказывают, что в порт нада писать то 1 байту, иначе масдай. Это ..... особенности компорта? Или это баг в реализации? должна AbstractSerial::write(command, 4) гарантированно  работать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 18, 2011, 14:33
write в таком коде глючит. Бывалые подсказывают, что в порт нада писать то 1 байту, иначе масдай. Это ..... особенности компорта? Или это баг в реализации? должна AbstractSerial::write(command, 4) гарантированно  работать?
Ну что за чушь... Возьми примеры \test\guiapp , подправь и проверь.

/test/guiapp/mainwidget.cpp
Код
C++ (Qt)
void MainWidget::procSerialDataTransfer(const QByteArray &data)
{
   char buf[4];
   buf[0] = 'a';
   buf[1] = 'b';
   buf[2] = 'c';
   buf[3] = 'd';
 
   if (this->serial && this->serial->isOpen())
       this->serial->write(buf, 4);
}
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Февраль 20, 2011, 08:51
Ну что за чушь...
Да сам удивился - что за чушь. В прикреплении тест показывающий эту "чушь" в  qserialdevice.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 20, 2011, 18:39
2 juvf, твой код особо не смотрел, наверняка у тебя где-то ошибка, а исправлять твои ошибки не имею желания.

Я специально видоизменил /examples/anymaster так, чтобы он постоянно слал: 03 FC 41 00.
Код
C++ (Qt)
void AnyMaster::transaction()
{
   start(false);
 
   char tx_packet[4];
   tx_packet[0] = 0x03;
   tx_packet[1] = 0xFC;
   tx_packet[2] = 0x41;
   tx_packet[3] = 0x00;
 
   qint64 r = port->write(tx_packet, 4);
   if (r == 4) {
       qDebug() << "Writed: " << r << " bytes";
       if ((port->bytesAvailable() > 0) || port->waitForReadyRead(responseTimeout)) {
           char rx_packet[258];
           r = port->read(rx_packet, 258);
           qDebug() << "Readed: " << r << " bytes";
       }
       else {
           qDebug() << "Response timeout.";
       }
   }
   else qDebug() << "Bytes writed small: " << r;
 
   start(true);
}
 

Далее, видоизменил /examples/reader так, чтобы он принимал пакет и проверял его и при ошибке в принятых байтах - сыпал в консоль предупреждения.
Код
C++ (Qt)
       char rx_packet[4];
       /* 5. Fifth - you can now read / write device, or further modify its settings, etc.
       */

       while (1) {
           if ((port->bytesAvailable() > 0) ||  port->waitForReadyRead(rrto)) {
               qint64 r = port->read(rx_packet, 4);
               if (4 != r)  {
                   qDebug() << "Readed fail: " << r << " bytes";
               }
               else {
                    quint32 val = quint8(rx_packet[3])
                            | (quint8(rx_packet[2]) << 8)
                            | (quint8(rx_packet[1]) << 16)
                            | (quint8(rx_packet[0]) << 24) ;
 
                   if (0x03FC4100 != val) {
                       qDebug() << "Readed fail: bad packet : val = " << quint32(val);
                   }
                   //else { qDebug() << "Ok"; }
               }
           }
           else {
               qDebug() << "Timeout read data in time : " << QTime::currentTime();
           }
       }//while
 

Вот, уже сижу 2 часа и жду, когда же оно мне скажет что принято что-то не то. Так что ищи ошибку(ки) у себя.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Февраль 20, 2011, 23:03
не поленился, так же подправил твои примеры. запустил -  :o .... как швейцарские часы. ни одного сбоя. стал сверять твой пример со своим. исходники, pro ... Не нашел отличий. Запустил ещё раз твои примеры ... ни прошло и минуты - посыпались баги. Стал экспериментировать .... то сбои постоянно иду, то перезапущу.... упс, нет сбоев.

Вобщем нашел закономерность. У меня в компе есть 2 ком порта. COM1 на материнской плате, "честный" компорт. СОМ7 - преобразователь USB<->RS-232 на чипе prolific. Если мастеру назначаю СОМ1, т.е. "честный", а редэру СОМ7, то все работает без сбоев. Но если мастеру указываю порт СОМ7, а редэру СОМ1 - то ошибки долго не заставляют ждать. Сыпятся.
По хорошему надо бы выкинуть этот prolific и поставить нормальный преобразователь, типа ftdi, но дело в том, что подобный баг наблюдал и с преобразователями на чипах ftdi, и на USB GSM модемах.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 21, 2011, 01:58
Кто-то прикручивал для linux порт rfcomm ? (конект к телефону по Bluetooth)
 ???

добавил аналогичные (tty) строки для rfcomm в serialdeviceenumerator_p_unix.cpp
 

И удалось завести rfcomm , дело , похоже , в правах доступа на rfcomm....  ;D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 21, 2011, 08:15
Вобщем нашел закономерность. У меня в компе есть 2 ком порта. COM1 на материнской плате, "честный" компорт. СОМ7 - преобразователь USB<->RS-232 на чипе prolific. Если мастеру назначаю СОМ1, т.е. "честный", а редэру СОМ7, то все работает без сбоев. Но если мастеру указываю порт СОМ7, а редэру СОМ1 - то ошибки долго не заставляют ждать. Сыпятся.
По хорошему надо бы выкинуть этот prolific и поставить нормальный преобразователь, типа ftdi, но дело в том, что подобный баг наблюдал и с преобразователями на чипах ftdi, и на USB GSM модемах.
Ага... Ок, проверю это дело... (Уменя в тестах мастер был "мамкин" порт, а слейв - "пролифик" PL2303)  :)

Кто-то прикручивал для linux порт rfcomm ? (конект к телефону по Bluetooth)
 ???
добавил аналогичные (tty) строки для rfcomm в serialdeviceenumerator_p_unix.cpp
И удалось завести rfcomm , дело , похоже , в правах доступа на rfcomm....  ;D
Так значит у тебя заработало то что я советовал тебе сделать? Значит мне можно это коммитить в Git?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 21, 2011, 13:37
Да,  вроде все работает, enumerator  выводит инфу о rfcomm, примеры тоже работают.
Но чтоб получить доступ к   порту надо бить под рутом! , ето как то можно исправить сделав группу юзеров которым можно юзать порт rfcomm.

Но мне надо потестить более детально, чтоб делать финальные выводы.  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 21, 2011, 14:34
Цитировать
ето как то можно исправить сделав группу юзеров которым можно юзать порт rfcomm.
В принципе да, можно попробовать добавить пользователя в группы: tty, uucp, serial и т.п. по смыслу (в зависимости от типа дистрибутива Linux)
См тут http://www.prog.org.ru/topic_16678_0.html


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 21, 2011, 18:59
Вобщем нашел закономерность. У меня в компе есть 2 ком порта. COM1 на материнской плате, "честный" компорт. СОМ7 - преобразователь USB<->RS-232 на чипе prolific. Если мастеру назначаю СОМ1, т.е. "честный", а редэру СОМ7, то все работает без сбоев. Но если мастеру указываю порт СОМ7, а редэру СОМ1 - то ошибки долго не заставляют ждать. Сыпятся.
По хорошему надо бы выкинуть этот prolific и поставить нормальный преобразователь, типа ftdi, но дело в том, что подобный баг наблюдал и с преобразователями на чипах ftdi, и на USB GSM модемах.
Ага... Ок, проверю это дело... (Уменя в тестах мастер был "мамкин" порт, а слейв - "пролифик" PL2303)  :)
Не подтверждаю "ошибки". У меня работает как часы.
OS: Win7 x32
Шнурок: PL2303
Драйвер:
- поставщик Prolific
- дата разработки 19.11.2009
- версия 3.3.10.140

Да,  вроде все работает, enumerator  выводит инфу о rfcomm, примеры тоже работают.
Но чтоб получить доступ к   порту надо бить под рутом! , ето как то можно исправить сделав группу юзеров которым можно юзать порт rfcomm.

Но мне надо потестить более детально, чтоб делать финальные выводы.  ;)
Всё, добавил в Git.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 21, 2011, 21:43
Да,  вроде все работает, enumerator  выводит инфу о rfcomm, примеры тоже работают.
Но чтоб получить доступ к   порту надо бить под рутом! , ето как то можно исправить сделав группу юзеров которым можно юзать порт rfcomm.

Но мне надо потестить более детально, чтоб делать финальные выводы.  ;)
Такс, реализовав простенький bluetooth чат между компом (windows XP, COM5) <-> ноутом (ubuntu linux, rfcomm0).
Все работает отлично!!!
Исходник проекта выложу чуток позднее .

Bluetooth Chat example:

http://rghost.net/4479243

 8) 8) 8) Не плохо б било заточить либи в под Symbian. ::)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 22, 2011, 08:13
Цитата: Ubuntu_linux
8) 8) 8) Не плохо б било заточить либи в под Symbian. ::)

[offtop] Symbian R.I.P. [/offtop]

Ну исходники же открыты, вот и возьмитесь. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 22, 2011, 18:02
Видео  демонстрация о роботе BluetoothChat

http://www.youtube.com/watch?v=bMctresqyRM
(http://i3.ytimg.com/vi/bMctresqyRM/default.jpg) (http://www.youtube.com/watch?v=bMctresqyRM)


П.С. Чем черт не шутит...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 22, 2011, 23:52
А можете меня упомянуть в доках к либе? или ето нагло с моей стороны....


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 23, 2011, 10:51
А можете меня упомянуть в доках к либе? или ето нагло с моей стороны....
А как хотите быть упомянутым?
Вот если "допилите/протестируете" для симбиана или MacOSX или WinCE - обязательно упомяну. ;D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 23, 2011, 21:43
А можете меня упомянуть в доках к либе? или ето нагло с моей стороны....
А как хотите быть упомянутым?
Вот если "допилите/протестируете" для симбиана или MacOSX или WinCE - обязательно упомяну. ;D
Как тестера rfcomm...

Я вот думаю написать класс для робот с протоколом I2C для 1-ware  девайсов.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 23, 2011, 22:32
Цитировать
Как тестера rfcomm...
Этого мало, увы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Февраль 24, 2011, 21:21
Цитировать
Я вот думаю написать класс для робот с протоколом I2C для 1-ware  девайсов.

I2C c UART не путаете? Что-то ни разу не слыхал, чтобы 1-wire устройства по I2C опрашивали.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Февраль 24, 2011, 23:57
Есть вот така штука:
(конвертер для серв)
http://store.flytron.com/rc-electronics/94-6ch-rs232-servo-driver.html

Я подключил к com порту, вернее к переходнику (usb -com),  и не могу поменять положения серв..
 Делаю я так:
Код
C++ (Qt)
QString str=QString::number(1)+QString::number(ui->horizontalSlider_servo1->value())+char(13);
QByteArray data2;
port->write(data2.append(str));
 
Что не так??


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 25, 2011, 08:09
Цитата: Ubuntu_linux
...
...
Что не так??
Это не относится к теме этой ветки. Создай другую (новую) тему.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 26, 2011, 20:27
Итак, тихо и незаметно зарелизил версию 0.4.0.

Ссылка на Qt-Apps.org: http://qt-apps.org/content/show.php?content=112039
Ссылка на репы: http://gitorious.org/qserialdevice/qserialdevice/commits/0.4.0

ЗЫ: только как-то криво получилось, почему-то справа в колонке Branches не отображается версия 0.4.0, а в тегах - тег 0.4.0
по этой ссылке: http://gitorious.org/qserialdevice/qserialdevice/trees/master
а вот по этой отображается: http://gitorious.org/qserialdevice/qserialdevice/commits/master

Мож я что неправильно сделал?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Февраль 26, 2011, 20:54
>>только как-то криво получилось, почему-то справа
>>в колонке Branches не отображается версия 0.4.0, а в тегах - тег 0.4.0
у меня всё отображается.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 26, 2011, 21:17
У меня теперь тоже отображается после того как я слил 0.4.0 и master.
Блин, такая путаница с этим Git-ом...  :-\


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Апрель 27, 2011, 14:42
а почему в любом проекте он ругается на отсутсвие файла <ddk/ntddser.h>?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 27, 2011, 15:12
Потому, что библиотека проверяется (проверялась) мною только с использованием компилятора MinGW - там всё нормуль.
В MSVC же нету данного файла, поэтому рекомендую скачать не 0.4.0 версию, а более обновленный вариант тут:

https://gitorious.org/qserialdevice/qserialdevice/archive-tarball/master

И все будет путЁм.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Апрель 27, 2011, 15:22
Потому, что библиотека проверяется (проверялась) мною только с использованием компилятора MinGW - там всё нормуль.
В MSVC же нету данного файла, поэтому рекомендую скачать не 0.4.0 версию, а более обновленный вариант тут:
https://gitorious.org/qserialdevice/qserialdevice/archive-tarball/master
И все будет путЁм.
сообщение полный оффтоп,но все таки спрошу....был установлен qt creator-инструментарий как я понимаю там был MinGW, потом я установил VS2008 add-in и инструментарий стал Microsoft Visual C++ и не меняется...можно с этим что то сделать...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 27, 2011, 15:39
Цитировать
сообщение полный оффтоп,но все таки спрошу....был установлен qt creator-инструментарий как я понимаю там был MinGW, потом я установил VS2008 add-in и инструментарий стал Microsoft Visual C++ и не меняется...можно с этим что то сделать...
Ну а собираете в итоге чем MinGW или студийным компилером?

Попробуйте пошаманить в системных переменных окружения, может там что лишнее прописано и это удалить.

Да и вообще, ИМХО, удалите (если имеется) из системной PATH все пути к Qt, компиляторам и т.п. , может поможет.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Май 12, 2011, 11:52
Добрый день. Понадобилась Ваша библиотека в проекте с cmake системой сборки. Позволю себе несколько подредактировать Ваши проектные файлы.

Итак, цель: использовать Вашу библиотеку в виде исходных файлов, а не в виде готовой скомпилированной.

Для этого хочу сделать addSubdirectory(../common/qserialdevice ${CMAKE_CURRENT_BINARY_DIR}/qserialdevice). Такая расширенная форма команды используется из-за более удобного расположения исходных текстов библиотеки уровнем выше текущего проекта.

Теперь хочу target_link_libraries(somexe qserialdevice). На релиз сборке все ok, но с дебагом проблемы. Это меня и сподвигло заглянуть в Ваши симэйки.

src/CMakeLists.txt
Код:
include_directories( ${CMAKE_CURRENT_BINARY_DIR}
                     ${QT_INCLUDES}
)
Можно заменить на
Код:
set(CMAKE_INCLUDE_CURRENT_DIR T)

QT_INCLUDES включать не надо это происходит неявно во время include(${QT_USE_FILE})

----


Добавляем платформоспецифичную папку с заголовочными файлами.
Код:
# qplatformdefs
include_directories(${QT_MKSPECS_DIR}/default)

----------

Код:
set( QT_DONT_USE_QTGUI 1 )
Нужно делать до
Код:
include( ${QT_USE_FILE} )
Или же это можно заменить таким образом:
Код:
find_package( Qt4 COMPONENTS QtCore REQUIRED )

Отныне QT_LIBRARIES переменная будет содержать только то, что Вы захотели.

--------------
Код:
    set ( LIBRARY_OUTPUT_PATH 
        ${PROJECT_BINARY_DIR}/debug
        CACHE string "Path to output library binaries."
    )

Deprecated переменная. Кроме того я настраиваю размещение всех библиотек в самом верхнем "executable" проекте. Нижние проекты не должны знать, куда им собираться. Это более удобно в разросшихся проектах.

------------
Код:
set( QT_DEFINITIONS
    -DUNICODE
    -DQT_NO_DEBUG
    -DQT_THREAD_SUPPORT
)
add_definitions( ${QT_DEFINITIONS})

Можно убрать.

  QT_DEFINITIONS   Definitions to use when compiling code that uses Qt.
                   You do not need to use this if you include QT_USE_FILE.
                   The QT_USE_FILE will also define QT_DEBUG and QT_NO_DEBUG
                   to fit your current build type.  Those are not contained
                   in QT_DEFINITIONS.

Код:
if(BUILD_SHARED)
    add_library( ${LIB_TARGET} SHARED ${QSERIALDEVICE_SRCS} ${QSERIALDEVICE_MOCS} )
else()
    add_library( ${LIB_TARGET} STATIC ${QSERIALDEVICE_SRCS} ${QSERIALDEVICE_MOCS} )
endif()

Можно заменить на
Код:
set(SERIALDEVICE_BUILD_TYPE "SHARED") # or STATIC
add_library( ${PROJECT_NAME} ${SERIALDEVICE_BUILD_TYPE} ${QSERIALDEVICE_SRCS} ${QSERIALDEVICE_MOCS} )

-----------
Код:
if( CMAKE_BUILD_TYPE STREQUAL "Debug" )
    set ( LIBRARY_OUTPUT_PATH
        ${PROJECT_BINARY_DIR}/debug
        CACHE string "Path to output library binaries."
    )
    set( LIB_TARGET "qserialdeviced" CACHE string "Name of the output library binaries." )
else()

Можно заменить на
Код:
set(CMAKE_DEBUG_POSTFIX d)

-----------

Теперь касаемо ${LIB_TARGET}. У меня нету доступа сверху к Вашей переменной поэтому, хотелось бы так.

Код:
target_link_libraries(${PROJECT_NAME}  ${QT_LIBRARIES} ${ADDITIONAL_LIBRARY})

Переменная PROJECT_NAME содержит то, что Вы в самом начале передали в функцию project(QSerialDevice).
Теперь я могу target_link_libraries(somexe QSerialDevice). И линковка у меня пройдет при любом режиме и любых префиксах/постфиксах библиотеки.

---------

Вообщем-то вопрос ко всем. Зачем делить сборку проекта на папки debug/release, если можно задать префикс/постфикс для всех бинарных файлов проекта.
Для executable, например:
Код:
set_target_properties(exetarget PROPERTIES DEBUG_POSTFIX "_debug" VERSION ${VERSION})

---------

Ни в коем случае не критикую, просто делюсь опытом.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 22, 2011, 20:36
Прошу прощения что долго не отвечал: был в отпуске :)

Хорошо, Михаил, я видел твой мерж на гиториусе.
Пусть он пока там повисит, т.к. мне пока некогда разбираться что там и как, но, думаю, ты прав: с конфигурацией для CMake нужно что-то делать, т.к. я делал её в попыхах (по - быстрому) и особо не заморачивался что там и как.
Типо я ждал пока кто-то не предложит чего получше, спасибо! :)

Цитировать
Вообщем-то вопрос ко всем. Зачем делить сборку проекта на папки debug/release, если можно задать префикс для всех бинарных файлов проекта.
Да, и я тогда тоже жду комментариев от заинтересованных лиц по этому вопросу.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 08, 2011, 20:46
В новой версии Qt 4.7.3 из QtSDK 1.1.1 отсутствуют приватные модули типа qwineventnotifier_p.h, в следствии чего библиотека не компилиться. Можно как-то скомпилировать?
1. Можно попробовать взять эти приватные файлы из исходников и попробовать их как-нибудь подключить/поизвращаться, но при этом,
 скорее всего оно потянет за собой и другие приватные хейдеры.
2. Но лучше всего собрать саму Qt из исходников и тогда без проблем компилить.

Имхо, 2-й вариант предпочтительней .
Или будем ждать выхода новой версии QSerialDevice?
А толку то? Библиотека использует некоторые приватные классы и без них не будет работать.
Городить что-то свое (уведомитель - синглтон), завязанное на отдельном потоке не хочется (хотя, мысли в принципе имеются, но оно пока не нужно).
Так что пусть оно как есть так и остается.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 08, 2011, 21:49
А я таки уже говорил, что эти приватные заголовочники и секции классов - массонский заговор.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 09, 2011, 07:22
А я таки уже говорил, что эти приватные заголовочники и секции классов - массонский заговор.
Да понятно это всё.
Но без них невозможно пока что в винде сделать что-то аналогичное QSocketNotifier, только для последовательного порта (естественно, без всяких левых тредов и т.п.).
Я то думал, что тролли/нокия запилят(интегрируют) поддержку последовательных портов в Qt (и тогда проблемы такой не было бы) - но теперь понимаю что всем на всё абсолютно по-барабану. 

Qt -RIP  :-[


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 09, 2011, 12:02
Я то думал, что тролли/нокия запилят(интегрируют) поддержку последовательных портов в Qt (и тогда проблемы такой не было бы) - но теперь понимаю что всем на всё абсолютно по-барабану. 

Qt -RIP  :-[
Не стоит так паниковать. Твою реализацию вряд ли интегрируют (много лишних методов и слотов (или принимающих странные параметры), невнятная работа с ошибками и событиями). А свою писать им некогда.
Думаю, если задаться целью, можно привести библиотеку к пригодному для включения в Qt виду.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 09, 2011, 14:43
Думаю, если задаться целью, можно привести библиотеку к пригодному для включения в Qt виду.

+1

Я бы с удовольствием поучавстовал


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 09, 2011, 15:18
А какой вид пригодный? У kuzulis-a интерфейс родился из того как ведут себя операционки, а не из того как хочет пользователь-программист?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 09, 2011, 15:54
А какой вид пригодный?
Посмотри уже имеющиеся в Qt классы схожей тематики (в частности, наследники QIODevice). В них, например, нет методов установки свойств через их текстовое представление.

Например, что лично мне не нравится:
1. какой-то жуткий enum Status вытащен наружу, да еще и в public (который используется только внутри класса). И ошибки и не ошибки в одном флаконе. Причем, константы типа ENoneOpen просто убивают.
2. слишком длинное название для свойств порта: FlowControlOff, ParitySpace (имхо, было бы более наглядно: NoParity, Space, Mark, Even, Odd, NoFlowControl, Hardware (или CtsRts), Software (или XonXoff))
3. наличие не кроссплатформенных особенностей, эмуляция которых невозможна (я прав?): StopBits1_5
4. огромный набор констант скоростей передачи данных. Причем, он далеко не общий для всех ОС. Имхо, лучше оставить минимум наиболее стандартных. Остальное, пусть задается прямым указанием скорости в бодах.
5. установка свойств (скорость, четность, стопы) через строки
6. нестатические методы типа QMap<AbstractSerial::StopBits, QString> stopBitsMap() const. Нахрена? Не проще ли сделать пару статических методов (или вообще внешних функций) типа: QString stringFromParity(Parity p)? Не надо затачиваться исключительно под диалог настроек порта. Он вызывается значительно реже, чем все остальное.
7. название класса AbstractSerial предполагает, что от него необходимо наследоваться (мы это уже обсуждали). Имхо, лучше использоваться SerialPort или SerialDevice.
8. я не считаю, что стоит добавлять время ожидания по умолчанию: bool waitForReadyRead(int msecs = 5000). Так как базовый класс его не имеет. Может вызвать ошибку, при смене типа указателя на QIODevice*.

У kuzulis-a интерфейс родился из того как ведут себя операционки, а не из того как хочет пользователь-программист?
Это вопрос или утверждение? Не считаю правильным делать так, как это сделано в ОС. Особенно, в Windows (ClearCommError - отличный пример того, как делать не стоит).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Июнь 09, 2011, 17:48
А какой вид пригодный?
Посмотри уже имеющиеся в Qt классы схожей тематики (в частности, наследники QIODevice). В них, например, нет методов установки свойств через их текстовое представление.

Например, что лично мне не нравится:
2. слишком длинное название для свойств порта: FlowControlOff, ParitySpace (имхо, было бы более наглядно: NoParity, Space, Mark, Even, Odd, NoFlowControl, Hardware (или CtsRts), Software (или XonXoff))
4. огромный набор констант скоростей передачи данных. Причем, он далеко не общий для всех ОС. Имхо, лучше оставить минимум наиболее стандартных. Остальное, пусть задается прямым указанием скорости в бодах.

7. название класса AbstractSerial предполагает, что от него необходимо наследоваться (мы это уже обсуждали). Имхо, лучше использоваться SerialPort или SerialDevice.



С длинами констант я не согласен, так нагляднее. А так меня все устаревает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 10, 2011, 11:35
Цитата: b-s-a
1. какой-то жуткий enum Status вытащен наружу, да еще и в public (который используется только внутри класса). И ошибки и не ошибки в одном флаконе. Причем, константы типа ENoneOpen просто убивают.
Да я сам в шоке, уже и не помню что я хотел сделать. :)
Хорошо, давайте тогда определяться:
1. Какие из ошибок стоит использовать и выводить их текстовое представление? Давайте составим перечень.
2. Нужно ли информировать приложение об изменении статуса устройства (не ошибок, а любых изменениях в конфигурации)?
Т.е. делать ли "нативную" поддержку классом уведомлений (как сейчас сделано через signalStatus() ) или выкинуть это нафик?

Цитата: b-s-a
2. слишком длинное название для свойств порта: FlowControlOff, ParitySpace (имхо, было бы более наглядно: NoParity, Space, Mark, Even, Odd, NoFlowControl, Hardware (или CtsRts), Software (или XonXoff))
Хорошо, можно к примеру сократить так:
1.
Код
C++ (Qt)
   enum BaudRateDirectionFlag {
       DirInput,
       DirOutput,
       DirAll
   };
 

2.
Код
C++ (Qt)
   enum BaudRate {
       Baud50,
       ...
       Baud115200
   };
 

3.
Код
C++ (Qt)
   enum DataBits {
       Undefined = -1,
 
       Data5,  
       Data6,
       Data7,  
       Data8,
   };
 

4.
Код
C++ (Qt)
   enum Parity {
       Undefined = -1,  
 
       None,
       Odd,  
       Even,  
       Mark,  
       Space,
   };
 

5.
Код
C++ (Qt)
   enum StopBits {
       Undefined = -1,
 
       One,      
       Half,    
       Two,    
   };
 

6.
Код
C++ (Qt)
   enum Flow {
       Undefined = -1,  
 
       Off,        
       Hardware,  
       Software,    
   };
 

Цитата: b-s-a
3. наличие не кроссплатформенных особенностей, эмуляция которых невозможна (я прав?): StopBits1_5
ИМХО, ну тут пусть остается, т.к. в противном случае Windows пользователи "завоют".

Цитата: b-s-a
4. огромный набор констант скоростей передачи данных. Причем, он далеко не общий для всех ОС. Имхо, лучше оставить минимум наиболее стандартных. Остальное, пусть задается прямым указанием скорости в бодах.
Хорошо, огласите минимум.

Цитата: b-s-a
5. установка свойств (скорость, четность, стопы) через строки
Согласен, можно убрать, т.к. пользователи сами могут реализовать необходимый функционал.

Цитата: b-s-a
6. нестатические методы типа QMap<AbstractSerial::StopBits, QString> stopBitsMap() const. Нахрена?
Согласен, можно убрать. Просто меня просили добавить эти методы (но я так и не понял зачем они понадобились).  :)

Цитата: b-s-a
7. название класса AbstractSerial предполагает, что от него необходимо наследоваться (мы это уже обсуждали). Имхо, лучше использоваться SerialPort или SerialDevice.
Можно и так.

Цитата: b-s-a
8. я не считаю, что стоит добавлять время ожидания по умолчанию: bool waitForReadyRead(int msecs = 5000). Так как базовый класс его не имеет. Может вызвать ошибку, при смене типа указателя на QIODevice*.
Не проблема.

У kuzulis-a интерфейс родился из того как ведут себя операционки, а не из того как хочет пользователь-программист?
Цитировать
Это вопрос или утверждение? Не считаю правильным делать так, как это сделано в ОС. Особенно, в Windows (ClearCommError - отличный пример того, как делать не стоит).
Я тоже недопонял что имелось ввиду.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 10, 2011, 12:04
Это я провоцировал.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: b-s-a от Июнь 10, 2011, 13:51
1. В текст надо пихать все ошибки, которые может определить пользователь класса. Думаю, это все ошибки.
2. Ничего не имею против информирования о статусах. Но, в тоже время, не вижу практически никакой реальной пользы от этого (разве только для отладки, но оно того стоит?). Все необходимые сигналы (кроме очень специфичных для COM) уже есть в QIODevice.

Сокращение меня почти полностью устраивает, но вот может "направление" сократить до Input, Output и Input|Output? Пусть даже используя константы QIODevice. Но такие варианты как Off и None мне не нравятся. Я тоже рассматривал эти варианты, но пришел к выводу, что надежней использовать NoParity и NoFlowControl, так как не перепутаешь. А One/Two/Half заменить на Stop1, Stop2, Stop1_5, чтобы была однообразность с размером данных.

Кстати, предлагаю использовать в качестве значений констант более юзабельные числа (благодаря чему значительно можно оптимизировать низкоуровневую работу с портом):
NoParity = 0, Even = 2, Odd = 3, Space = 4, Mark = 5
Data5 = 5, Data6 = 6, Data7 = 7, Data8 = 8
Stop1 = 1, Stop2 = 2, Stop1_5 = 3

Список скоростей можно определить путем пересечения множеств стандартных скоростей *nix и Windows:
Код
C++ (Qt)
enum BaudRate {
/*    Baud75 = 75,
   Baud110 = 110,
   Baud134 = 134,
   Baud150 = 150,
   Baud300 = 300,
   Baud600 = 600, */

   Baud1200 = 1200,
   Baud1800 = 1800,
   Baud2400 = 2400,
   Baud4800 = 4800,
   Baud9600 = 9600,
   Baud19200 = 19200,
   Baud38400 = 38400,
   Baud57600 = 57600,
   Baud115200 = 115200
};
Часть скоростей закомментировал, так как не уверен в их необходимости в реальных приложениях.

Кстати, напоминаю, что остались еще названия линий. Их я предлагаю сократить так:
Код
C++ (Qt)
enum Line {
       Le = 0x01,     //Line enable (in)
       Dtr = 0x02,     //Data Terminal Ready (out)
       Rts = 0x04,     //Request To Send (out)
       St = 0x08,     //Secondary TX (out)
       Sr = 0x10,     //Secondary RX (in)
       Cts = 0x20,     //Clear To Send (in)
       Dcd = 0x40,     //Data Carrier Detect (in)
       Ri = 0x80,     //Ring Indicator (in)
       Dsr = Le        //Data Set Ready (in) alias for Le
};
Q_DECLARE_FLAGS(Lines, Line)

Теперь немного о улучшении функциональности.
Что сейчас происходит в случае ошибки четности/целостности пакета? А мне бы хотелось иметь возможность настраивать поведение. На мой взгляд возможны варианты:
1. Пропустить "битые данные" (т.е. "их не было")
2. Передать 0 вместо битых данных
3. Игнорировать ошибку (т.е. как-будто ошибки не было)
4. Прервать чтение прямо перед указанным "битым" байтом, выставить ошибку и специальный статус (ParityError, например). Последующее чтение примет первым байтом этот "битый" в том виде, в котором он получен (аналогично п 3) и остальные до следующего "битого", если есть.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: kuzulis от Июнь 10, 2011, 15:07
Цитата: b-s-a
1. В текст надо пихать все ошибки, которые может определить пользователь класса. Думаю, это все ошибки.
Ок, но проблема в том, что это будут только ошибки вида "Last Error", т.е. пользователь,
не сможет узнать о какой-то конкретной ошибки в процессе I/O.
К примеру, при чтении произошла ошибка, её значение записалось в lastError, пользователь хочет узнать её код и вызывает
метод errorString(), но в этот момент шла и передача данных (т.е. к примеру, обмен танными FullDuplex) и тоже произошла ошибка
и в переменную lastError записалась другая ошибка. И метод errorString() возвратит последнюю зафиксированную ошибку а не ту, что была!
И получатся тогда: а какой смысл вообще в errorString() и т.п?
Ведь такая ситуация же гипотетически может произойти?

Цитата: b-s-a
2. Ничего не имею против информирования о статусах. Но, в тоже время, не вижу практически никакой реальной пользы от этого (разве только для отладки, но оно того стоит?).
Вот для того случая (о котором выше написал) я и ввел возможность "логгирования/отладки" состояний порта, чтобы можно было разобраться что и как.
И да, согласен, что из-за этой "фичи" сильно захламляется код методов и становится некрасивым.
Вот если б можно было как-то более "грациозно" решить данную проблему (даже и для отладки, как ты сказал, но с возможностью/за ненадобностью, в случае чего, вообще отключить этот функционал) было бы здорово.

Цитата: b-s-a
Все необходимые сигналы (кроме очень специфичных для COM) уже есть в QIODevice.
Ну так они и сейчас все используются.
Необходимо только договориться о введении новых и их количества (для порта):
например, достаточно ли текущего их дополнительного количества?
Код
C++ (Qt)
   void exception();
 
   void ctsChanged(bool value);
   void dsrChanged(bool value);
   void ringChanged(bool value);
 
1. Нужен ли сигнал exception()? И если да - то на какие конкретно события он будет реагировать?
2. Нужны ли сигналы cts/dsr/ringChanged()?
Т.к. Винда "из коробки" отслеживает их изменение, а *nix - нет и приходится "костылить", создавая в *nix отдельный тред или таймер для их анализа!
3. Т.к. ОС Windows поддерживает отслеживание и других событий: EV_BREAK, EV_RLSD, EV_RXFLAG, то
стоит ли предоставлять для них API для пользователя или нет?
И если да - то как это сделать: либо уведомлять тоже сигналами или как - то еще?

Цитата: b-s-a
Сокращение меня почти полностью устраивает, но вот может "направление" сократить до Input, Output и Input|Output? Пусть даже используя константы QIODevice. Но такие варианты как Off и None мне не нравятся. Я тоже рассматривал эти варианты, но пришел к выводу, что надежней использовать NoParity и NoFlowControl, так как не перепутаешь. А One/Two/Half заменить на Stop1, Stop2, Stop1_5, чтобы была однообразность с размером данных.
Ну не знаю, если уж сокращать, то склоняюсь к своему мнению и ИМХО, я б не писал: NoParity , NoFlowControl, Stop1..Stop2, т.к. галиматья получается.
А насчет Input, Output - да, можно оставить всего два типа этих енумов (вместо трех) и назвать так как ты предложил.

Цитата: b-s-a
Кстати, предлагаю использовать в качестве значений констант более юзабельные числа (благодаря чему значительно можно оптимизировать низкоуровневую работу с портом):
NoParity = 0, Even = 2, Odd = 3, Space = 4, Mark = 5
Data5 = 5, Data6 = 6, Data7 = 7, Data8 = 8
Stop1 = 1, Stop2 = 2, Stop1_5 = 3
Поясни, что ты имел ввиду?
Ведь раз мы для этих констант создаем новый тип (Enum) - то для пользователя абсолютно по барабану какие там значения,
ведь он будет работать не с 0,1,2,3 - а с типами данных.
Да и для "низкоуровневой" обработки тоже абсолютно по-барабану...
Или я недопонял твою мысль?

Цитата: b-s-a
Список скоростей можно определить путем пересечения множеств стандартных скоростей *nix и Windows:
Код
C++ (Qt)
enum BaudRate {
/*    Baud75 = 75,
   Baud110 = 110,
   Baud134 = 134,
   Baud150 = 150,
   Baud300 = 300,
   Baud600 = 600, */

   Baud1200 = 1200,
   Baud1800 = 1800,
   Baud2400 = 2400,
   Baud4800 = 4800,
   Baud9600 = 9600,
   Baud19200 = 19200,
   Baud38400 = 38400,
   Baud57600 = 57600,
   Baud115200 = 115200
};
Часть скоростей закомментировал, так как не уверен в их необходимости в реальных приложениях.
Да, я тут согласен, этим перечислениям мы можем присвоить численные значения скоростей, тем самым, мы убиваем кучу зайцев,
и реализуем всего один метод для установки скоростей, который принимает тип qint32.
И еще, я б добавил сюда Undefined = -1 значение.

Насчет сокращений линий порта - согласен.

Цитата: b-s-a
Теперь немного о улучшении функциональности.
Что сейчас происходит в случае ошибки четности/целостности пакета? А мне бы хотелось иметь возможность настраивать поведение. На мой взгляд возможны варианты:
1. Пропустить "битые данные" (т.е. "их не было")
2. Передать 0 вместо битых данных
3. Игнорировать ошибку (т.е. как-будто ошибки не было)
4. Прервать чтение прямо перед указанным "битым" байтом, выставить ошибку и специальный статус (ParityError, например). Последующее чтение примет первым байтом этот "битый" в том виде, в котором он получен (аналогично п 3) и остальные до следующего "битого", если есть.
Ну так для этого придется ввести еще в API некие дополнительные перечисления и методы и как-то их осмысленной назвать и реализовать?!
Тут я в растерянности:
с одной стороны - эти ошибки являются ошибками IO, т.е. они отличаются от других ошибок и следует ли их выделить от остальных или нет?
Хотя, в принципе, у QIODevice нет каких то интерфейсов (АПИ) для разграничения на типы/уровни ошибок и все они объединены вместе.
----

Также неясно что делать с методами типа: listBaudrate/listDataBits/listStopBits и т.п. ?

Вот, вспомнил насчет:
Цитировать
6. нестатические методы типа QMap<AbstractSerial::StopBits, QString> stopBitsMap() const. Нахрена?
Согласен, можно убрать. Просто меня просили добавить эти методы (но я так и не понял зачем они понадобились).  Улыбающийся
Эти методы нужны были для того, чтобы заполнять QComboBox, и при выборе текстового представления параметра,
в метод сразу подставлялся его тип (int/Enum)!
Кстати да, можно их оставить и сделать статическими, пригодятся.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: b-s-a от Июнь 10, 2011, 15:48
К примеру, при чтении произошла ошибка, её значение записалось в lastError, пользователь хочет узнать её код и вызывает
метод errorString(), но в этот момент шла и передача данных (т.е. к примеру, обмен танными FullDuplex) и тоже произошла ошибка
и в переменную lastError записалась другая ошибка. И метод errorString() возвратит последнюю зафиксированную ошибку а не ту, что была!
И получатся тогда: а какой смысл вообще в errorString() и т.п?
Ведь такая ситуация же гипотетически может произойти?
Такое происходить не должно. Т.е. у пользователя произошел сбой, он прочитал lastError() и получил описание этого сбоя. То что у порта там в фоне работает никого не волнует. Другими словами, нужно писать обход этой ситуации.

Вот для того случая (о котором выше написал) я и ввел возможность "логгирования/отладки" состояний порта, чтобы можно было разобраться что и как.
И да, согласен, что из-за этой "фичи" сильно захламляется код методов и становится некрасивым.
Вот если б можно было как-то более "грациозно" решить данную проблему (даже и для отладки, как ты сказал, но с возможностью/за ненадобностью, в случае чего, вообще отключить этот функционал) было бы здорово.
С помощью #ifdef/#endif включать возможность детальной отладки. Все остальное запихать в qDebug()/qWarning() для неглубокой отладки конечным пользователем.

Ну так они и сейчас все используются.
Необходимо только договориться о введении новых и их количества (для порта):
например, достаточно ли текущего их дополнительного количества?
Код
C++ (Qt)
   void exception();
 
   void ctsChanged(bool value);
   void dsrChanged(bool value);
   void ringChanged(bool value);
 
1. Нужен ли сигнал exception()? И если да - то на какие конкретно события он будет реагировать?
2. Нужны ли сигналы cts/dsr/ringChanged()?
Т.к. Винда "из коробки" отслеживает их изменение, а *nix - нет и приходится "костылить", создавая в *nix отдельный тред или таймер для их анализа!
3. Т.к. ОС Windows поддерживает отслеживание и других событий: EV_BREAK, EV_RLSD, EV_RXFLAG, то
стоит ли предоставлять для них API для пользователя или нет?
И если да - то как это сделать: либо уведомлять тоже сигналами или как - то еще?
ИМХО, exception не нужен. Остальные сигналы нужны/не помешали бы. Я бы добавил сигналы реакции на break и изменения состояния линий (общего для всех входящих линий, возможно, взамен ряда отдельных сигналов).

Ну не знаю, если уж сокращать, то склоняюсь к своему мнению и ИМХО, я б не писал: NoParity , NoFlowControl,
Stop1..Stop2, т.к. галиматья получается.
Предлагаю в данном вопросе узнать мнения других участников. Может, выяснится, что мы с тобой оба не правы, и красивое решение совсем иначе выглядит. ;)

Цитата: b-s-a
Кстати, предлагаю использовать в качестве значений констант более юзабельные числа (благодаря чему значительно можно оптимизировать низкоуровневую работу с портом):
NoParity = 0, Even = 2, Odd = 3, Space = 4, Mark = 5
Data5 = 5, Data6 = 6, Data7 = 7, Data8 = 8
Stop1 = 1, Stop2 = 2, Stop1_5 = 3
Поясни, что ты имел ввиду?
Ведь раз мы для этих констант создаем новый тип (Enum) - то для пользователя абсолютно по барабану какие там значения,
ведь он будет работать не с 0,1,2,3 - а с типами данных.
Да и для "низкоуровневой" обработки тоже абсолютно по-барабану...
Или я недопонял твою мысль?
Если ты помнишь, я делал свой класс работы с портом. Так вот, там я сильно не заморачивался на конвертацию каждый раз инума в нужное число. Более того, логика работы с битом четности сильно завязана на это число: обрати внимание, что even/space четные, а odd/mark нечетные. Очень удобно использовать при эмуляции space/mark под *nix (не нужно делать лишние действия).

Цитата: b-s-a
Теперь немного о улучшении функциональности.
Что сейчас происходит в случае ошибки четности/целостности пакета? А мне бы хотелось иметь возможность настраивать поведение. На мой взгляд возможны варианты:
1. Пропустить "битые данные" (т.е. "их не было")
2. Передать 0 вместо битых данных
3. Игнорировать ошибку (т.е. как-будто ошибки не было)
4. Прервать чтение прямо перед указанным "битым" байтом, выставить ошибку и специальный статус (ParityError, например). Последующее чтение примет первым байтом этот "битый" в том виде, в котором он получен (аналогично п 3) и остальные до следующего "битого", если есть.
Ну так для этого придется ввести еще в API некие дополнительные перечисления и методы и как-то их осмысленной назвать и реализовать?!
Тут я в растерянности:
с одной стороны - эти ошибки являются ошибками IO, т.е. они отличаются от других ошибок и следует ли их выделить от остальных или нет?
Хотя, в принципе, у QIODevice нет каких то интерфейсов (АПИ) для разграничения на типы/уровни ошибок и все они объединены вместе.
Этот тип ошибок надо отделять. Но по требованию пользователя. Т.е. если он готов их обрабатывать, то пусть включает этот режим. Если нет, то и беспокоить его никто не будет. Только надо выбрать режим по умолчанию. Думаю, третий или второй.

Также неясно что делать с методами типа: listBaudrate/listDataBits/listStopBits и т.п. ?
От двух последних стоит точно отказаться. А вот с первым можно поступить так: переименовать его в standardBaudrateList() (или как-то иначе) и чтобы он возвращал стандартный для данной ОС набор скоростей.

Вот, вспомнил насчет:
Цитировать
6. нестатические методы типа QMap<AbstractSerial::StopBits, QString> stopBitsMap() const. Нахрена?
Согласен, можно убрать. Просто меня просили добавить эти методы (но я так и не понял зачем они понадобились).  Улыбающийся
Эти методы нужны были для того, чтобы заполнять QComboBox, и при выборе текстового представления параметра,
в метод сразу подставлялся его тип (int/Enum)!
Кстати да, можно их оставить и сделать статическими, пригодятся.
Я считаю подобный метод лишним. ИМХО, достаточно будет статических методов (или внешних функций) конвертации этих констант в строковое представление и обратно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 10, 2011, 16:59
Цитировать
Я считаю подобный метод лишним. ИМХО, достаточно будет статических методов (или внешних функций) конвертации этих констант в строковое представление и обратно.
Если класс Q_OBJECT, то можно Q_ENUM.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 11, 2011, 19:51
Ну хорошо, вот составил шаблон с обновленным API:
Код
C++ (Qt)
 
#ifndef SERIALDEVICE_H
#define SERIALDEVICE_H
 
#include <QtCore/QIODevice>
 
#ifndef QT_NO_DEBUG_STREAM
#include <QtCore/QDebug>
#endif
 
#include "../qserialdevice_global.h"
 
#ifndef SERIALDEVICE_BUFFERSIZE
#define SERIALDEVICE_BUFFERSIZE Q_INT64_C(16384)
#endif
 
 
class SerialDevicePrivate;
#if defined(QSERIALDEVICE_EXPORT)
class QSERIALDEVICE_EXPORT SerialDevice : public QIODevice
#else
class SerialDevice : public QIODevice
#endif
{
   Q_OBJECT
 
Q_SIGNALS:
   void ctsChanged(bool value);
   void dsrChanged(bool value);
   void ringChanged(bool value);
   void error(SerialDevice::SerialError);
 
public:
 
   /*! \~english
       \enum StreamDirectionFlag
       Directions baud rate that supports the class SerialDevice.
   */

   enum StreamDirectionFlag {
       Input  = 1, /*!< \~english Input baud rate. */
       Output = 2  /*!< \~english Output baud rate. */
   };
   Q_DECLARE_FLAGS(StreamDirection, StreamDirectionFlag)
 
   /*! \~english
       \enum BaudRate
       Standard types of speed serial device that supports the class SerialDevice.
   */

   enum BaudRate {
       Baud9600   = 9600,   /*!< \~english Speed 9600 bauds. */
       Baud19200  = 19200,  /*!< \~english Speed 19200 bauds. */
       Baud38400  = 38400,  /*!< \~english Speed 38400 bauds. */
       Baud57600  = 57600,  /*!< \~english Speed 57600 bauds. */
       Baud115200 = 115200, /*!< \~english Speed 115200 bauds. */
       UnknownBaudRate = -1 /*!< \~english Unknown speed. */
   };
   /*! \~english
       \enum DataBits
       Standard types of data bits serial device that supports the class SerialDevice.
   */

   enum DataBits {
       Data5 = 5, /*!< \~english 5 data bits. */
       Data6 = 6, /*!< \~english 6 data bits. */
       Data7 = 7, /*!< \~english 7 data bits. */
       Data8 = 8, /*!< \~english 8 data bits. */
       UnknownDataBits = -1 /*!< \~english Unknown data bits. */
   };
   /*! \~english
       \enum Parity
       Standard types of parity serial device that supports the class SerialDevice.
   */

   enum Parity {
       None  = 0,         /*!< \~english No parity. */
       Odd   = 2,         /*!< \~english Odd parity. */
       Even  = 3,         /*!< \~english Even parity. */
       Space = 4,         /*!< \~english Space parity. */
       Mark  = 5,         /*!< \~english Mark parity. */
       UnknownParity = -1 /*!< \~english Parity unknown. */
   };
   /*! \~english
       \enum StopBits
       Standard types of stop bits serial device that supports the class SerialDevice.
   */

   enum StopBits {
       One  = 1, /*!< \~english One stop bit. */
       Half = 3, /*!< \~english Half stop bits. */
       Two  = 2, /*!< \~english Two stop bits. */
       UnknownStopBits = -1 /*!< \~english Unknown stop bits number. */
   };
   /*! \~english
       \enum Flow
       Standard types of flow control serial device that supports the class SerialDevice.
   */

   enum Flow {
       Off,      /*!< \~english Flow control "Off". */
       Hardware, /*!< \~english Flow control "Hardware". */
       Software, /*!< \~english Flow control "Xon/Xoff". */
       UnknownFlow = -1 /*!< \~english Flow control unknown. */
   };
   /*! \~english
       \enum LineFlag
       Flags of states of the lines: CTS, DSR, DCD, RI, RTS, DTR, ST, SR
       interface serial device (see RS-232 standard, etc.).\n
       To determine the state of the desired line is necessary to impose a mask "and" of the flag line at
       the result of the method: quint16 SerialDevice::lines().
   */

   enum LineFlag {
       Le  = 0x01, /*!< \~english Line DSR (data set ready/line enable). */
       Dtr = 0x02, /*!< \~english Line DTR (data terminal ready). */
       Rts = 0x04, /*!< \~english Line RTS (request to send). */
       St  = 0x08, /*!< \~english Line Secondary TXD (transmit). */
       Sr  = 0x10, /*!< \~english Line Secondary RXD (receive.) */
       Cts = 0x20, /*!< \~english Line CTS (clear to send). */
       Dcd = 0x40, /*!< \~english Line DCD (data carrier detect). */
       Ri  = 0x80, /*!< \~english Line RNG (ring). */
       Dsr = Le    /*!< \~english Line DSR (data set ready). */
   };
   Q_DECLARE_FLAGS(Line, LineFlag)
 
   /*! \~english
       \enum BrokenDataControl
   */

   enum BrokenDataControl {
       Skip,
       PassZero,
       Ignore,
       BreakRecv
   };
 
   /*! \~english
       \enum SerialError
   */

   enum SerialError {
       /* Что тут писать? */
   };
 
   explicit SerialDevice(QObject *parent = 0);
   virtual ~SerialDevice();
 
   void setDeviceName(const QString &deviceName);
   QString deviceName() const;
 
   bool open(OpenMode mode);
   void close();
 
   //baud rate
   bool setBaudRate(qint32 baud, StreamDirection dir = Input | Output);
   qint32 baudRate(StreamDirection dir = Input | Output) const;
   //data bits
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
   //parity
   bool setParity(Parity parity);
   Parity parity() const;
   //stop bits
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
   //flow
   bool setFlowControl(Flow flow);
   Flow flowControl() const;
   // Timeouts
   void setCharIntervalTimeout(int usecs = 0);
   int charIntervalTimeout() const;
   void setTotalReadConstantTimeout(int msecs = 0);
   int totalReadConstantTimeout() const;
   //Lines statuses
   bool setDtr(bool set);
   bool setRts(bool set);
   quint16 lines();
   //Break
   bool sendBreak(int duration);
   bool setBreak(bool set);
   //
   bool flush();
   bool reset();
   //+++
   void setBrokenDataControl(BrokenDataControl control = Ignore);
   SerialError error() const;
 
   bool isSequential() const;
 
   qint64 bytesAvailable() const;
   qint64 bytesToWrite() const;
 
   bool waitForReadyRead(int msecs);
   bool waitForBytesWritten(int msecs);
 
   qint64 readBufferSize() const;
   void setReadBufferSize(qint64 size);
 
protected:
   qint64 readData(char *data, qint64 maxSize);
   qint64 writeData(const char *data, qint64 maxSize);
 
   void setSerialError(SerialError serialError);
 
   SerialDevicePrivate * const d_ptr;
 
private:
   Q_DECLARE_PRIVATE(SerialDevice)
   Q_DISABLE_COPY(SerialDevice)
};
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialDevice::StreamDirection)
 

Конструктивные изменения и дополнения приветствуются (исходник в аттаче).
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 13, 2011, 18:47
Может все-таки назвать класс SerialPort? SerialDevice это больше устройство на том конце может означать.
SerialDevice::SerialError - не много ли "Serial"? Может достаточно будет SerialDevice::Error?
Не уверен, что нужна сигнализация об ошибках. Лучше сделать метод lastError(), так как сигнал может придти хрен знает когда.
Мне продолжают симпатизировать NoParity, NoFlowControl вместо None и Off. Участники форума, включайтесь в дискуссию
Что-то стандартных скоростей мало стало. Неужели в Mac OS X так мало совместимых?
Значение Odd и Even перепутаны. Odd и Mark должны быть нечетными.
Что-то я не припомню количество стопов равное 0.5. Есть 1.5 - "one and a half".
Flow - поток, FlowControl - управление потоком. Ведь у тебя не тип Stop, а StopBits. ;-)
BrokenDataControl - что-то не нравится.
BreakRecv - а разве принято использовать сокращения в интерфейсе?
Есть методы setDtr()/setRts(), а dtr()/rts() нет. Непорядок.
Сигнал breakReceived() не вводится?
А зачем это: readBufferSize()/setReadBufferSize()?
Думаю, что PIMPL стоило помещать в приватную зону. Так же, как и setSerialError().

Замечание по стилю - virtual стоит писать у всех переопределяемых методах.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2011, 20:24
Цитировать
Может все-таки назвать класс SerialPort? SerialDevice это больше устройство на том конце может означать.
Не, имхо, устройство лучше. Порт- это как-то банально и такой класс уже в имеется на просторах тырнета.

Цитировать
SerialDevice::SerialError - не много ли "Serial"? Может достаточно будет SerialDevice::Error?
По аналогии с сокетами, там именно так и написано: AbstractSocket::SocketError

Цитировать
Не уверен, что нужна сигнализация об ошибках.
Пусть будет, т.к. в сокетах оно есть. Если что, то убрать не проблема.

Цитировать
Лучше сделать метод lastError(), так как сигнал может придти хрен знает когда.
Для этого будет метод: QString errorString() из QIODevice.

Цитировать
Что-то стандартных скоростей мало стало. Неужели в Mac OS X так мало совместимых?
Не угодишь, то много, то мало.. Да в принципе без разницы, потом можно будет изменить кол-во.

Цитировать
Значение Odd и Even перепутаны. Odd и Mark должны быть нечетными.
Упс, ошибся.

Цитировать
Что-то я не припомню количество стопов равное 0.5. Есть 1.5 - "one and a half".
Да, точно, гугл транслятор накосячил.

Цитировать
Flow - поток, FlowControl - управление потоком. Ведь у тебя не тип Stop, а StopBits. ;-)
Ок.

Цитировать
BrokenDataControl - что-то не нравится.
BreakRecv - а разве принято использовать сокращения в интерфейсе?
Напиши свой вариант.

Цитировать
Есть методы setDtr()/setRts(), а dtr()/rts() нет. Непорядок.
Есть метод: line() , в принципе наверное этого достаточно.

Цитировать
Сигнал breakReceived() не вводится?
А я не знаю как его отлавливать и в чем его смысл.

Цитировать
А зачем это: readBufferSize()/setReadBufferSize()?
Это хз для чего, просто в сокетах они есть. По ходу в будущем нужны для установки размера приемного буфера или что-то типа того.
Оставил дабы не отходить от оригинала ( QAbstractSocket )

Цитировать
Думаю, что PIMPL стоило помещать в приватную зону. Так же, как и setSerialError().
А почему в сокетах оно в протектед тогда?

Цитировать
Замечание по стилю - virtual стоит писать у всех переопределяемых методах.
Напиши свой вариант API со всеми нюансами для сравнения.

ЗЫ: Что-то никто больше не хочет больше обсуждать, наверное никому это не нужно.  :-\


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 13, 2011, 21:28
Цитировать
Думаю, что PIMPL стоило помещать в приватную зону.
Долой приватные секции! Их же из наследника не получить.
Что подключаться-то? Цель запила - соответствовать qt-style. Сильно много дискуссии не надо. Ориентация на сокеты самая правильная.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 14, 2011, 00:14
Цитировать
Ориентация на сокеты самая правильная.
Народ, не надо ориентироваться на QAbstractSocket. Я уже давал ссылку, где сами тролли говорили, что это пример крайне неудачного дизайна. В нашем случае, мы обсуждаем фактически конечный вариант класса - наследоваться от него смысла почти нет (более того, мне в голову и не приходит зачем).
Поэтому, предлагаю НЕ ДОБАВЛЯТЬ в класс то, что "зачем не знаю, но у них есть".
Цитировать
Долой приватные секции! Их же из наследника не получить.
Вот именно - не нужно наследоваться. Это класс должен быть вполне законченным, чтобы у людей даже мысли не возникало. Никто же не наследуется от QFile!
Цитировать
Не, имхо, устройство лучше. Порт- это как-то банально и такой класс уже в имеется на просторах тырнета.
Банально не банально, но соответствует содержанию больше. Разве не так?
Цитировать
По аналогии с сокетами, там именно так и написано: AbstractSocket::SocketError
И? Ну накосячили или предполагали, что могут быть у наследников еще какие варианты ошибок. Думаю, лучше сократить.
Цитировать
Пусть будет, т.к. в сокетах оно есть. Если что, то убрать не проблема.
см. выше. Кстати, добавить потом проще, чем удалить. Процесс удаления довольно мучителен: сначала надо пометить depracated, затем, через пару лет, уже можно удалять. Имхо, проще не добавлять.
Цитировать
Для этого будет метод: QString errorString() из QIODevice.
switch по QString не сделаешь. Да и ловить ошибки на языке текущего пользователя довольно забавное занятие. Я еще понимаю, пользователь выдернул USB-COM переходник. Да, в этом случае - конец работы с портом. А что делать, если возникла ошибка четности (в соответствующем режиме работы)?
Цитировать
Не угодишь, то много, то мало.. Да в принципе без разницы, потом можно будет изменить кол-во.
Просто есть какой-то оптимум. Пяток стандартных значений на мой взгляд выглядит как-то бедно. Но я не настаиваю с пеной у рта.
Цитировать
Напиши свой вариант.
По поводу BrokenDataControl: FaultPolicy, DataErrorPolicy, CorruptionPolicy...
По поводу BreakRecv: BreakReceiving, StopReceiving...
Цитировать
Есть метод: line() , в принципе наверное этого достаточно.
Тут надо как-то симметрично подходить. А то для установки состояния линий нужно одно свойство менять, а для того, чтобы узнать текущее - читать другое свойство и выгрызать из него данные.
Цитировать
Цитировать
Сигнал breakReceived() не вводится?
А я не знаю как его отлавливать и в чем его смысл.
Согласен, что-то я сам себе противоречу - если что, потом добавить можно.
Цитировать
Напиши свой вариант API со всеми нюансами для сравнения.
Не вижу смысла. Ты все написал так, как я и считаю. Но есть ряд "нюансов", на которые ИМХО следует делать иначе. Я это описал. Если же я выложу свой вариант, то мы просто поменяемся ролями - ты станешь критиком.  ;D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 14, 2011, 10:08
Тогда мое мнение во внимание не принимайте. Как b-s-a скажет, так хорошо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 14, 2011, 10:18
Цитата: b-s-a
Я уже давал ссылку, где сами тролли говорили, что это пример крайне неудачного дизайна.
Ну так набросай удачный дизайн, а то я не вкурю (что есть "удачный"), делов то.  ;)
Есть примеры то?

ЗЫ: Ну а что скажет многоуважаемый тов. pastor ?

ЗЫЗЫ: вот, прикрепил подправленную версию АПИ (ни вашим ни нашим :) )

И вопросы:
1. Может быть, все-таки нужно убрать сигналы:
Код:
    void ctsChanged(bool value);
    void dsrChanged(bool value);
    void ringChanged(bool value);
??
Т.к. в *nix нет нативных средств для отслеживания изменения этих сигналов и приходится использовать либо отдельный поток либо таймер с определенным интервалом времени.
Но тут дилемма: чем меньше интервал, например около 1мс (и не факт что оно будет срабатывать/опрашивать точь в точь в такой промежуток) - то растет нагрузка на процессор (причем заметно), но чем больше интервал - тем больше шанс что мы "профукаем" изменение сигнала на линии.
Так что: а есть ли смысл в них?

2. Кто-нить заполните перечисление: SerialError

В остальном АПИ, пожалуй, можно оставить так как есть.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 14, 2011, 13:07
Тогда мое мнение во внимание не принимайте. Как b-s-a скажет, так хорошо.
Прошу не считать меня последней инстанцией.

Вот мой вариант. Название класса и пр. я изменил так, как описывал выше. Разве что SerialError оставил - в QFile тоже FileError.
Код
C++ (Qt)
/* <license header> */
 
#ifndef SERIALPORT_H
#define SERIALPORT_H
 
#include <QtCore/qiodevice.h>
 
#ifndef SERIALPORT_EXPORT
#define SERIALPORT_EXPORT
#endif
 
class SerialPortPrivate;
 
class SERIALPORT_EXPORT SerialPort : public QIODevice
{
   Q_OBJECT
   Q_PROPERTY(BaudRate baudRate READ baudRate WRITE setBaudRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(SerialError error READ error RESET unsetError)
   Q_ENUMS( Direction BaudRate DataBits Parity StopBits FlowControl Line DataErrorPolicy SerialError )
 
public:
 
   /*! \~english
       \enum DirectionFlag
       Directions baud rate that supports the class SerialPort.
   */

   enum Direction {
       Input  = 1, /*!< \~english Input baud rate. */
       Output = 2  /*!< \~english Output baud rate. */
   };
   Q_DECLARE_FLAGS(Directions, Direction)
 
   /*! \~english
       \enum BaudRate
       Standard types of speed serial device that supports the class SerialPort.
   */

   enum BaudRate {
       Baud1200   = 1200,   /*!< \~english Speed 1200 bauds. */
       Baud1800   = 1800,   /*!< \~english Speed 1800 bauds. */
       Baud2400   = 2400,   /*!< \~english Speed 2400 bauds. */
       Baud4800   = 4800,   /*!< \~english Speed 4800 bauds. */
       Baud9600   = 9600,   /*!< \~english Speed 9600 bauds. */
       Baud19200  = 19200,  /*!< \~english Speed 19200 bauds. */
       Baud38400  = 38400,  /*!< \~english Speed 38400 bauds. */
       Baud57600  = 57600,  /*!< \~english Speed 57600 bauds. */
       Baud115200 = 115200, /*!< \~english Speed 115200 bauds. */
       UnknownBaudRate = -1 /*!< \~english Unknown speed. */
   };
   /*! \~english
       \enum DataBits
       Standard types of data bits serial device that supports the class SerialPort.
   */

   enum DataBits {
       Data5 = 5,           /*!< \~english 5 data bits. */
       Data6 = 6,           /*!< \~english 6 data bits. */
       Data7 = 7,           /*!< \~english 7 data bits. */
       Data8 = 8,           /*!< \~english 8 data bits. */
       UnknownDataBits = -1 /*!< \~english Unknown data bits. */
   };
   /*! \~english
       \enum Parity
       Standard types of parity serial device that supports the class SerialPort.
   */

   enum Parity {
       NoParity  = 0,     /*!< \~english No parity. */
       Even  = 2,         /*!< \~english Even parity. */
       Odd   = 3,         /*!< \~english Odd parity. */
       Space = 4,         /*!< \~english Space parity. */
       Mark  = 5,         /*!< \~english Mark parity. */
       UnknownParity = -1 /*!< \~english Parity unknown. */
   };
   /*! \~english
       \enum StopBits
       Standard types of stop bits serial device that supports the class SerialPort.
   */

   enum StopBits {
       One        = 2,      /*!< \~english One stop bit. */
       OneAndHalf = 3,      /*!< \~english One and half stop bits. */
       Two        = 4,      /*!< \~english Two stop bits. */
       UnknownStopBits = -1 /*!< \~english Unknown stop bits number. */
   };
   /*! \~english
       \enum FlowControl
       Standard types of flow control serial device that supports the class SerialPort.
   */

   enum FlowControl {
       NoFlowControl,      /*!< \~english Flow control "Off". */
       Hardware,           /*!< \~english Flow control "Hardware". */
       Software,           /*!< \~english Flow control "Xon/Xoff". */
       UnknownFlow = -1    /*!< \~english Flow control unknown. */
   };
   /*! \~english
       \enum LineFlag
       Flags of states of the lines: CTS, DSR, DCD, RI, RTS, DTR, ST, SR
       interface serial device (see RS-232 standard, etc.).\n
       To determine the state of the desired line is necessary to impose a mask "and" of the flag line at
       the result of the method: quint16 SerialPort::lines().
   */

   enum Line {
       Le  = 0x01, /*!< \~english Line DSR (data set ready/line enable). */
       Dtr = 0x02, /*!< \~english Line DTR (data terminal ready). */
       Rts = 0x04, /*!< \~english Line RTS (request to send). */
       St  = 0x08, /*!< \~english Line Secondary TXD (transmit). */
       Sr  = 0x10, /*!< \~english Line Secondary RXD (receive.) */
       Cts = 0x20, /*!< \~english Line CTS (clear to send). */
       Dcd = 0x40, /*!< \~english Line DCD (data carrier detect). */
       Ri  = 0x80, /*!< \~english Line RNG (ring). */
       Dsr = Le    /*!< \~english Line DSR (data set ready). */
   };
   Q_DECLARE_FLAGS(Lines, LineFlag)
 
   /*! \~english
       \enum DataErrorPolicy
   */

   enum DataErrorPolicy {
       Skip,
       PassZero,
       Ignore,
       StopReceiving
   };
 
   /*! \~english
       \enum SerialError
   */

   enum SerialError {
       NoError,                /*!< \~english Last operation successfully finished */
       NoSuchDevice,           /*!< \~english Port open failed due to device absence in the system */
       PermissionDenied,       /*!< \~english Port open failed due to insufficient rights */
       DeviceAlreadyOpened,    /*!< \~english Port open failed due to previously opened */
       DeviceIsNotOpened,      /*!< \~english Port is not opened before processing operation */
       ParityError, /*!< \~english Last read operation stops due to parity error */
       IoError /*!< \~english Other error */
   };
 
   explicit SerialPort(QObject *parent = 0);
   explicit SerialPort(const QString &deviceName, QObject *parent = 0);
   virtual ~SerialPort();
 
   void setDeviceName(const QString &deviceName);
   QString deviceName() const;
 
   virtual bool open(OpenMode mode);
   virtual void close();
 
   bool setup(qint32 bauds, Parity parity = NoParity, StopBits stopBits = One,
              FlowControl flowControl = NoFlowControl, DataErrorPolicy policy = Ignore);
 
   SerialError error() const;
   void unsetError();
 
   bool setBaudRate(qint32 bauds, Directions dir = Input | Output);
   qint32 baudRate(Directions dir = Input | Output) const;
 
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
 
   bool setParity(Parity parity);
   Parity parity() const;
 
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
 
   bool setFlowControl(FlowControl flow);
   FlowControl flowControl() const;
 
   void setDataInterval(int usecs);
   int dataInterval() const;
 
   void setReadTimeout(int msecs); //-1 - infinity, 0 - only buffered, ...
   int readTimeout() const;
 
   bool dtr() const;
   bool rts() const;
 
   Lines lines() const;
 
   bool flush(Directions dir = Input | Output);
   virtual bool reset();
 
   void setDataErrorPolicy(DataErrorPolicy policy);
   DataErrorPolicy dataErrorPolicy() const;
 
   virtual bool isSequential() const;
 
   virtual qint64 bytesAvailable() const;
   virtual qint64 bytesToWrite() const;
 
   virtual bool waitForReadyRead(int msecs);
   virtual bool waitForBytesWritten(int msecs);
 
public Q_SLOTS:
   bool setDtr(bool set);
   bool setRts(bool set);
   bool sendBreak(int duration = 0);
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
protected:
   virtual qint64 readData(char *data, qint64 maxSize);
   virtual qint64 writeData(const char *data, qint64 maxSize);
 
private:
   const SerialPortPrivate *d_ptr;
 
   Q_DECLARE_PRIVATE(SerialPort)
   Q_DISABLE_COPY(SerialPort)
};
 
inline bool SerialPort::clearBreak(bool clear)
{ return setBreak(!clear); }
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Lines)
 
#endif // SERIALPORT_H


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 14, 2011, 20:41
В целом я согласен и поддерживаю идеи b-s-a. Но есть несколько предложений (поправок):

1) Удалить из списка стандартных скоростей значение 1800
2) Переместить в приват или удалить вовсе метод setup. имхо это избыточно. При open можно установить настройки порта по-умолчанию, если иные небыли установлены ранее при помощи соответствующих сеттеров.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 14, 2011, 20:57
2) Переместить в приват или удалить вовсе метод setup. имхо это избыточно. При open можно установить настройки порта по-умолчанию, если иные небыли установлены ранее при помощи соответствующих сеттеров.
Я его специально ввел, чтобы можно было одним методом установить все основные свойства сразу.
Можно это конечно в open запихать, но будет слишком много аргументов. Да и реализовать сложней - обработка ошибок кучу лишних условий добавит.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 14, 2011, 21:44
>>Есть методы setDtr()/setRts(), а dtr()/rts() нет. Непорядок.
Согласен, нужно одного стиля придерживатся. а метод line() вообще не понятен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 14, 2011, 21:45
Я его специально ввел, чтобы можно было одним методом установить все основные свойства сразу.
Можно это конечно в open запихать, но будет слишком много аргументов. Да и реализовать сложней - обработка ошибок кучу лишних условий добавит.

Нет, я не имел ввиду переносить параметры в open. Я имел ввиду следующее:

1)

Код
C++ (Qt)
bool SerialPort::open(OpenMode mode)
{
    if ("baud rate" is not set) {
        setBaudRate(Baud9600);  //set default baud rate
    }
 
    if ("parity" is not set) {
        setParity(NoParity);  //set default parity
    }
    if ("stop bits" is not set) {
        setStopBits(One);  //set default stop bits
    }
    .....
 
    //open serial port here
}


Код
C++ (Qt)
SerialPort port("foo");
port.setBaudRate(SerialPort::Baud9600);
 
if (!port.open(_mode_)) {
    // show error message
    return;
}


2)
или ввести еще один метод open с дополнительным параметром, который будет принимать скорость порта:

Код
C++ (Qt)
bool open(OpenMode mode, qint32 bauds);

В этом случае:

Код
C++ (Qt)
bool SerialPort::open(OpenMode mode, qint32 bauds)
{
    setBaudRate(bauds);
    return open(mode);
}

3)
или задать все параметры по умолчанию, например, в конструкторе. Если пользователю необходимо изменить какой-либо параметр, он дернет соответствующий сеттер:

Код
C++ (Qt)
SerialPort port("foo");
port.setBaudRate(SerialPort::Baud9600);
port.setDataBits(SerialPort::Data7);
 
if (!port.open(_mode_)) {
    // show error message
    return;
}

мне по душе 3)

В случае с setup, при изменение, допустим, DataErrorPolicy, нужно будет перечислить все значение до него, что не есть, имхо, удобно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 14, 2011, 21:46
По поводу скоростей:
я бы взял список из QextSerialPort, там для разных ОСек разные наборы, т.е. естественные для каждого окружения.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 14, 2011, 21:49
Цитировать
Согласен, нужно одного стиля придерживатся. а метод line() вообще не понятен.

+1


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 14, 2011, 21:57
kuzulis, поздравляю!
Твоя библиотека стала активно обсуждатся. А это значит - пользователям захотелось стандартов.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 01:16
В случае с setup, при изменение, допустим, DataErrorPolicy, нужно будет перечислить все значение до него, что не есть, имхо, удобно.
Вообще-то, я предполагал использование setup только в начале работы с портом - задать все настройки одним махом. Естественно, что настройку по отдельности никто отменять не будет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 15, 2011, 01:28
Вообще-то, я предполагал использование setup только в начале работы с портом - задать все настройки одним махом. Естественно, что настройку по отдельности никто отменять не будет.

т.е. вызов setup опционален?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 15, 2011, 06:25
на мой взгляд методы типа setup() должны быть приватными.
Да и вообще лучше придерживатся идеи самих тролей (http://wiki.crossplatform.ru/index.php/Designing_Qt-Style_C%2B%2B_APIs#.D0.9B.D0.BE.D0.B2.D1.83.D1.88.D0.BA.D0.B8_.D1.83.D0.B4.D0.BE.D0.B1.D1.81.D1.82.D0.B2.D0.B0).

А насчёт метода open() и его аргумента OpenMode я что-то пропустил в обсуждении, просветите пожалуйста.
Какие могут быть режимы открытия COM Port-а?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 08:05
Итак, парни, мои 5 копеек :) :
1. Все-же хотелось бы не менять название библиотеки, т.к. оно уже устоявшийся брэнд  ;D
Тем более, проект с именем QSerialPort уже есть на гиториусе, а плодить кучу форков как-то не айс..
Согласны? :)
Я так понимаю, что если вдруг (с перепугу) проект вольется в состав Qt - то там без проблем можно будет изменить названия классов.

2.
Цитата: b-s-a
Код
C++ (Qt)
bool flush(Directions dir = Input | Output);
 
ИМХО, тут не нужны никакие Input/Output т.к. flush работает только для передачи

Цитата: b-s-a
Код
C++ (Qt)
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
Тут можно либо оставить только setBreak(bool) с входным параметром либо истина/либо ложь.
Или сделать два метода setBreak()/clearBreak() но вообще без входных параметров.

И все-таки, названия в перечислениях типа: NoParity, NoFlowControl как-то режут глаз, ИМХО.

3.
Цитата: pastor
2) Переместить в приват или удалить вовсе метод setup. имхо это избыточно.
Я вообще не вижу в этом методе смысла. Зачем при открытии порта устанавливать какие-то умолчательные параметры?
Ведь на данный момент реализовано всё гораздо лучше чем эта идея!
Кстати, я отказался от установки умолчательных параметров уже давно, т.к. было очень много отзывов убрать эту возможность.
Вот зачем, спрашивается, устанавливать 9600,8,N,1 (к примеру) при открытии порта? (насмотрелись в QextSerialPort ? :) )
Лучше вообще, его просто открыть, и определить его текущие настройки, а потом, по желанию, установить то что нужно уже паблик методами.
Т.е. ИМХО, лучше оставить идею такой как она есть сейчас.
(или я что-то недопонял в методе setup() ?)

Блин, глянули бы в текущие исходники QSerialDevice бы, и всё стало бы ясно. :)

Цитата: lit-uriy
По поводу скоростей:
я бы взял список из QextSerialPort, там для разных ОСек разные наборы, т.е. естественные для каждого окружения.
А я бы не брал, т.к. в линухе они стандартны вплоть до 4Мбод, в маке нет, а в винде вообще можно любые ставить.
Еще я бы тогда убрал наверное вообше перечисление скоростей, а вместо этого всунул бы метод типа standartBauds() который бы возвращал
список скоростей для данной ОС.
Хотя, хз...

Цитата: lit-uriy
Согласен, нужно одного стиля придерживатся. а метод line() вообще не понятен.
Ты имеешь ввиду не понятно имя метода и что он делает, или предлагаешь
сделать кучу методов типа: le(), cts(), dcd() ??
Если первое - то поменять имя не проблема, если второе - то придется туеву хучу раз вызывать одну и туже системную функцию
для определения статуса каждой линии.
Стиль стилем, но надо ж искать золотую середину.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 08:10
на мой взгляд методы типа setup() должны быть приватными.
Да и вообще лучше придерживатся идеи самих тролей.
О, по моему этот перевод сплагиатили скопипастили на хабр (что-то уж там точь в точь как тут).  :).

И еще, почитав соглашения Qt стиля, покопавшись в исходниках Qt, пришел к выводу: а не лучше ли не сокращать так перечисления как мы сократили сейчас?

Т.е. , к примеру, вместо
Код:
    enum Parity {
        NoParity  = 0,     /*!< \~english No parity. */
        Even  = 2,         /*!< \~english Even parity. */
        Odd   = 3,         /*!< \~english Odd parity. */
        Space = 4,         /*!< \~english Space parity. */
        Mark  = 5,         /*!< \~english Mark parity. */
        UnknownParity = -1 /*!< \~english Parity unknown. */
    };
лучше написать:
Код:
    enum Parity {
        NoParity  = 0,     /*!< \~english No parity. */
        EvenParity  = 2,         /*!< \~english Even parity. */
        OddParity   = 3,         /*!< \~english Odd parity. */
        SpaceParity = 4,         /*!< \~english Space parity. */
        MarkParity  = 5,         /*!< \~english Mark parity. */
        UnknownParity = -1 /*!< \~english Parity unknown. */
    };

и т.п. и для остальных перечислений!
Т.е лучше конкретизировать смысл значения перечисления!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 15, 2011, 09:47
>>Лучше вообще, его просто открыть, и определить его текущие настройки,
>>а потом, по желанию, установить то что нужно
а как можно открыть порт не задав режим его работы?

>>всунул бы метод типа standartBauds() который бы возвращал
>>список скоростей для данной ОС.
Да это полезно, можно без труда формочки клепать, если метод будет возвращать строки и будет метод который эти же строки скушает для установки скорости.

>>или предлагаешь сделать кучу методов типа: le(), cts(), dcd() ??
А что такое le()?

>>Т.е лучше конкретизировать смысл значения перечисления!
Я согласен. И лучше использовать пространство имён: QSerialDevice:: NoParity


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 10:14
>>а как можно открыть порт не задав режим его работы?
Элементарно:
Код
C++ (Qt)
// *nix
int fd = ::open(<имя>, <флаги>)
// windows
HANDLE h = ::CreateFile(<имя>, <флаги>);
 
И если больше ничо не настраивать, то он будет работать от настроек по умолчанию, которые были инициализированы самой ОС или
тем приложением, которое до этого использовало этот порт.

>>Да это полезно, можно без труда формочки клепать, если метод будет возвращать строки и будет метод который эти же строки скушает для установки
Да, но тов. b-s-a против.

>>А что такое le()?
Line Enable


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 15, 2011, 10:22
>>то он будет работать от настроек по умолчанию
стало быть умалчиваемые настройки есть (не важно ОСьки или библиотеки).

>>Да, но тов. b-s-a против.
подкинь ссылку на обсуждение

>>Line Enable
И что же это такое? Про какую линию речь?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 10:29
>>стало быть умалчиваемые настройки есть (не важно ОСьки или библиотеки).
Да, есть. Но при этом, метод setup() не нужен!  :)

>>подкинь ссылку на обсуждение
В этой теме чуть выше (на пару страниц), вот: http://www.prog.org.ru/index.php?topic=9537.msg123839#msg123839

>> И что же это такое? Про какую линию речь?
Line Enable :)
Я так понимаю, что это DSR,
но хз.
Просто в *nix есть константа: TIOCM_LE
и можно написать:
Код:
::ioctl(this->descriptor, TIOCMGET, &temp);
...
if (temp & TIOCM_LE) status |= AbstractSerial::LineLE; << Вот это
...
if (temp & TIOCM_DSR) status |= AbstractSerial::LineDSR; << А также есть это


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 10:32
Цитировать
ИМХО, тут не нужны никакие Input/Output т.к. flush работает только для передачи
Под линухом можно задать направление. Под Windows не помню.
Цитировать
Тут можно либо оставить только setBreak(bool) с входным параметром либо истина/либо ложь.
Или сделать два метода setBreak()/clearBreak() но вообще без входных параметров.
Тут смысл аналогичен методам setEnabled/setDisabled и setVisible/setHidden.
Цитировать
т.е. вызов setup опционален?
КОНЕЧНО!
Цитировать
Лучше вообще, его просто открыть, и определить его текущие настройки, а потом, по желанию, установить то что нужно уже паблик методами.
Т.е. ИМХО, лучше оставить идею такой как она есть сейчас.
(или я что-то недопонял в методе setup() ?)
Это просто удобный метод задать основные настройки и ничего более. А то, что он имеет кучу необязательных параметров - не проблема, можно, например, убрать policy. Тут смысл такой, что в подавляющем большинстве случаев порты работают в режиме без четности и с одним стопом, но практически всегда необходимо задать скорость. Если не использовать этот метод, то всегда при открытии порта надо будет ручками задавать следующие свойства:
1. скорость
2. четность
3. количество стопов
4. поведение при ошибке четности
При этом, с большой долей вероятности пользователь будет задавать 1 стоп и без четности (я уж не говорю про реакцию на ошибку четности, так как это вообще мало кому нужно). Так зачем его заставлять это делать каждый раз путем вызова 4-5 методов?
Цитировать
А насчёт метода open() и его аргумента OpenMode я что-то пропустил в обсуждении, просветите пожалуйста.
Какие могут быть режимы открытия COM Port-а?
В режиме только чтения, только записи, чтения и записи, с дополнительной буферизацией (это когда отправка/прием идут в отдельном потоке; оно надо вообще?) и без.
Цитировать
И все-таки, названия в перечислениях типа: NoParity, NoFlowControl как-то режут глаз, ИМХО.
Сам же потом будешь путаться с этими None и Off.
Цитировать
И еще, почитав соглашения Qt стиля, покопавшись в исходниках Qt, пришел к выводу: а не лучше ли не сокращать так перечисления как мы сократили сейчас?
Подозреваю, что все зависит от конкретной ситуации. Например, в QFile перечисление Error имеет общий суффикс, а Permission нет. QIODevice::OpenModeFlag не имеет ничего общего. Думаю, тут исходят из того, если название уникально и не может быть продублировано чем-нибудь, то писать коротко, если может - длинно. С другой стороны: setParity(SerialDevice::SpaceParity) выглядит менее "кузяво", чем setParity::(SerialDevice::Space).
Цитировать
Еще я бы тогда убрал наверное вообше перечисление скоростей, а вместо этого всунул бы метод типа standartBauds() который бы возвращал
список скоростей для данной ОС.
Хотя, хз...
Перечисление лучше оставить. Так у пользователя будет гарантия, что он использует стандартную скорость. А вот идея со standardBauds() (обращаю внимание на букву d) мне нравится.
Цитировать
а как можно открыть порт не задав режим его работы?
Элементарно. Открыть и всё. :)
Цитировать
>>всунул бы метод типа standartBauds() который бы возвращал
>>список скоростей для данной ОС.
Да это полезно, можно без труда формочки клепать, если метод будет возвращать строки и будет метод который эти же строки скушает для установки скорости.
Никаких строк! Только числа. GUI - не главное!
Цитировать
А что такое le()?
Line Enable, тоже самое что и DSR.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 10:36
>>то он будет работать от настроек по умолчанию
стало быть умалчиваемые настройки есть (не важно ОСьки или библиотеки).
Эти умолчания только при загрузке ОС. Более того, не исключено, что все еще зависит от драйвера. Не знаю как под Windows, но под Linux настройки порта сохраняются после закрытия приложения. Из этого следует, что настройки порта по умолчанию СЛУЧАЙНЫ и на них полагаться не нужно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 10:39
Цитата: b-s-a
Под линухом можно задать направление. Под Windows не помню.
А вроде нельзя, flush() это есть tcdrain() !

Цитата: b-s-a
При этом, с большой долей вероятности пользователь будет задавать 1 стоп и без четности (я уж не говорю про реакцию на ошибку четности, так как это вообще мало кому нужно). Так зачем его заставлять это делать каждый раз путем вызова 4-5 методов?
См. http://wiki.crossplatform.ru/index.php/Designing_Qt-Style_C%2B%2B_APIs#.D0.9B.D0.BE.D0.B2.D1.83.D1.88.D0.BA.D0.B8_.D1.83.D0.B4.D0.BE.D0.B1.D1.81.D1.82.D0.B2.D0.B0
"Ловушки удобства "

Цитировать
Из этого следует, что настройки порта по умолчанию СЛУЧАЙНЫ и на них полагаться не нужно.
ИМЕННО!  Никто не говорит что на них нужно полагаться.
Всё-равно пользователь установит сам свои настройки.
НО! Я против предустановки параметров порта при его открытии и т.п. ,
т.к. вдруг пользователю понадовится не 1 стоп бит и 8 бит данных - а иное значение,
и получается, что классу приходится дважды изменять параметры:
один раз при открытии/конструкторе
второй раз - пользователь меняет.

Предлагаю вообще при открытии порта всё оставить так как есть сейчас:
определяются текущие параметры по умолчанию и ими заполняются внутренние переменные класса. И всё!
И пользователь уже сам решает: или его удовлетворяет то что определилось, или он выборочно сам установит то что ему нужно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 10:46
"Ловушки удобства "
Я это уже смотрел. Сначала думал отказаться от setup, но затем решил, что не стоит. Он настраивает именно так, как предполагает пользователь:
Код
C++ (Qt)
setup(baud115200); //115200n1
setup(baud57600, SerialDevice::Even); //57600e1
setup(baud9600, SerialDevice::Mark, SerialDevice::Two); //9600m2


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 10:50
Цитата: b-s-a
Сначала думал отказаться от setup, но затем решил, что не стоит. Он настраивает именно так, как предполагает пользователь:
Код
C++ (Qt)
setup(baud115200); //115200n1
setup(baud57600, SerialDevice::Even); //57600e1
setup(baud9600, SerialDevice::Mark, SerialDevice::Two); //9600m2
 
Но это неявно! Зачем усложнять интерфейс лишними методами?
Пользователю придется "телепатить" и смотреть в документацию: а что будет, если я напишу только baud115200 ? И т.п.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 10:51
НО! Я против предустановки параметров порта при его открытии и т.п. ,
т.к. вдруг пользователю понадовится не 1 стоп бит и 8 бит данных - а иное значение,
и получается, что классу приходится дважды изменять параметры:
один раз при открытии/конструкторе
второй раз - пользователь меняет.

Предлагаю вообще при открытии порта всё оставить так как есть сейчас:
определяются текущие параметры по умолчанию и ими заполняются внутренние переменные класса. И всё!
И пользователь уже сам решает: или его удовлетворяет то что определилось, или он выборочно сам установит то что ему нужно.
А я разве говорил, что против? Я всегда был за! Именно для этого я ввел метод setup, чтобы пользователь мог САМ после открытия настроить порт одним махом:
Код
C++ (Qt)
SerialDevice *port = new SerialDevice("COM1");
if (!port->open(QIODevice::ReadWrite)) {}
port->setup(baud9600, SerialDevice::Odd);
//...

Ладно. Предлагаю не "сраться" из-за ерунды. Не нравится метод setup(), можно его не вводить. Надо закончить с интерфейсом класса SerialDevice и переключиться на SerialDeviceEnumerator. Который меня лично пугает еще больше.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 11:55
Цитировать
Ладно. Предлагаю не "сраться" из-за ерунды. Не нравится метод setup(), можно его не вводить. Надо закончить с интерфейсом класса SerialDevice

Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALDEVICE_H
#define SERIALDEVICE_H
 
#include <QtCore/QIODevice>
 
class SerialDevicePrivate;
 
class QSERIALDEVICE_EXPORT SerialDevice : public QIODevice
{
   Q_OBJECT
 
   Q_PROPERTY(BaudRate baudRate READ baudRate WRITE setBaudRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(SerialError error READ error RESET unsetError)
 
   Q_ENUMS( Directions BaudRate DataBits Parity StopBits FlowControl Lines DataErrorPolicy SerialError )
 
public:
 
   enum Direction  { Input = 1, Output = 2 };
   Q_DECLARE_FLAGS(Directions, Direction)
 
   enum BaudRate {
       Baud1200 = 1200, Baud2400 = 2400, Baud4800 = 4800,  
       Baud9600 = 9600, Baud19200 = 19200, Baud38400 = 38400,  
       Baud57600 = 57600, Baud115200 = 115200,
       UnknownBaudRate = -1
   };
 
   enum DataBits {
       Data5 = 5, Data6 = 6,
       Data7 = 7, Data8 = 8,
       UnknownDataBits = -1
   };
 
   enum Parity {
       NoParity = 0, EvenParity = 2, OddParity = 3,        
       SpaceParity = 4, MarkParity = 5,        
       UnknownParity = -1
   };
 
   enum StopBits {
       OneStop = 1, OneAndHalfStop = 3, TwoStop = 2,
       UnknownStopBits = -1
   };
 
   enum FlowControl {
       NoControl,      
       HardwareControl,
       SoftwareControl,
       UnknownFlowControl = -1
   };
 
   enum Line {
       Le = 0x01, Dtr = 0x02, Rts = 0x04,
       St = 0x08, Sr = 0x10, Cts = 0x20,
       Dcd = 0x40, Ri = 0x80, Dsr = Le    
   };
   Q_DECLARE_FLAGS(Lines, Line)
 
   enum DataErrorPolicy {
       SkipPolicy,
       PassZeroPolicy,
       IgnorePolicy,
       StopReceivingPolicy
   };
 
   enum SerialError {
       NoError,                
       NoSuchDeviceError,          
       PermissionDeniedError,      
       DeviceAlreadyOpenedError,    
       DeviceIsNotOpenedError,      
       ParityError,
       IoError
   };
 
   explicit SerialDevice(QObject *parent = 0);
   explicit SerialDevice(const QString &deviceName, QObject *parent = 0);
   virtual ~SerialDevice();
 
   void setDeviceName(const QString &deviceName);
   QString deviceName() const;
 
   virtual bool open(OpenMode mode);
   virtual void close();
 
   bool setBaudRate(qint32 baud, Directions dir = Input | Output);
   qint32 baudRate(Directions dir = Input | Output) const;
 
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
 
   bool setParity(Parity parity);
   Parity parity() const;
 
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
 
   bool setFlowControl(FlowControl flow);
   FlowControl flowControl() const;
 
   void setDataInterval(int usecs = 0);
   int dataInterval() const;
 
   void setReadTimeout(int msecs = 0);
   int readTimeout() const;
 
   bool dtr() const;
   bool rts() const;
 
   Lines lines() const;
 
   bool flush();
   virtual bool reset();
 
   void setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy);
   DataErrorPolicy dataErrorPolicy() const;
 
   SerialError error() const;
   void unsetError();
 
   virtual bool isSequential() const;
 
   virtual qint64 bytesAvailable() const;
   virtual qint64 bytesToWrite() const;
 
   virtual bool waitForReadyRead(int msecs);
   virtual bool waitForBytesWritten(int msecs);
 
public Q_SLOTS:
   bool setDtr(bool set);
   bool setRts(bool set);
   bool sendBreak(int duration = 0);
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
protected:
   virtual qint64 readData(char *data, qint64 maxSize);
   virtual qint64 writeData(const char *data, qint64 maxSize);
 
private:
   SerialDevicePrivate * const d_ptr;
 
   Q_DECLARE_PRIVATE(SerialDevice)
   Q_DISABLE_COPY(SerialDevice)
};
 
inline bool SerialDevice::clearBreak(bool clear)
{ return setBreak(!clear); }
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialDevice::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Lines)
 
#endif // SERIALDEVICE_H
 
 

И в, в аттаче.

Цитировать
и переключиться на SerialDeviceEnumerator. Который меня лично пугает еще больше.
Ну, начинай критику :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 12:30
1. Какому стилю соответствует размещение нескольких элементов enum'а в строке?
2. Не нравится NoControl, SoftwareControl... Тогда уж лучше NoFlowControl...
3. Забыл метод QList<int> standardBauds() const; (или нет? см. ниже)

SerialDeviceEnumerator.
предлагаю от него вообще отказаться. Так как непрерывное слежение за появлением/пропаданием портов мало кому может понадобиться. А если вдруг и понадобится, то никто не мешает посадить на таймер опрос списка доступных портов.

Поэтому, вместо этого класса предлагаю ввести SerialDeviceInfo (по аналогии QPrinterInfo):
Код
C++ (Qt)
class SerialDevice;
class SerialDeviceInfoPrivate;
 
class SerialDeviceInfo
{
public:
  SerialDeviceInfo(); //produces NULL info
  SerialDeviceInfo(const SerialDeviceInfo &other); //copy constructor
  explicit SerialDeviceInfo(const SerialDevice &device);
  SerialDeviceInfo& operator=(const SerialDeviceInfo &other);
  void swap(SerialDeviceInfo &other);
 
  QString deviceName() const;   //OS depended (/dev/ttyS0)
  QString name() const;  //frendly name like COM1, ttyS0...
  bool isNull() const;
  bool isBusy() const;
  QList<int> standardBauds() const;
  static QList<SerialDeviceInfo> availableDevices();
private:
   Q_DECLARE_PRIVATE(SerialDeviceInfo)
   SerialDeviceInfoPrivate *d_ptr;
};
Извиняйте народ, но я убрал всякие driver(), deviceId(), bus() и пр. Так как не уверен, что под системами, отличными от Windows, это можно вменяемо реализовать. Если есть простые способы сделать под *nix, то можно и оставить. Но не уверен, что тролли это пропустят, если вдруг будут включать в Qt.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 13:20
Цитировать
1. Какому стилю соответствует размещение нескольких элементов enum'а в строке?
2. Не нравится NoControl, SoftwareControl... Тогда уж лучше NoFlowControl...
3. Забыл метод QList<int> standardBauds() const; (или нет? см. ниже)
Вроде исправил, см. аттач.

Цитировать
предлагаю от него вообще отказаться. Так как непрерывное слежение за появлением/пропаданием портов мало кому может понадобиться. А если вдруг и понадобится, то никто не мешает посадить на таймер опрос списка доступных портов.
Слишком уж упрощается/урезается :(

Цитировать
Извиняйте народ, но я убрал всякие driver(), deviceId(), bus() и пр. Так как не уверен, что под системами, отличными от Windows, это можно вменяемо реализовать. Если есть простые способы сделать под *nix, то можно и оставить. Но не уверен, что тролли это пропустят, если вдруг будут включать в Qt.
Блин, оставь хоть:
Код
C++ (Qt)
....
  QString deviceName() const;   //OS depended (/dev/ttyS0)
  QString shortName() const;     //Обрезаное имя, COM1, ttyUSB0 и т.п. +++
  QString friendlyName() const;  //+++
  QString description() const;     //+++
  QString manufacturer() const;     //+++
 
  bool isNull() const;   //Что сие значит?
  bool isBusy() const; //Насчет этого метода не уверен, т.к. тормозит в винде.
....
 

Хотя, почему бы не оставить и другие методы (vid,pid и т.п.) ?
Ну подумаешь, в некоторых ОС они будут пустую строку возвращать, ну и пусть.

Это ж класс - ИНФО в конце то концов.  :)

Насчет списка стандартных скоростей: а может и вправду этот метод сюда сунуть вместо класса порта?

Причем, если бы была возможность определить реальные типы скоростей поддерживаемые тем или иным портом/драйвером - это было б здорово.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 15, 2011, 13:32
>>то всегда при открытии порта надо будет ручками задавать следующие свойства:
а почему всегда? Порт что после закрытия забывает настройки?

я вижу применение так:
Код
C++ (Qt)
QSerialDevice *port = new QSerialDevice();
 
setBodeRate(...);
setParity(...);
// и так далее
 
// где-то в коде
if (!port->open())
   ERROR
// пользуемся
 
port->close();
 
 
// где-то опять в коде
if (!port->open())
   ERROR
// пользуемся
 
port->close();
 
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 13:40
>>а почему всегда? Порт что после закрытия забывает настройки?
Только если мы перед закрытием эти настройки (в системе) не восстанавливаем.
В противном случае (если только закрываем дескриптор), то настройки порта (в системе) сохраняются.  

>>я вижу применение так:
Не, не, не, сначала нужно порт открыть, а потом уже конфигурировать (ИМХО).
Это само собой разумеется и естественней.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 15, 2011, 13:42
>>Не, не, не, сначала нужно порт открыть, а потом уже конфигурировать (ИМХО).
это для меня открытие!

Насколько помню винАПИ:
Заполняем всякие DCB и т.п. потом открываем файл


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 13:44
Цитировать
это для меня открытие!

Насколько помню винАПИ:
Заполняем всякие DCB и т.п. потом открываем файл
Нет, чтобы получить/установить DCB - нужно сначала получить дескриптор !
А чтобы получить дескриптор - нужно открыть порт!  ;)

В *nix аналогично.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 13:57
Блин, оставь хоть:
Код
C++ (Qt)
....
  QString deviceName() const;   //OS depended (/dev/ttyS0)
  QString shortName() const;     //Обрезаное имя, COM1, ttyUSB0 и т.п. +++
  QString friendlyName() const;  //+++
  QString description() const;     //+++
  QString manufacturer() const;     //+++
 
  bool isNull() const;   //Что сие значит?
  bool isBusy() const; //Насчет этого метода не уверен, т.к. тормозит в винде.
....
 
Чем shortName() от friendlyName() будет отличаться? Или ты хотел friendlyName() чтобы возвращала "последовательный порт 1 на шине USB"? Думаю, достаточно "COM1". Как вариант: "Serial1", "Serial2"... Но при переводе будет не очень коротко... Думаю, лучше оставить "COM1"... Пусть в разных системах называется по разному. Думаю, ничего в этом страшного нет.
manufacturer()/description() - ну зачем? Это же для работы особо не нужно. Так, "рюшечки".

Хотя, почему бы не оставить и другие методы (vid,pid и т.п.) ?
Ну подумаешь, в некоторых ОС они будут пустую строку возвращать, ну и пусть.

Это ж класс - ИНФО в конце то концов.  :)
Вот решит какой-то программер использовать это все в своей проге. Под виндой все пашет, а под *nix вообще не работает - порты не находятся или названий не имеют.
Причем, если бы была возможность определить реальные типы скоростей поддерживаемые тем или иным портом/драйвером - это было б здорово.
Можно попробовать перебором задать все стандартные скорости и определить, какие из них не вызывают ошибок. Но не уверен, что оно того стоит.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 14:06
Цитировать
Чем shortName() от friendlyName() будет отличаться? Или ты хотел friendlyName() чтобы возвращала "последовательный порт 1 на шине USB"?
1. shortName() - это то что у тебя было как: name()
2. friendlyName() - да, будет возвращать примерно то что ты написал (т.е. тот же функционал что и реализован на данный момент в библиотеке)

Цитировать
Но при переводе будет не очень коротко..
Зачем переводить?

Цитировать
manufacturer()/description() - ну зачем? Это же для работы особо не нужно. Так, "рюшечки".
Ну да, рюшки. Но это же класс который поставляет информацию!

Цитировать
Вот решит какой-то программер использовать это все в своей проге. Под виндой все пашет, а под *nix вообще не работает - порты не находятся или названий не имеют.
Имеют, по крайней мере в linux и macOSX. В остальных случаях, если какой-то параметр не будет найден,
можно возвращать что-то типа "Не найдено".

Я же не зря добавлял эти методы и искал соответствие в разных ОС.
И, по крайней мере, в трёх ОС: Windows, Linux, MacOSX они совпадают.

И в конце концов: а почему бы и нет?

Цитировать
Можно попробовать перебором задать все стандартные скорости и определить, какие из них не вызывают ошибок. Но не уверен, что оно того стоит.
Согласен, оно не нужно, можно просто выводить "стандартный" список.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 14:57
Хорошо. Пусть будут. Но без фанатизма. Кому-нибудь нужны всякие низкоуровневые вещи (bus, vendorId, ...)?
Тогда надо разобраться с кучей name, например:
1. Заменить название deviceName на deviceId (под nix* будет /dev/ttyS0..., под Windows \\\\.\\COMx) в т.ч. и в SerialDevice
2. Заменить shortName() на name() ("ttySx", "COMx")
Итого, будет 2 типа имени: просто и "дружественное", а так же нестандартизированный (содержимое QString) идентификатор порта.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 15:10
Цитировать
1. Заменить название deviceName на deviceId (под nix* будет /dev/ttyS0..., под Windows \\\\.\\COMx) в т.ч. и в SerialDevice
Может тогда на devicePath() (или pathToDevice())?

Но, если заменим и в SerialDevice, то нужно будет в SerialDevice изменить метод setDeviceName() на setName(),
а deviceName() на name() ?
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 16:55
Цитировать
1. Заменить название deviceName на deviceId (под nix* будет /dev/ttyS0..., под Windows \\\\.\\COMx) в т.ч. и в SerialDevice
Может тогда на devicePath() (или pathToDevice())?

Но, если заменим и в SerialDevice, то нужно будет в SerialDevice изменить метод setDeviceName() на setName(),
а deviceName() на name() ?
 
Ты не понял. Я предлагаю заменить на: SerialDevice::setDeviceId()


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 17:37
Цитировать
Ты не понял. Я предлагаю заменить на: SerialDevice::setDeviceId()
1. Но ведь \\\\.\\COMx (/dev/ttyS0) это ну никак не DeviceId, это скорее DevicePath
2. Пользователь может и не знать, что для портов с номерами >9 нужно писать \\\\.\\

Предлагаю для SerialDevice :
Цитировать
Может тогда на devicePath() (или pathToDevice())?

Но, если заменим и в SerialDevice, то нужно будет в SerialDevice изменить метод setDeviceName() на setName(),
а deviceName() на name() ?
И имена в setName() писать "короткие" просто : COMx (или ttyXYZ).
Или же не заменять имена методов (оставить setDeviceName()/deviceName()), а просто параметризировать их короткими именами/параметрами.

А вот для SerialDeviceInfo :
Оставить методы/параметры типа deviceName(), но в них указывать короткие имена.
А вот для получения "длинных" имен ( \\\\.\\COMx (/dev/ttyS0)), можно использовать devicePath() (вместо deviceId()).

А то что ты называешь "дружественным именем" - это не COMx (ttyXYZ),
а к примеру это:
Prolific USB-to-Serial Comm Port (COM4)
или
ZTE Proprietary USB Modem
или
ZTE Diagnostics Interface (COM9)
или
SAMSUNG CDMA Modem #2
и т.д. т.е. этот метод чисто для информации об устройстве (как и все остальные кроме deviceName()/setDeviceName()).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 17:45
Цитировать
Ты не понял. Я предлагаю заменить на: SerialDevice::setDeviceId()
1. Но ведь \\\\.\\COMx (/dev/ttyS0) это ну никак не DeviceId, это скорее DevicePath
2. Пользователь может и не знать, что для портов с номерами >9 нужно писать \\\\.\\
Хорошо. Давай это назовем portId. Я против названия devicePath (и вообще упоминаний path).
Предлагаю для SerialDevice :
Цитировать
Может тогда на devicePath() (или pathToDevice())?

Но, если заменим и в SerialDevice, то нужно будет в SerialDevice изменить метод setDeviceName() на setName(),
а deviceName() на name() ?
И имена в setName() писать "короткие" просто : COMx (или ttyXYZ).
Или же не заменять имена методов (оставить setDeviceName()/deviceName()), а просто параметризировать их короткими именами/параметрами.
Вообще-то я предполагал, что порт можно открыть передав в качестве параметра или короткое имя порта (COM1), или его идентификатор (\\\\.\\COM1).
А вот для SerialDeviceInfo :
Оставить методы/параметры типа deviceName(), но в них указывать короткие имена.
А вот для получения "длинных" имен ( \\\\.\\COMx (/dev/ttyS0)), можно использовать devicePath() (вместо deviceId()).

А то что ты называешь "дружественным именем" - это не COMx (ttyXYZ),
а к примеру это:
Prolific USB-to-Serial Comm Port (COM4)
или
ZTE Proprietary USB Modem
или
ZTE Diagnostics Interface (COM9)

и т.д. т.е. этот метод чисто для информации об устройстве (как и все остальные кроме deviceName()/setDeviceName()).
Ох... Я и не знал. Значит это вообще нужно или убрать, или назвать как-то иначе. Как-нибудь, deviceDescription().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 15, 2011, 18:50
Цитировать
Хорошо. Давай это назовем portId. Я против названия devicePath (и вообще упоминаний path).
Я б вообще не использовал этот метод.

Цитировать
Вообще-то я предполагал, что порт можно открыть передав в качестве параметра или короткое имя порта (COM1), или его идентификатор (\\\\.\\COM1).
А я предполагал, что нужно открывать ограничившись только короткими именами: COMx, ttyXYZ.
т.е. запретить любое двоякое толкование.

Цитировать
Ох... Я и не знал. Значит это вообще нужно или убрать, или назвать как-то иначе. Как-нибудь, deviceDescription().
Не, ну ты хоть бы запустил/проверил/ознакомился для приличия примеры QSerialDevice в /gui/testapp , а потом бы мы конструктивно пообщались. Или слазил бы в виндовый реестр.
А то диалог напоминает: я тебе про Фому, ты мне про Ерёму.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 15, 2011, 20:50
Цитировать
Ох... Я и не знал. Значит это вообще нужно или убрать, или назвать как-то иначе. Как-нибудь, deviceDescription().
Не, ну ты хоть бы запустил/проверил/ознакомился для приличия примеры QSerialDevice в /gui/testapp , а потом бы мы конструктивно пообщались. Или слазил бы в виндовый реестр.
А то диалог напоминает: я тебе про Фому, ты мне про Ерёму.
Я виндой не пользуюсь.
Под Linux у меня testapp для стандартного порта ничего толком не показала, а friendlyName() был " (/dev/ttyS0)". А так же было еще 30 портов, которых фактически в системе нет (но записи в /dev/ есть).

и так. Что я предлагаю:
SerialDeviceInfo::name() -> "COM1", "ttyS0"...
SerialDeviceInfo::deviceId() -> "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
SerialDeviceInfo::friendlyName() -> тут логика сложней. Но вариант " (/dev/ttyS0)" не допустим. В крайнем случае должно возвращать тоже, что и name().

Так же предлагаю сделать возможность простого определения существует порт или только в системе зарегистрирован. Для этого достаточно его открыть и попытаться получить характерные для порта параметры.

Библиотеку libudev.so следует грузить динамически. Если ее нет, то откатываться к стандартному минимальному варианту.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 05:44
Как вариант:
portName = "COM24", "ttyS45"
fileName = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
deviceName = "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port (COM4)"



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 08:01
Цитата: b-s-a
Под Linux у меня testapp для стандартного порта ничего толком не показала, а friendlyName() был " (/dev/ttyS0)".
Да, потому что в линухе для стандартных портов нет описания. Тут можно самим возвращать что-то типа "Стандартный порт".
И да, так и быть, можно отказаться от метода friendlyName() и вместо него оставить метод description() который будет возвращать описание.

Цитата: b-s-a
и так. Что я предлагаю:
SerialDeviceInfo::name() -> "COM1", "ttyS0"...
Ок, тогда и в SerialDevice тоже меняем имя метода setDeviceName(const QString &deviceName) на setName(const QString &name)!
Где name - это будут только имена типа "COM1", "ttyS0".
(аналогично меняем и имена геттеров в SerialDevice ).

Цитата: b-s-a
SerialDeviceInfo::deviceId() -> "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
Не знаю, не нравится мне ID.
Я бы заменил на что нить другое, например на: alias() или path().

т.е. в итоге:

SerialDevice
Код
C++ (Qt)
class QSERIALDEVICE_EXPORT SerialDevice : public QIODevice
{
...
...
   explicit SerialDevice(QObject *parent = 0);
   explicit SerialDevice(const QString &name, QObject *parent = 0);
   virtual ~SerialDevice();
 
   void setName(const QString &name);
   QString name() const;
...
}
 
где
   name = "COM24", "ttyS45"

SerialDeviceInfo
Код
C++ (Qt)
class SerialDevice;
class SerialDeviceInfoPrivate;
 
class SerialDeviceInfo
{
public:
  SerialDeviceInfo(); //produces NULL info
  SerialDeviceInfo(const SerialDeviceInfo &other); //copy constructor
  explicit SerialDeviceInfo(const SerialDevice &device);
  SerialDeviceInfo& operator=(const SerialDeviceInfo &other);
  void swap(SerialDeviceInfo &other);
 
  QString name() const;  //COM1, ttyS0...
  QString alias() const; //"\\\\\\\\.\\\\COM24", "/dev/ttyS45"
  QString description() const; //"Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const; //"(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  QList<int> standardBauds() const;
  static QList<SerialDeviceInfo> availableDevices();
private:
   Q_DECLARE_PRIVATE(SerialDeviceInfo)
   SerialDeviceInfoPrivate *d_ptr;
};
 

Цитата: b-s-a
Так же предлагаю сделать возможность простого определения существует порт или только в системе зарегистрирован. Для этого достаточно его открыть и попытаться получить характерные для порта параметры.
Согласен, определять нужно. Но вот, может можно обойтись не открывая порт?
Может быть, есть и еще какие-нить возмоджности?

Цитата: b-s-a
Библиотеку libudev.so следует грузить динамически. Если ее нет, то откатываться к стандартному минимальному варианту.
Согласен. Типо парсить вручную /proc, /sys  :)


Цитата: lit-uriy
Как вариант:
portName = "COM24", "ttyS45"
fileName = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
deviceName = "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port (COM4)"
А то что я чуть выше предложил не пойдет?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 09:59
alias() мне не нравится, т.к. речь всё равно не о псевдониме идёт, а о полном имени файла (не пути).
лучше fileName().
Насчёт description() - вполне.

>>Для этого достаточно его открыть и попытаться получить характерные для порта параметры.
И до какого номера/имени проверять? И в какой момент? А если порт занят?

В программе COM PortToolkit показывается список доступных портов, и занятые помечаются. Как это делается я не знаю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 10:18
Что-то тут может и полезное:
http://www.naughter.com/enumser.html


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 10:24
Цитата: lit-uriy
alias() мне не нравится, т.к. речь всё равно не о псевдониме идёт, а о полном имени файла (не пути).
лучше fileName().
Может тогда : fullName() ?




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 10:47
Цитировать
Согласен. Типо парсить вручную /proc, /sys
Нет! Просто тупо распарсить содержимое /dev по имени файла.
Цитировать
Может тогда : fullName() ?
А может просто - device()? А у SerialDevice метод сделать setDevice().
Я просто не хочу, чтобы эта хрень имела в названии слово name. Так как народ будет пытаться его выводить пользователям. И вот будет сюрприз, когда однажды выведется хрен знает что (типа UUID).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 11:05
Цитата: b-s-a
А может просто - device()? А у SerialDevice метод сделать setDevice().
Я просто не хочу, чтобы эта хрень имела в названии слово name. Так как народ будет пытаться его выводить пользователям. И вот будет сюрприз, когда однажды выведется хрен знает что (типа UUID).
А может setDeviceName(const QString &deviceName)/deviceName() ,
при этом, параметрами будут имена: "COM1", "ttyS0".
И жестко ограничится только такими именами!
Т.к. имена  "COM1", "ttyS0" и есть имена устройств, если судить здраво.

т.е. SerialDevice
будет содержать (как и ранее было) методы:  setDeviceName(const QString &deviceName)/deviceName(),
где имена: "COM1", "ttyS0".


т.е. SerialDeviceInfo
будет содержать  device() и будет возвращать: "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
т.к. это не только имя устройства, а еще и путь к устройству!
и будет содержать deviceName(), где имена: "COM1", "ttyS0".

Я склоняюсь к такому варианту.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 11:29
Я бы хотел, чтобы SerialDevice::setDeviceName() принимал как "\\\\\\\\.\\\\COM10", так и "COM10", и это было бы равнозначно. Чтобы понять почему, нужно представить, что файл устройства создан не там, где мы его ожидаем увидеть (ну мало ли). А так, мы убиваем сразу всех зайцев.
В то же время, чтобы SerialDeviceInfo::device() возвращала результат только вида "\\\\\\\\.\\\\COM10"...

Еще можно добавить в SerialDevice конструктор и метод установки устройства из объекта SerialDeviceInfo. Что сильно упростит жизнь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 11:41
Цитировать
Я бы хотел, чтобы SerialDevice::setDeviceName() принимал как "\\\\\\\\.\\\\COM10", так и "COM10", и это было бы равнозначно. Чтобы понять почему, нужно представить, что файл устройства создан не там, где мы его ожидаем увидеть (ну мало ли). А так, мы убиваем сразу всех зайцев.
Ну зачем так усложнять то?

Можно сделать проще:

SerialDevice::setDeviceName() - только COM1, ttyS0
SerialDevice::setDevice() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

SerialDeviceInfo::deviceName() - только COM1, ttyS0
SerialDeviceInfo::setDevice() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

Каждый метод должен заниматься своим делом!

Разделяй и властвуй (с)

ЗЫ: хотя,
Цитировать
принимал как "\\\\\\\\.\\\\COM10", так и "COM10", и это было бы равнозначно.
Фигня какая то... А что тогда будет возвращать SerialDevice::deviceName() ?
Если устанавилваем "\\\\\\\\.\\\\COM10", то возвращает "\\\\\\\\.\\\\COM10", если "COM10", то "COM10" ?
Ерунда какая то.

Лучше сделать только "COM10", "ttyS0" и не интерпретировать как вздумается, ИМХО.

Цитировать
Еще можно добавить в SerialDevice конструктор и метод установки устройства из объекта SerialDeviceInfo. Что сильно упростит жизнь.
Согласен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 11:42
>>А может просто - device()?
device - устройство, а не имя файла, порта.

>>Я просто не хочу, чтобы эта хрень имела в названии слово name.
>>Так как народ будет пытаться его выводить пользователям.
если есть чёткое отличие в именах, например:
port->name()
port->fileName()
то уже становится очевидно


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 11:44
>>Т.к. имена  "COM1", "ttyS0" и есть имена устройств, если судить здраво.
всё таки "COM1", "ttyS0" - имена портов, а не устройств.
Устройства - мобильник, промконтроллер, преобразователь интерфейса, и "стандартный последовательный порт в конце концов"


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 11:50
Цитата: lit-uriy
всё таки "COM1", "ttyS0" - имена портов, а не устройств.

Порт - устройство, устройство - не порт! Чуишь разницу?
Что, /dev/hda не устройство, а ЖД ?
А в остальном, согласен с тобой! :)
Нужно мух отделять от котлет.

Можно на крайняк так:

SerialDeviceInfo::deviceName() - только COM1, ttyS0
SerialDeviceInfo::deviceLocation() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

Чем не угодно то?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 11:51
Ну зачем так усложнять то?

Можно сделать проще:

SerialDevice::setDeviceName() - только COM1, ttyS0
SerialDevice::setDevice() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

SerialDeviceInfo::deviceName() - только COM1, ttyS0
SerialDeviceInfo::setDevice() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

Каждый метод должен заниматься своим делом!
Не думаю, что это будет сильным упрощением разработчику библиотеки. А вот пользователь будет долго чесать репу, зачем тут два метода.
Итак, мое предложение:
Код
C++ (Qt)
class SerialDeviceInfo;
class SerialDevice
{
//...
public:
//...
  SerialDevice(const QString &device, QObject *parent = 0); //see setDevice(QString);
  SerialDevice(const SerialDeviceInfo &info, QObject *parent = 0);
  void setDevice(const SerialDeviceInfo &info);
  void setDevice(const QString &device); //device may be: "\\\\\\\\.\\\\COM1", "COM1", "/dev/ttyS0", "ttyS0"...
  QString device() const; //returns something like "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
//...
};
Цитировать
>>Т.к. имена  "COM1", "ttyS0" и есть имена устройств, если судить здраво.
всё таки "COM1", "ttyS0" - имена портов, а не устройств.
Устройства - мобильник, промконтроллер, преобразователь интерфейса, и "стандартный последовательный порт в конце концов"
Именно поэтому я предлагал назвать класс SerialPort... Но меня не поддержали.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 11:51
вооще надо накидать пару примеров кода использования библиотеки.
Например два варианта - Консольное и Графическое приложения.
1) в консольном, информация о работе с портами может браться из:
 - а) аргументы командной строки
 - б) конфигурационного файла
 - в) БД
2) в гграфическом - из:
 - а) интерфейса пользователя (комбобоксы и прочее)
 - б) конфигурационного файла
 - в) БД
в комбобоксах она берётся из той же библиотеки.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 16, 2011, 11:52
Я бы так сильно не зацикливался на этом этапе.

description(), manufacturer(), pid(), etc большенству пользователей ненужны и я предлагаю пока их опустить.

Оставить лишь:

1) name() -> "COM1", "ttyS0"
2) fullName() -> "\\\\\\\\.\\\\COM10", "/dev/ttyS0"


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 16, 2011, 11:53
Цитировать
Именно поэтому я предлагал назвать класс SerialPort... Но меня не поддержали.

Я поддерживаю. ТОлько хотел написать по этому поводу, что SerialDevice как-то не то (не передает смысл назначения класса).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 11:54
>>Чем не угодно то?
мудрёностью и неоднозначностью.
Сравни с таким вариантом:
Код
C++ (Qt)
port->name = "COM24", "ttyS45"
port->fileName = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
port->deviceName = "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port (COM4)"


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 12:02
Код
C++ (Qt)
QList<SerialDeviceInfo> ports = SerialDeviceInfo::availableDevices();
//SerialDevice *port = new SerialDevice(ports[0], this);
//SerialDevice *port = new SerialDevice("COM1", this);
SerialDevice *port = new SerialDevice("/dev/ttyS0", this);
port->open();
port->setBaudRate(SerialDevice::Baud15200);
port->setParity(SerialDevice::NoParity);
port->setStopBits(SerialDevice::OneStop);
port->setDataErrorPolicy(SerialDevice::SkipPolicy);
//...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 12:14
Цитата: b-s-a
Именно поэтому я предлагал назвать класс SerialPort... Но меня не поддержали.
Для этого нужно заводить новый репозитарий и т.п. Начинать всё с нуля.
И те пользователи, которые привыкли к QSerialDevice, QextSerialPort и т.п. будут в непонятках.
А тем более, будут в непонятках те, кто до этого использовали QSerialPort от Ибица Лабс!
И туева хуча зоопарков не есть хорошо.

Цитата: b-s-a
Код
C++ (Qt)
...
QString device() const; //returns something like "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
...
 
Ага, если мы установили "ttyS0", то оно нам покажет  "/dev/ttyS0" ? Как-то некошерно.
Установили одно, а показывает другое?

Для SerialDevice
Нужно жестко определится с форматом имени устройства для установки, я против такого разнообразия,
я только за установку имен типа:  COM1, ttyS0 ()
И метод для этого использовать только один: SerialDevice::setDeviceName(ttyS0) !
Также, естественно, приняв новые методы и новый конструктор от b-s-a.

Цитата: pastor
Я поддерживаю. ТОлько хотел написать по этому поводу, что SerialDevice как-то не то (не передает смысл назначения класса).
Блин, поймите, что открываем мы в конце то концов и работаем с устройством, как бы оно не называлось: serial port, game port, usb и т.п.
То, не то, но уже свободные имена забиты и позняк метаться (я б и сам бы назвал SerialPort, но уже до нас всё так поназывали и будет путаница).

>>Чем не угодно то?
мудрёностью и неоднозначностью.
Сравни с таким вариантом:
Код
C++ (Qt)
port->name = "COM24", "ttyS45"
port->fileName = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
port->deviceName = "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port (COM4)"

для SerialDeviceInfo
А я к примеру так бы поменял:
Код
C++ (Qt)
SerialDeviceInfo::deviceName() = "COM24", "ttyS45"
SerialDeviceInfo::deviceLocation() = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
SerialDeviceInfo::description()= "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port"
 
Ну или вместо deviceLocation() можно systemLocation()


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 12:21
Набросок для графического приложения
Код
C++ (Qt)
QComboBox *combo = new QComboBox();
SerialPort *port = new SerialPort();
 
QStringList names = SerialPort::availablePortNames();
combo->addItems(names);
 
connect(combo, SIGNAL(currentIndexChanged(const QString&)),
           this, SLOT(setPortName(const QString&)));
 
This::setPortName(const QString& name)
{
   port->setName(name);
}

аналогично со скоростями и другими параметрами.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 12:25
Цитировать
Для этого нужно заводить новый репозитарий и т.п. Начинать всё с нуля.
Но ты почему-то не стал заводить новый перозиторий для AbstractSerialDevice. ;)
Цитировать
И те пользователи, которые привыкли к QSerialDevice, QextSerialPort и т.п. будут в непонятках.
От этого класса в любом случаю старые пользователи будут в непонятках. Но никто же не отменяет старые классы!
Цитировать
А тем более, будут в непонятках те, кто до этого использовали QSerialPort от Ибица Лабс!
Я им искренне сочувствую. Видел я интерфейс этого класса, там даже четность установить нельзя, не говоря уж о стопах.
Цитировать
И туева хуча зоопарков не есть хорошо.
В OpenSource это нормально. Пусть библиотека называется QSerialDevice, а класс будет SerialPort.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 12:26
>>Пусть библиотека называется QSerialDevice, а класс будет SerialPort.
А к стати, ДА!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 12:33
Цитировать
В OpenSource это нормально. Пусть библиотека называется QSerialDevice, а класс будет SerialPort.
;D
Во, точно! Это выход. Согласен! Всё дружно переименовываем!

Код
C++ (Qt)
class SerialPort;
class SerialPortInfoPrivate;
 
class SerialPortInfo
{
public:
  SerialPortInfo(); //produces NULL info
  SerialPortInfo(const SerialPortInfo&other); //copy constructor
  explicit SerialPortInfo(const SerialPort &port);
  SerialPortInfo& operator=(const SerialPortInfo&other);
  void swap(SerialPortInfo&other);
 
  QString name() const;  //COM1, ttyS0...
  QString systemLocation() const; //"\\\\\\\\.\\\\COM24", "/dev/ttyS45"
  QString description() const; //"Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const; //"(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  QList<int> standardBauds() const;
  static QList<SerialPortInfo> availablePorts();
private:
   Q_DECLARE_PRIVATE(SerialPortInfo)
   SerialPortInfoPrivate *d_ptr;
};
 



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 12:39
kuzulis в с 4 именами в SerialPortInfo согласен:
name()
systemLocation()
description()
manufacturer()

А остальные что значат?

И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 12:40
>>А остальные что значат?
ХЗ, это к b-s-a  :)

Ну типо:
bool isBusy() const - это если порт занят/открыт
bool isNull() const; - это к b-s-a
QList<int> standardBauds() const - это возвращает список скоростей поддерживаемых портом (для каждой ос, и может быть, каждого порта он разный)
т.е. скорее всего этот метод standardBauds() лучше перенести в SerialPortInfo из SerialPort, т.к. SerialPort не должен ничего по идее знать
о других портах. Он должен выполнять только свои функции.

>>И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)
Ну, это врядли одобрят.  ;)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 12:47
А остальные что значат?
Ты про служебные методы (конструкторы/операторы)? Или про availablePorts() и standardBauds()? Если про последнее, то:
availablePorts() - возвращает список зарегистрированных в системе портов (может переименовать в registeredPorts?)
standardBauds() - возвращает список стандартных для порта скоростей (зависит в первую очередь от ОС).

И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)
Списки чего? Все это можно будет сделать внешними функциями.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 12:52
>>Списки чего?
http://www.prog.org.ru/index.php?topic=9537.msg124454#msg124454

>>Все это можно будет сделать внешними функциями.
В смысле в коде программы? Каждый себе обёрток на лепит и будет их повторно использовать + библиотека?

Бибилиотека должна быть полной/завершённой.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 16, 2011, 13:07
Цитировать
И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)

Голосую против.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 13:25
Цитировать
И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)
Я тоже против. Похожие классы Qt этого не делают (пример: QPrinterInfo (http://doc.qt.nokia.com/qprinterinfo.html)).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 13:35
>>Все это можно будет сделать внешними функциями.
В смысле в коде программы?
В смысле "не методами". Т.е. в той же библиотеке, но внешние по отношению к классу функции.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 13:38
b-s-a, приведи пример кода использования, можешь за основу взять мой код (http://www.prog.org.ru/index.php?topic=9537.msg124454#msg124454)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 14:02
Например:
Код
C++ (Qt)
QStringList names = namesFromPorts(SerialPort::availablePorts());
Но на названии функции я не настаиваю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 14:15
Например:
Код
C++ (Qt)
QStringList names = namesFromPorts(SerialPort::availablePorts());
Но на названии функции я не настаиваю.
Не SerialPort::availablePorts(), а SerialPortInfo::availablePorts(), ИМХО, так лучше.
Мы же (я) условились убрать метод SerialPort::availablePorts().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 14:20
Не SerialPort::availablePorts(), а SerialPortInfo::availablePorts(), ИМХО, так лучше.
Мы же (я) условились убрать метод SerialPort::availablePorts().
Точно. Я просто не глядя скопировал.  ::)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 16, 2011, 14:44
Для пользователей можно оставить текущую реализацию библиотеки и заниматься лишь её поддержкой.

Для новой (обсуждаемой на данный момент) реализации создать отдельную ветку. Ведь именно эту реализацию планируем включить в состав Qt. Во время разработки можно постепенно ориантировать пользователей именно на эту версию.

Иными словами, на данный момент не рубать "старую" версию, а лишь параллельно разрабатывать новую.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 16, 2011, 15:12
А че тролли разве не только своей лаборатории доверяют? Прям так возьмут? Может сначала спросить? или я что-то пропустил...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 15:25
А че тролли разве не только своей лаборатории доверяют? Прям так возьмут? Может сначала спросить? или я что-то пропустил...
Не факт что возьмут. Их разработчик сказал, что Нокия не сильно заинтересована в последовательном порте и поддержку его осуществлять им влом.
С другой стороны, если все сделать грамотно и красиво, то шансы сильно возрастут.
А потом, есть еще проблемы с лицензированием. Библиотеку под лицензией GPL не возьмут 100%. Уверен на 99,99%, что LGPL не возьмут тоже. Я так понимаю, она должна быть под BSD-подобной лицензией или вообще Public Domain.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 15:47
К тому времени нокия развалится, Qt купит кто-нить другой, и шансы еще возрастают! :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 16:24
Лицензия должна быть таже что и у участии в совершенствовании исходного кода. По сути автор должен уступить Нокии все права, т.к. Qt собственность Нокии и она кому хочет, тому и продаёт комерческую лицензию.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 16:29
Например:
Код
C++ (Qt)
QStringList names = namesFromPorts(SerialPort::availablePorts());
Но на названии функции я не настаиваю.
Впринципе нормально, только болтаемость функции в воздухе будет вносить в прикладной код некоторую неразбериху. Я предлагаю сделать пространство имён SerialDevice и внего совать всякие "свободные" функции.
А если ещё сделать функцию, которая вообще аргументов не прнимает, а сразу дёргает нужный статический член, то записи получатся проще:
Код
C++ (Qt)
QStringList names = SerialDevice::availablePortNames();


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 16:36
Лицензия должна быть таже что и у участии в совершенствовании исходного кода. По сути автор должен уступить Нокии все права, т.к. Qt собственность Нокии и она кому хочет, тому и продаёт комерческую лицензию.
Лицензия BSD это не запрещает.

Думаю, сейчас не стоит делить шкуру неубитого медведя  ;)

А по поводу имен портов ты посмотри класс QPrinterInfo. Там нет ничего похожего. В нашем случае, все будет еще круче - у нас будет куча вариантов именования портов (по description, по deviceName() и т.п.), и каждый программер будет выбирать наиболее подходящий именно ему. Поэтому, я бы вообще отказался бы от подобных функций. Тем более, что не сложно сделать:
Код
C++ (Qt)
foreach(const SerialPortInfo &info, SerialPortInfo::availablePorts())
  comboBox->addItem(info.name());


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 16, 2011, 16:42
Поддерживаю b-s-a


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 16:48
>>ты посмотри класс QPrinterInfo. Там нет ничего похожего.
мне он как-то побоку. Я им не пользуюсь

Если либу делать, то делать так, чтобы её можно было максимально эффективно использовать. И наче вообще смысла нет, пусть останется как есть и сейчас всё из неё выковырять можно.

Цикл и можно и нужно записать внутри либы.

И к стати, если с именем порта всё более или мение сносно, то как например дела обстаят со скоростью.
Как заполнить комбобокс и как потом его использовать?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 16, 2011, 16:52
А откуда kuzulis-y знать кто как комбо бокс юзает. Я например вообще модель люблю в него засунуть, так что же мне kuzulis должен qabstractmodel* выдать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 16:58
И к стати, если с именем порта всё более или мение сносно, то как например дела обстаят со скоростью.
Как заполнить комбобокс и как потом его использовать?
Код
C++ (Qt)
foreach(int speed, info.standardBauds())
  comboBox->addItem(QString::number(speed));


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 17:48
Кстати, подсмотрел тут в конкурирующей библиотеке, что можно метод работы со скоростью назвать просто rate:
Код
C++ (Qt)
class SerialPort
{
//...
  enum Rates {
      Rate9600,
      Rate19200,
//...
  };
//...
  bool setRate(int rate);
  int rate() const;
//...
};
 
class SerialPortInfo
{
//...
  QList<int> standardRates() const;
//...
};


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 16, 2011, 17:52
А че тролли разве не только своей лаборатории доверяют? Прям так возьмут? Может сначала спросить? или я что-то пропустил...

В Дублине на Миго конференции в кулуарах я пообщался с Thiago Macieira по этому поводу (поддержка COM порта в Qt). Ответили, что в их планы это не входит, но любые контрибуции в этом направлении приветствуются.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 17:56
любые контрибуции в этом направлении приветствуются.
Тем более!!!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 18:01
>>кто как комбо бокс юзает. Я например вообще модель люблю в него засунуть
>>так что же мне kuzulis должен qabstractmodel* выдать?
Если ты так любишь применительно к COM-порту, то ты тот ещё лисапедист.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 16, 2011, 18:05
Тем более, что не сложно сделать:
Код
C++ (Qt)
foreach(const SerialPortInfo &info, SerialPortInfo::availablePorts())
  comboBox->addItem(info.name());
Код
C++ (Qt)
foreach(int speed, info.standardBauds())
  comboBox->addItem(QString::number(speed));
Ну в принципе убедил, довольно компактно. Пусть так будет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 16, 2011, 19:17
Ну, парни, лады. Раз с API в принципе более менее устаканились, теперь можно создавать новую ветку на гиториусе.
Теперь:
1. Как назовем эту ветвь?
2. Как в "родном" Git GUI под винду теперь создать и залить на сервер новую ветку? Желательно по пунктам (а то я могу запаганить всё что там есть сейчас :) ).
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 20:53
kuzulis, добавь меня коммитером, сделаю тебе чистую ветку.
Но прежде чем заливать стоит выложить сюда окончательные версии интерфейсов для финальной ревизии (а то вдруг опять кто-то кого-то не понял, или подзабыл).



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 16, 2011, 21:08
Теперь предлагаю спуститься с небес чуть ближе к реализации...
Лично мне (точнее, моей конторе) нужна реализация позволяющая строго контролировать время приема/передачи данных. Дискретизация времени в Windows полностью не устраивает (нужна точность 5 мс, а в Windows ~18 мс), поэтому в моей реализации в waitForReadyRead использовано ожидание посредством комбинации стандартного (waitForSingleObject) и точного (через PerfomanceCounters) методов, а waitForBytesWritten я вообще реализовал через жесткое ожидание (количество байт * количество бит в посылке (6 ... 12) / скорость). Это все необходимо, так как нужно отправить 1 байт с четностью Mark, затем сколько-то с четностью Space (между всеми байтами не более 5 мс), дождаться полного ухода данных, а затем ждать ответ с четностью Space не более 20 мс (между соседними байтами не более 5 мс).
Дальше, я против создания каких-либо служебных потоков. Лучше просто повесить стандартные таймеры (startTimer/killTimer) для проверки состояния линий и отправки/приема данных. Периодичность можно захардкодить (200 мс, например) или дать пользователю возможность настройки (setLineCheckLatency, например). Более того, события отправки данных таймер даже хардкодить не надо - достаточно просто обновлять время срабатывания после выполнения writeData.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 17, 2011, 05:43
>>2. Как в "родном" Git GUI под винду теперь создать и залить на сервер новую ветку?
Можно в Git GUI, а можно и в Git Tk, который историю показывает.

Перейти в Git Tk можно из Git GUI, Меню "Хранилище (репозиторий)" -> "Показать историю всех ветвей"

*Git GUI
Меню "Ветвь"->"Сздать"
вводишь название
указываешь начальную версию (ветвь от которой ветвится нужно)
Если хочешь сразу на неё перейти ставишь галку "после создания сделать текущей"

* в Git Tk (удобнее когда надо задним числом её сделать)
тычешь состояние, от которого хочешь ветвится
правой кнопкой вызываешь контекстное меню, в нём пункт "Создать ветвь" в открывшееся окно вводишь имя.
Всё, ветвь создана, если хочешь на неё перейти, тычешь правой кнопкой по имени ветви (зелёненькая подпись), а не по состоянию. В контекстном меню выбираешь "Перейти на эту ветвь" (Если выскакивает окно о типе перехода, то можно выбрать "Жёсткий" вариант, но не сохранённые изменения в рабочем каталоге будут потеряны)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 17, 2011, 06:09
>>нужна реализация позволяющая строго контролировать время приема/передачи данных.
Если речь идёт о приёме по таймаутам, то это не реально.
Т.к. система (в драйвере порта) не регистрирует время, в которое происходит прерывание от приёмника UARTа.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 17, 2011, 06:11
>>Дальше, я против создания каких-либо служебных потоков. Лучше просто повесить стандартные
>>таймеры (startTimer/killTimer) для проверки состояния линий и отправки/приема данных.
А зачем потоки? Есть же события в системе. Кажется называется overlaped


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 07:50
lit-uriy ,
полностью тебя поддерживаю! Имхо, нужно реализовать (просто переписать) так, как уже реализовано в текущее время.

b-s-a ,
твоя хотелка (а точнее конторская) - это частный узкоспециализированный случай, ИМХО, не стоит включать это в библиотеку.
Ты можешь сделать для этого отдельную ветку для себя.  ;)
Тем более, не нужно использовать какие-то таймеры и т.п. которые будут неподецки грузить процессор.

Предлагаю оставить всё как есть, т.е использовать QSocketNotifier + QWinEventNotifier (т.к. всё-равно надеемся на интеграцию библиотеки в Qt, то можно использовать и приватные классы).
Иные варианты (потоки, таймеры, контроль вплоть до милисекунд) , ИМХО, тут неуместны, т.к. это всё "костыли".
Тем более, последовательный интерфейс UART RS232С/485 и т.п. по своей сути является асинхронным,
поэтому не может быть речи ни о каких жестких таймаутах и т.п.

Тут меня вполне устраивает реализация аналогичная QAbstractSocket, естественно, её нужно немножко подрихтовать, а также убрать промежуточный класс
*engine*.
И всё будет замечательно, быстро, и нажёжно!

Могу одно сказать:
я бился над "лучшим" вариантом и скурпулезно тестировал и проверял разные варианты целых 1,5 года, но в итоге пришел к тому что есть, ИМХО.

Цитата: b-s-a
kuzulis, добавь меня коммитером, сделаю тебе чистую ветку.
ОК.
1. Как это сделать (добавить коммитером)?
2. Кто еще изъявляет желание быть коммитером? :)

Цитата: b-s-a
Но прежде чем заливать стоит выложить сюда окончательные версии интерфейсов для финальной ревизии (а то вдруг опять кто-то кого-то не понял, или подзабыл).

Вот:

SerialPort
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORT_H
#define SERIALPORT_H
 
#include <QtCore/QIODevice>
 
class SerialPortPrivate;
 
class QSERIALDEVICE_EXPORT SerialPort : public QIODevice
{
   Q_OBJECT
 
   Q_PROPERTY(Rate rate READ rate WRITE setRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(SerialError error READ error RESET unsetError)
 
   Q_ENUMS( Directions Rate DataBits Parity StopBits FlowControl Lines DataErrorPolicy SerialError )
 
public:
 
   enum Direction  {
       Input = 1,
       Output = 2
   };
   Q_DECLARE_FLAGS(Directions, Direction)
 
   enum Rate {
       Rate1200 = 1200,
       Rate2400 = 2400,
       Rate4800 = 4800,  
       Rate9600 = 9600,
       Rate19200 = 19200,
       Rate38400 = 38400,  
       Rate57600 = 57600,
       Rate115200 = 115200,
       UnknownRate = -1
   };
 
   enum DataBits {
       Data5 = 5,
       Data6 = 6,
       Data7 = 7,
       Data8 = 8,
       UnknownDataBits = -1
   };
 
   enum Parity {
       NoParity = 0,
       EvenParity = 2,
       OddParity = 3,        
       SpaceParity = 4,
       MarkParity = 5,        
       UnknownParity = -1
   };
 
   enum StopBits {
       OneStop = 1,
       OneAndHalfStop = 3,
       TwoStop = 2,
       UnknownStopBits = -1
   };
 
   enum FlowControl {
       NoFlowControl,      
       HardwareControl,
       SoftwareControl,
       UnknownFlowControl = -1
   };
 
   enum Line {
       Le = 0x01,
       Dtr = 0x02,
       Rts = 0x04,
       St = 0x08,
       Sr = 0x10,
       Cts = 0x20,
       Dcd = 0x40,
       Ri = 0x80,
       Dsr = Le    
   };
   Q_DECLARE_FLAGS(Lines, Line)
 
   enum DataErrorPolicy {
       SkipPolicy,
       PassZeroPolicy,
       IgnorePolicy,
       StopReceivingPolicy
   };
 
   enum SerialError {
       NoError,                
       NoSuchDeviceError,          
       PermissionDeniedError,      
       DeviceAlreadyOpenedError,    
       DeviceIsNotOpenedError,      
       ParityError,
       IoError
   };
 
   explicit SerialPort(QObject *parent = 0);
   explicit SerialPort(const QString &name, QObject *parent = 0);
   explicit SerialPort(const SerialPortInfo &info, QObject *parent = 0);
   virtual ~SerialPort();
 
   void setName(const QString &name); // << Имена только: "COM1", "ttyS0" !!!
   QString name() const;              // << Имена только: "COM1", "ttyS0" !!!
 
   void setPort(const SerialPortInfo &info);
 
   virtual bool open(OpenMode mode);
   virtual void close();
 
   bool setRate(qint32 rate, Directions dir = Input | Output);
   qint32 rate(Directions dir = Input | Output) const;
 
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
 
   bool setParity(Parity parity);
   Parity parity() const;
 
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
 
   bool setFlowControl(FlowControl flow);
   FlowControl flowControl() const;
 
   void setDataInterval(int usecs = 0);
   int dataInterval() const;
 
   void setReadTimeout(int msecs = 0);
   int readTimeout() const;
 
   bool dtr() const;
   bool rts() const;
 
   Lines lines() const;
 
   bool flush();
   virtual bool reset();
 
   void setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy);
   DataErrorPolicy dataErrorPolicy() const;
 
   SerialError error() const;
   void unsetError();
 
   virtual bool isSequential() const;
 
   virtual qint64 bytesAvailable() const;
   virtual qint64 bytesToWrite() const;
 
   virtual bool waitForReadyRead(int msecs);
   virtual bool waitForBytesWritten(int msecs);
 
public Q_SLOTS:
   bool setDtr(bool set);
   bool setRts(bool set);
   bool sendBreak(int duration = 0);
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
protected:
   virtual qint64 readData(char *data, qint64 maxSize);
   virtual qint64 writeData(const char *data, qint64 maxSize);
 
private:
   SerialPortPrivate * const d_ptr;
 
   Q_DECLARE_PRIVATE(SerialPort)
   Q_DISABLE_COPY(SerialPort)
};
 
inline bool SerialPort::clearBreak(bool clear)
{ return setBreak(!clear); }
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Lines)
 
#endif // SERIALPORT_H
 
 

Только все SerialError можно/нужно заменить на PortError

SerialPortInfo
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORTINFO_H
#define SERIALPORTINFO_H
 
class SerialPort;
class SerialPortInfoPrivate;
 
class QSERIALDEVICE_EXPORT SerialPortInfo
{
public:
  SerialPortInfo(); //produces NULL info
  SerialPortInfo(const SerialPortInfo &other); //copy constructor
  explicit SerialPortInfo(const SerialPort &port);
  SerialPortInfo& operator=(const SerialPortInfo &other);
  void swap(SerialPortInfo &other);
 
  QString name() const;           // << Имена только: "COM1", "ttyS0" !!!
  QString systemLocation() const; // << Системный путь только: "\\\\\\\\.\\\\COM24", "/dev/ttyS45" !!!
  QString description() const;    // << Описание: "Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const;   // << Производитель: "(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  QList<int> standardRates() const;
  static QList<SerialPortInfo> availablePorts();
private:
   Q_DECLARE_PRIVATE(SerialPortInfo)
   SerialPortInfoPrivate * const d_ptr;
};
 
#endif // SERIALPORTINFO_H
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 17, 2011, 10:00
>>1. Как это сделать (добавить коммитером)?
А не надо комитеров. Есть механизм Merge Request. Им и надо пользоваться.

>>Но прежде чем заливать стоит выложить сюда окончательные версии интерфейсов для финальной ревизии
вобще-то для этого Git и придумали, ветку уже давно надо было сделать. Как-то вы всё по крестьянски пользуетесь современными технологиями


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 17, 2011, 10:04
>>1. Как это сделать (добавить коммитером)?
А не надо комитеров. Есть механизм Merge Request. Им и надо пользоваться.

>>Но прежде чем заливать стоит выложить сюда окончательные версии интерфейсов для финальной ревизии
вобще-то для этого Git и придумали, ветку уже давно надо было сделать. Как-то вы всё по крестьянски пользуетесь современными технологиями
Для создания ветки этого недостаточно. ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 10:04
Цитировать
Перейти в Git Tk можно из Git GUI, Меню "Хранилище (репозиторий)" -> "Показать историю всех ветвей"

*Git GUI
Меню "Ветвь"->"Сздать"
вводишь название
указываешь начальную версию (ветвь от которой ветвится нужно)
Если хочешь сразу на неё перейти ставишь галку "после создания сделать текущей"

* в Git Tk (удобнее когда надо задним числом её сделать)
тычешь состояние, от которого хочешь ветвится
правой кнопкой вызываешь контекстное меню, в нём пункт "Создать ветвь" в открывшееся окно вводишь имя.
Всё, ветвь создана, если хочешь на неё перейти, тычешь правой кнопкой по имени ветви (зелёненькая подпись), а не по состоянию. В контекстном меню выбираешь "Перейти на эту ветвь" (Если выскакивает окно о типе перехода, то можно выбрать "Жёсткий" вариант, но не сохранённые изменения в рабочем каталоге будут потеряны)
Ну а при заливке этой ветви на сервер, выбирать именно эту ветвь, или "orig" и как-то там?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 17, 2011, 10:07
>>выбирать именно эту ветвь
конечно. Выбираешь те ветви, которые отправить хочешь (можно сразу несколько).

П.С.
Не имей привычки переименовывать ветви и сбрасывать (reset/hard) их состояния, иначе будет проблема при отправке.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 17, 2011, 10:10
>>Для создания ветки этого недостаточно.
Пусть kuzulis сам делает, а то он уже столько времени на гиториусе, а ветки делать так и не научился.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 10:19
 :)

имя ветки: future-integration пойдет?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 17, 2011, 10:23
Замечания по интерфейсам:
QSERIALDEVICE_EXPORT  - переименовать не надо?
setDataInterval(), setReadTimeout() - убрать дефолтные значения.
у обоих классов, думаю, name следует все-таки переименовать в portName. Дабы не было недоразумений (например, уже есть QFile::fileName).
отсутствует ~SerialPortInfo()
Может добавить метод SerialPortInfo::isValid(), который бы проверял порт на фактическое присутствие в системе?

kuzulis
Делай в консоли:
> cd Path\to\clone
> git checkout --orphan 2.0-t
> git rm *
> git commit -a
> git checkout --orphan 2.0 2.0-t
> git branch -D 2.0-t
> git push origin 2.0:refs/heads/2.0

Будет создана новая ПУСТАЯ (с пустой историей) ветка с именем 2.0

Цитировать
имя ветки: future-integration пойдет?
Слишком длинно. Можно назвать 2.0, ng (new generation), next...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 10:39
Цитата: b-s-a
Замечания по интерфейсам:
QSERIALDEVICE_EXPORT  - переименовать не надо?
setDataInterval(), setReadTimeout() - убрать дефолтные значения.
у обоих классов, думаю, name следует все-таки переименовать в portName. Дабы не было недоразумений (например, уже есть QFile::fileName).
отсутствует ~SerialPortInfo()
Может добавить метод SerialPortInfo::isValid(), который бы проверял порт на фактическое присутствие в системе?

SerialPort
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORT_H
#define SERIALPORT_H
 
#include <QtCore/QIODevice>
 
class SerialPortPrivate;
 
class QSERIALPORT_EXPORT SerialPort : public QIODevice
{
   Q_OBJECT
 
   Q_PROPERTY(Rate rate READ rate WRITE setRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(SerialError error READ error RESET unsetError)
 
   Q_ENUMS( Directions Rate DataBits Parity StopBits FlowControl Lines DataErrorPolicy SerialError )
 
public:
 
   enum Direction  {
       Input = 1,
       Output = 2
   };
   Q_DECLARE_FLAGS(Directions, Direction)
 
   enum Rate {
       Rate1200 = 1200,
       Rate2400 = 2400,
       Rate4800 = 4800,  
       Rate9600 = 9600,
       Rate19200 = 19200,
       Rate38400 = 38400,  
       Rate57600 = 57600,
       Rate115200 = 115200,
       UnknownRate = -1
   };
 
   enum DataBits {
       Data5 = 5,
       Data6 = 6,
       Data7 = 7,
       Data8 = 8,
       UnknownDataBits = -1
   };
 
   enum Parity {
       NoParity = 0,
       EvenParity = 2,
       OddParity = 3,        
       SpaceParity = 4,
       MarkParity = 5,        
       UnknownParity = -1
   };
 
   enum StopBits {
       OneStop = 1,
       OneAndHalfStop = 3,
       TwoStop = 2,
       UnknownStopBits = -1
   };
 
   enum FlowControl {
       NoFlowControl,      
       HardwareControl,
       SoftwareControl,
       UnknownFlowControl = -1
   };
 
   enum Line {
       Le = 0x01,
       Dtr = 0x02,
       Rts = 0x04,
       St = 0x08,
       Sr = 0x10,
       Cts = 0x20,
       Dcd = 0x40,
       Ri = 0x80,
       Dsr = Le    
   };
   Q_DECLARE_FLAGS(Lines, Line)
 
   enum DataErrorPolicy {
       SkipPolicy,
       PassZeroPolicy,
       IgnorePolicy,
       StopReceivingPolicy
   };
 
   enum SerialError {
       NoError,                
       NoSuchDeviceError,          
       PermissionDeniedError,      
       DeviceAlreadyOpenedError,    
       DeviceIsNotOpenedError,      
       ParityError,
       IoError
   };
 
   explicit SerialPort(QObject *parent = 0);
   explicit SerialPort(const QString &name, QObject *parent = 0);
   explicit SerialPort(const SerialPortInfo &info, QObject *parent = 0);
   virtual ~SerialPort();
 
   void setPortName(const QString &name); // << Имена только: "COM1", "ttyS0" !!!
   QString portName() const;              // << Имена только: "COM1", "ttyS0" !!!
 
   void setPort(const SerialPortInfo &info);
 
   virtual bool open(OpenMode mode);
   virtual void close();
 
   bool setRate(qint32 rate, Directions dir = Input | Output);
   qint32 rate(Directions dir = Input | Output) const;
 
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
 
   bool setParity(Parity parity);
   Parity parity() const;
 
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
 
   bool setFlowControl(FlowControl flow);
   FlowControl flowControl() const;
 
   void setDataInterval(int usecs);
   int dataInterval() const;
 
   void setReadTimeout(int msecs);
   int readTimeout() const;
 
   bool dtr() const;
   bool rts() const;
 
   Lines lines() const;
 
   bool flush();
   virtual bool reset();
 
   void setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy);
   DataErrorPolicy dataErrorPolicy() const;
 
   SerialError error() const;
   void unsetError();
 
   virtual bool isSequential() const;
 
   virtual qint64 bytesAvailable() const;
   virtual qint64 bytesToWrite() const;
 
   virtual bool waitForReadyRead(int msecs);
   virtual bool waitForBytesWritten(int msecs);
 
public Q_SLOTS:
   bool setDtr(bool set);
   bool setRts(bool set);
   bool sendBreak(int duration = 0);
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
protected:
   virtual qint64 readData(char *data, qint64 maxSize);
   virtual qint64 writeData(const char *data, qint64 maxSize);
 
private:
   SerialPortPrivate * const d_ptr;
 
   Q_DECLARE_PRIVATE(SerialPort)
   Q_DISABLE_COPY(SerialPort)
};
 
inline bool SerialPort::clearBreak(bool clear)
{ return setBreak(!clear); }
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Lines)
 
#endif // SERIALPORT_H
 

SerialPortInfo
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORTINFO_H
#define SERIALPORTINFO_H
 
class SerialPort;
class SerialPortInfoPrivate;
 
class QSERIALPORT_EXPORT SerialPortInfo
{
public:
  SerialPortInfo(); //produces NULL info
  SerialPortInfo(const SerialPortInfo &other); //copy constructor
  explicit SerialPortInfo(const SerialPort &port);
  virtual ~SerialPortInfo();
 
  SerialPortInfo& operator=(const SerialPortInfo &other);
  void swap(SerialPortInfo &other);
 
  QString portName() const;       // << Имена только: "COM1", "ttyS0" !!!
  QString systemLocation() const; // << Системный путь только: "\\\\\\\\.\\\\COM24", "/dev/ttyS45" !!!
  QString description() const;    // << Описание: "Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const;   // << Производитель: "(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  bool isExists() const;          // << Если порт фактически существует
  QList<int> standardRates() const;
  static QList<SerialPortInfo> availablePorts();
private:
   Q_DECLARE_PRIVATE(SerialPortInfo)
   SerialPortInfoPrivate * const d_ptr;
};
 
#endif // SERIALPORTINFO_H
 

Цитировать
Слишком длинно. Можно назвать 2.0, ng (new generation), next...
Ок вечером, по москве, после 18:00 попробую :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 17, 2011, 10:59
>>нужна реализация позволяющая строго контролировать время приема/передачи данных.
Если речь идёт о приёме по таймаутам, то это не реально.
Т.к. система (в драйвере порта) не регистрирует время, в которое происходит прерывание от приёмника UARTа.
А это и не надо. Мне достаточно, чтобы waitForReadyRead и waitForBytesWritten работали не дольше, чем у них указано в параметрах.
Цитировать
твоя хотелка (а точнее конторская) - это частный узкоспециализированный случай, ИМХО, не стоит включать это в библиотеку.
Это сделать не так сложно. Под Windows просто для малых времен (менее 20 мс) необходимо делать ожидание на основе PrefomanceCounters и ::Sleep(0). И всё.
Цитировать
Тем более, не нужно использовать какие-то таймеры и т.п. которые будут неподецки грузить процессор.
А как тогда грамотно реализовать сигнал readyRead()? Имхо, самый простой способ - через таймер.
Цитировать
bool isExists() const;
Ты уверен в букве s на конце?
Мне не нравится. Так как список портов можно получить через метод availablePorts() (доступные порты), а потом проверять через "а существует ли он"?
Цитировать
SerialPortInfoPrivate * const d_ptr;
const лучше убрать, иначе будет сложно реализовать метод swap, ну и operator= соответственно (так как он через swap работает).
Цитировать
virtual ~SerialPortInfo();
Зачем тут виртуальный деструктор?!?  :o


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 11:19
Цитировать
А как тогда грамотно реализовать сигнал readyRead()? Имхо, самый простой способ - через таймер.
Нет. Через QSocketNotifier/QWinEventNotifier, ИМХО.
Цитировать
Ты уверен в букве s на конце?
Мне не нравится. Так как список портов можно получить через метод availablePorts() (доступные порты), а потом проверять через "а существует ли он"?
Цитировать
SerialPortInfoPrivate * const d_ptr;
const лучше убрать, иначе будет сложно реализовать метод swap, ну и operator= соответственно (так как он через swap работает).
Ок. Уберу const и исправлю метод на isValid().

Цитировать
Зачем тут виртуальный деструктор?!?  Шокированный
Уберу virtual.  :)




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 17, 2011, 11:32
Цитировать
А как тогда грамотно реализовать сигнал readyRead()? Имхо, самый простой способ - через таймер.
Нет. Через QSocketNotifier/QWinEventNotifier, ИМХО.
Цитировать
Хорошо.
Уведомления о изменении состояния линий делать не будем?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 11:53
Цитировать
Уведомления о изменении состояния линий делать не будем?
Не знаю, пока наверное нет.

Но если вдруг делать - то мои мысли такие :
(эти мысли относятся только к уведомлениям состояний линий CTS/DSR и т.п.!, т.е. это не относится к линиям Rx/Tx)

Делаем к примеру отдельный "приватный" класс - синглтон, который по таймеру проверяет состояние линий сразу у множества портов (по очереди).
Т.е. этот класс принимает дескрипторы портов (т.е. кидает их в свой список) и по таймеру проверяет состояния линий.
При изменении состояния линии этот класс емиттит сигнал в нужный SerialPort (тут еще нужно придумать механизм посылки сигнала нужному приемнику),
или же сделать типа broadcast, когда сигнал посылается всем SerialPort, но тот SerialPort, который имеет такой-же дескриптор, как и в сигнале обрабатывает этот сигнал.

Как-то так. Тем более, тут не нужно высокое быстродействие/точность отлова изменения линий и можно сделать интервал таймера побольше, чтобы не грузить CPU.

Тем самым, у нас будет всего один таймер, который обрабатывает все дескрипторы которые имеются у него в списке.

Типа:
Код
C++ (Qt)
class LineNotifier: public QTimer
{
   Q_OBJECT
 
   ....
   ....
Q_SIGNALS:
   void linesState(Lines l, int fd);
 
public Q_SLOTS:
   ....
   void addDescriptor(int fd);
   void removeDescriptor(int fd);
 
private:
   QList<int> descriptorsList;
};
 

Как то так...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 17, 2011, 18:25
2 b-s-a

Не получается создать ветку:

> cd Path\to\clone
1. Зашел + залогинился на gitorious
2. Скопировал адрес: git@gitorious.org:qserialdevice/qserialdevice.git
3. Открыл у себя Git GUI и склонировал репозиторий в D:/git/ng

> git checkout --orphan 2.0-ng
4. Ok

> git rm *
5. Тут написало, что не может удалить каталог examples (типо нужно рекурсивно удалять и писать '-r') и т.п,
поэтому я ввел: git rm -r *

> git commit -a
6. Тут выскочило окошко с VIM редактором, там был перечислен
перечень всех файлов проекта, закоментированный символом '#'.
Я всё удалил и написал: Initial commit..
И типа сохранил и вышел из VIM: Esc + ZZ

> git checkout --orphan 2.0 2.0-ng
7. Ok

> git branch -D 2.0-ng
8. Тут написало, что ветка  2.0-ng удалена.

> git push origin 2.0:refs/heads/2.0
Тут запросило passphrase для RSA. Я ввел свой пароль, с помощью которого я ранее через Git GUI комитил изменения.
Но оно подождало и через некоторое время написало:
Цитировать
error: src refspec 2.0 does not match any.
error: failed to push some refs to 'git@gitorious.org:qserialdevice/qserialdevice.git'


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 17, 2011, 21:13
повтори тоже самое, только пункты 7 и 8 моменяй местами


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 18, 2011, 09:55
>>Открыл у себя Git GUI и склонировал репозиторий в D:/git/ng
у тебя же уже есть клон, с ним и работай


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 18, 2011, 11:39
Вроде сделал:
1. Зашел + залогинился на gitorious
2. Скопировал адрес:
Цитировать
git@gitorious.org:qserialdevice/qserialdevice.git
3. Открыл у себя Git GUI и склонировал репозиторий в:
Цитировать
D:/git/t
4. Сделал:
Цитировать
> git checkout --orphan 2.0-t
5. Сделал:
Цитировать
> git rm -rf *
6. Сделал:
Цитировать
> git commit -a
7. Создал файлы исходных кодов проекта *.h/*.cpp и скопировал их в
Цитировать
D:/git/t
8. Сделал:
Цитировать
> git add *
9. Открыл Git GU (ветку 2.0-t), сохранил изменения с коммитом: "Determination of the initial project structure."
10. Сделал:
Цитировать
> git checkout --orphan 2.0 2.0-t
11. Сделал:
Цитировать
> git branch -D 2.0-t
12. Открыл Git GU (ветку 2.0), сохранил изменения с коммитом: "Determination of the initial project structure."
13. Сделал:
Цитировать
> git push origin 2.0:refs/heads/2.0

1)
Теперь определимся с структурой самого проекта:
- файлы исходников будут в корне проекта или раскиданы по каталогам?
- нужны или нет всякие "реадми", "чейнчлоги"?
и.т.п

2.)
Как теперь коммитить в ветку 2.0?
Интересует алгоритм от клонирования, до редактирования, сохранения и отправки изменений.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 18, 2011, 14:59
1)

Можно такую структуру каталогов:

include
examples
src
<project_name>.pro
CHANGES
README
INSTALL

2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 19, 2011, 07:58
2)
Как теперь коммитить в ветку 2.0?
Интересует алгоритм от клонирования, до редактирования, сохранения и отправки изменений.
также как ты работал с мастером.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 19, 2011, 13:48
Поддерживаю пастора
так же рекомендую делать проект типа subdirs (т.е. с подпроектами).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 19, 2011, 22:07
Я тут еще раз посмотрел на интерфейс. И мне пришла мысль отказаться от свойства portName.
И так. Предлагаю сделать 3 метода:
void setPort(const QString &portName);
void setPort(const SerialPortInfo &info);
QString portName() const;

portName возвращает всегда "COM1", "ttyS0" и т.п.
а вот setPort принимает и короткое название порта, и системный путь. Да и не перепутаешь setPort и setPortName.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 20, 2011, 07:40
Насчет структуры проекта: так пойдет?
Цитировать
/
|->/src
|     |-> /serialport
|     |           |-> *.h/*.cpp/*.pri
|     |->/serialportinfo
|     |           |-> *.h/*.cpp/*.pri
|     |->src.pro
|->/examples
|->serialport.pro //<< Или как-то иначе?
|->CHANGES
|->README
|->INSTALL

Цитата: b-s-a
Я тут еще раз посмотрел на интерфейс. И мне пришла мысль отказаться от свойства portName.
И так. Предлагаю сделать 3 метода:
void setPort(const QString &portName);
void setPort(const SerialPortInfo &info);
QString portName() const;

portName возвращает всегда "COM1", "ttyS0" и т.п.
а вот setPort принимает и короткое название порта, и системный путь. Да и не перепутаешь setPort и setPortName.
Так я не понял, а setPortName() где тогда будет? Или его не будет?

Цитата: pastor
2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов
А это как? Желательно по пунктам :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 20, 2011, 10:03
Насчет структуры проекта: так пойдет?
Поменьше подкаталогов. Лучше как сказал пастор: /include - публичные хидеры
/src - приватные хидеры и реализация
/examples - примеры
/tests - юнит-тесты

Цитата: b-s-a
Я тут еще раз посмотрел на интерфейс. И мне пришла мысль отказаться от свойства portName.
И так. Предлагаю сделать 3 метода:
void setPort(const QString &portName);
void setPort(const SerialPortInfo &info);
QString portName() const;

portName возвращает всегда "COM1", "ttyS0" и т.п.
а вот setPort принимает и короткое название порта, и системный путь. Да и не перепутаешь setPort и setPortName.
Так я не понял, а setPortName() где тогда будет? Или его не будет?
Именно - не будет. Иначе пользователь вводится в заблуждение - есть методы setPort и setPortName. Который из них надо использовать? Я бы выбрал первый и долго геморроился.

Цитата: pastor
2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов
А это как? Желательно по пунктам :)
Для тебя никаких отличий. Т.е. как работал, так и будешь. А все остальные будут только делать мержреквесты.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 20, 2011, 12:19
1.

Цитировать
Лучше как сказал пастор: /include - публичные хидеры
Ну так в исходном виде эта директория должна содержать только
файлы типа: SerialPort (Или QSerialPort ?) и SerialPortInfo (Или QSerialPortInfo ?).
Содержимое которых соответственно:

SerialPort
Код
C++ (Qt)
#include "serialport.h"
 

SerialPortInfo
Код
C++ (Qt)
#include "serialportinfo.h"
 

Но она по идее не должна изначально содержать самих хидеров  "serialport.h" "serialportinfo.h".
Эти хидеры, по идее, должны автоматом копироваться в каталог /include после того как библиотека собралась.
Т.е. они должны изначально находится только в /src, а потом и в /include

А то, если бы они были только в /include - то как-то сбивается аналогия с Qt и/или с Qxt библиотеками.

2. Если уж делаем новую версию библиотеки "затачиваемую" под интеграцию в Qt, то нужно, скорее всего,
определиться как будет называться модуль (Например QtSerial, по аналогии с QtNetwork) ?

3. Нужно ли патчить qmake и т.п. ? Чтобы можно было в конфиге проекта написать типа: QT += serial

---
Т.е., к чему я задаю вопросы, : на какие модули и как будем в итоге разбивать библиотеку при сборке?
В общем, в итоге что должно получиться?

А то я пока не могу охватить целостной картины, что , собственно, требуется и к чему идем !


ЗЫ: Или я рано еще об этом? :)

 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 20, 2011, 12:36
ЗЫ: Или я рано еще об этом? :)
Именно. Что патчить и как оформлять - это будут решать тролли. Для начала, нужно сделать, чтобы работало.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 20, 2011, 12:58
Ну а насчет каталога /include : я тогда просто его создам и оставлю пустым (если в git это возможно), а все заголовки помещу в /src


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 20, 2011, 14:55
я предлагал в /include класть публичные хидеры - чтобы можно было просто в примерах и тестах включить этот каталог в INCLUDEPATH и не париться о том, что они могут случайно включить что-то приватное. В то же время, у самой библиотеки этот каталог тоже можно засунуть в INCLUDEPATH.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 20, 2011, 15:16
А что случиться если включить что-нибудь приватное? Считаю это придумыванием несуществующих проблем.
Но таки папка include удобна, особенно если наполнить ее непосредственно заголовочниками. Зачем ее создавать пустую?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 20, 2011, 15:21
Ок.

1.
Теперь перейдем к АПИ приватных классов.
Я тут для SerialPortPrivate ориентировочно набросал АПИ:
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORT_P_H
#define SERIALPORT_P_H
 
#include "serialport.h"
 
#if defined (Q_OS_WIN)
#  include <qt_windows.h>
#else
#  include <termios.h>
//#  include "../unix/ttylocker.h"
#endif
 
 
class SerialPortPrivate
{
public:
   SerialPortPrivate();
   virtual ~SerialPortPrivate();
 
   void setNativePort(const QString &port);
   QString nativePort() const;
 
   bool nativeOpen(QIODevice::OpenMode mode);
   void nativeClose();
 
   bool nativeSetRate(qint32 rate, SerialPort::Directions dir);
   qint32 nativeRate(SerialPort::Directions dir) const;
 
   bool nativeSetDataBits(SerialPort::DataBits dataBits);
   SerialPort::DataBits nativeDataBits() const;
 
   bool nativeSetParity(SerialPort::Parity parity);
   SerialPort::Parity nativeParity() const;
 
   bool nativeSetStopBits(SerialPort::StopBits stopBits);
   SerialPort::StopBits nativeStopBits() const;
 
   bool nativeSetFlowControl(SerialPort::FlowControl flow);
   SerialPort::FlowControl nativeFlowControl() const;
 
   void nativeSetDataInterval(int usecs);
   int nativeDataInterval() const;
 
   void nativeSetReadTimeout(int msecs);
   int nativeReadTimeout() const;
 
   bool nativeDtr() const;
   bool nativeRts() const;
 
   SerialPort::Lines nativeLines() const;
 
   bool nativeFlush();
   bool nativeReset();
 
   void nativeSetDataErrorPolicy(SerialPort::DataErrorPolicy policy);
   SerialPort::DataErrorPolicy nativeDataErrorPolicy() const;
 
   SerialPort::PortError nativeError() const;
   void nativeUunsetError();
 
   qint64 nativeBytesAvailable() const;
 
   qint64 nativeRead(char *data, qint64 len);
   qint64 nativeWrite(const char *data, qint64 len);
 
   int nativeSelect(int timeout, bool checkRead, bool checkWrite,
                    bool *selectForRead, bool *selectForWrite);
 
private:
   //General (for any OS) private parameters
   QString mPort;
   qint32 mInRate;
   qint32 mOutRate;
   SerialPort::DataBits mDataBits;
   SerialPort::Parity mParity;
   SerialPort::StopBits mStopBits;
   SerialPort::FlowControl mFlow;
   int mDataInterval;
   int mReadTimeout;
   SerialPort::DataErrorPolicy mPolicy;
   SerialPort::PortError mError;
 
   //General (for any OS) private methods
   void initVariables();
 
   void detectDefaultRate();
   void detectDefaultDataBits();
   void detectDefaultParity();
   void detectDefaultStopBits();
   void detectDefaultFlowControl();
   void detectDefaultCurrentSettings();
 
   bool prepareOtherOptions();
 
   bool saveOldSettings();
   bool restoreOldSettings();
 
   //OS specific parameters and methods
#ifdef Q_OS_WIN
 
   enum CommTimeouts {
       ReadIntervalTimeout, ReadTotalTimeoutMultiplier,
       ReadTotalTimeoutConstant, WriteTotalTimeoutMultiplier,
       WriteTotalTimeoutConstant
   };
 
   DCB mDCB, mOldDCB;
   COMMTIMEOUTS mCommTimeouts, mOldCommTimeouts;
   OVERLAPPED mOvRead;
   OVERLAPPED mOvWrite;
   OVERLAPPED mOvSelect;
 
   bool createEvents(bool rx, bool tx);
   bool closeEvents() const;
   void recalcTotalReadTimeoutConstant();
   void prepareCommTimeouts(CommTimeouts cto, DWORD msecs);
   bool updateDcb();
   bool updateCommTimeouts();
#else
   struct termios mTermios;
   struct termios mOldTermios;
   void prepareTimeouts(int msecs);
   bool updateTermious();
   bool setStandartRate(AbstractSerial::BaudRateDirection, speed_t rate);
   bool setCustomRate(qint32 rate);
#endif
 
};
 
#endif // SERIALPORT_P_H
 
 

И вот вопрос: может быть лучше создать абстрактный класс типа AbstractSerialPortPrivate
который бы содержал общие данные и общие методы для любой ОС.
Некоторые из них можно реализовать прямо в абстрактном AbstractSerialPortPrivate
(например, nativeRate(), nativeParity() и т.п.), а остальные сделать чисто виртуальными.

А уже класс SerialPortPrivate наследовался бы от AbstractSerialPortPrivate.

Тем самым, мы в объявлении SerialPortPrivate уменьшаем кол-во писанины (да и в реализации тоже),
но у нас тогда появляется дополнительный класс AbstractSerialPortPrivate, для которого нужно создать два файла *.h/*.cpp .

Или, может быть, есть более изящное решение?

2.
Кто нить накидает АПИ для SerialPortPrivateInfo?
А то я не соображу.


Цитировать
А что случиться если включить что-нибудь приватное? Считаю это придумыванием несуществующих проблем.
Но таки папка include удобна, особенно если наполнить ее непосредственно заголовочниками. Зачем ее создавать пустую?
Ок.

----
Еще прикрепил аттач с архивом предварительной конфигурации проекта и т.п.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 20, 2011, 15:47
На мой вгляд лучше делать именно через абстрактный класс. Причем, для него достаточно сделать только хидер - все методы пусть инлайнятся. Название его оставить SerialPortPrivate. А вот конкретные реализации - SerialPortPrivateWin/Unix.
А разве мьютекс не нужен?
слово native обязательно надо у каждого метода писать? Я бы понял, если бы это были защищенные абстрактные методы, которые вызываются публичными, но в таком виде смысле не вижу - лишняя писанина.
Что за "SerialPortPrivateInfo"? Должен же быть "SerialPortInfoPrivate", вроде. Разве нет? А потом, его состав полностью идентичен набору свойств публичного класса:
Код
C++ (Qt)
struct SerialPortInfoPrivate
{
  QString device;
  QString portName;
  QString manufacturer;
  virtual bool isValid() = 0;
};


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 20, 2011, 16:05
Цитировать
Название его оставить SerialPortPrivate. А вот конкретные реализации - SerialPortPrivateWin/Unix.
Не, я сделаю как планировал ранее. ИМХО, так красивше.

Цитировать
А разве мьютекс не нужен?
А зачем? В сокетах тоже нет мьютекса.

Цитировать
слово native обязательно надо у каждого метода писать?
Ок, оставлю только у действительно "нативных" методов.

Цитировать
Что за "SerialPortPrivateInfo"? Должен же быть "SerialPortInfoPrivate", вроде. Разве нет?
Ошибся.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 20, 2011, 16:25
Цитировать
слово native обязательно надо у каждого метода писать?
Ок, оставлю только у действительно "нативных" методов.
А оно надо? Зачем делается приватный класс - чтобы скрыть детали реализации и для повышения бинарной совместимости между версиями класса. Поэтому, я не вижу ни одной причины для использования слова native.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 20, 2011, 18:12
ok


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 21, 2011, 17:01
Цитата: pastor
2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов
А это как? Желательно по пунктам :)
Ищи в этой же теме, я как-то тебе делал "Запрос на слияние" ещё в самом начале как ты на гиториусе поселился.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 21, 2011, 17:25
Зачем нужен метод void AbstractSerialPortPrivate::initVariables()? Чем конструктор не подходит?
Предлагаю вместо этого:
Код
C++ (Qt)
virtual bool setRate(qint32 rate, SerialPort::Directions dir) = 0;
virtual qint32 rate(SerialPort::Directions dir) const = 0;
Для минимизации потенциального дублирования кода, использовать это (AbstractSerialPortPrivate):
Код
C++ (Qt)
bool setRate(qint32 rate, SerialPort::Directions dir) {
  if (setNativeRate(rate, dir)) {
     mRate = rate;
     return true;
  }
  return false;
}
qint32 rate(SerialPort::Directions dir) const {
  if (dir & Input)
     return (dir & Output) ? ((mInRate + mOutRate)/2) : mInRate;
  return mOutRate;
}
//...
protected:
virtual bool setNativeRate(int rate, SerialPort::Directions dir) = 0;
Аналогично с остальными методами (т.е. чтобы не писать в каждой реализации "mParity = parity" и т.п.).
Код
C++ (Qt)
virtual bool saveOldsettings() = 0;
virtual bool restoreOldsettings() = 0;
Действительно ли это нужно? Или все-таки можно использовать стандартные механизмы?

А вот это:
Код
C++ (Qt)
   virtual void detectDefaultRate() = 0;
   virtual void detectDefaultDataBits() = 0;
   virtual void detectDefaultParity() = 0;
   virtual void detectDefaultStopBits() = 0;
   virtual void detectDefaultFlowControl() = 0;
 
   void detectDefaultSettings()
   {
       detectDefaultRate();
       detectDefaultDataBits();
       detectDefaultParity();
       detectDefaultStopBits();
       detectDefaultFlowControl();
   }
я предлагаю упростить до:
Код
C++ (Qt)
virtual void detectDefaultSettings() {}
Так как реализовывать 5 виртуальных функций, которые вызываются только в одном месте я не вижу никакого смысла.

Кстати, названия полей класса будем приводить к стандартному в Qt виду (m_xxxx)?

Файл qserialdevice_global.h имхо не очень нужен, тем более, что он (по идее) должен использоваться в публичных хидерах (а еще у него лицензия GPL). Для начала предлагаю просто ограничиться в каждом публичном хидере:
Код
C++ (Qt)
#ifdef SERIALPORT_SHARED
# ifdef SERIALPORT_BUILD
#  define SERIALPORT_EXPORT Q_DECL_EXPORT
# else
#  define SERIALPORT_EXPORT Q_DECL_IMPORT
# endif
#else
# define SERIALPORT_EXPORT
#endif
Ты так и не сделал разделение serialport_p.h на serialport_p_win.h и serialport_p_unix.h. А стоило бы - на данный момент наличие AbstractSerialPortPrivate смысла не имеет.

Сделал ряд исправлений. см. аттачмент.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 21, 2011, 17:31
kuzulis, кстати, очень не рекомендую вызывать виртуальные методы из конструкторов. Особенно, в надежде, что конструктор базового класса вызовет переопределенный наследником метод. По стандарту, виртуальные методы наследника становятся доступны (v_table базового класса замещается на таблицу наследника) непосредственно перед входом в его конструктор.

И размещай уже файлы на гиториусе - работать будет проще.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 21, 2011, 18:32
А как мне склонировать ветку 2.0? А то клонирую мастера постоянно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 21, 2011, 19:04
$ git checkout 2.0


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 21, 2011, 20:36
b-s-a
Спасибо, вроде разобрался и залил твою версию.

Цитировать
И размещай уже файлы на гиториусе - работать будет проще.
;D у меня на работе админом закрыты все порты кроме 8080 и т.п.. , т.е. я не могу оттуда сразу вносить изменения.
Поэтому я аттачу на форум, а потом, из дома уже коммиты вношу.

Цитировать
кстати, очень не рекомендую вызывать виртуальные методы из конструкторов. Особенно, в надежде, что конструктор базового класса вызовет переопределенный наследником метод. По стандарту, виртуальные методы наследника становятся доступны (v_table базового класса замещается на таблицу наследника) непосредственно перед входом в его конструктор.
Ок.

Цитата: b-s-a
Зачем нужен метод void AbstractSerialPortPrivate::initVariables()? Чем конструктор не подходит?
Подходит. Просто писанины в конструкторе прибавится.

Цитата: b-s-a
Предлагаю вместо этого:
Код
C++ (Qt)
virtual bool setRate(qint32 rate, SerialPort::Directions dir) = 0;
virtual qint32 rate(SerialPort::Directions dir) const = 0;
 
...
...
...
Ок. Только нужно наверное немного изменить твою реализацию методов setRate() / rate().

Цитата: b-s-a
Аналогично с остальными методами
Ну, вот, с методами setPort() / port() так просто не получится. Т.е. твою реализацию нужно подправить.
Что имею ввиду:
переменная mPort должна по идее всегда хранить длинные имена портов,
нативный метод setPort() (к примеру, для винды) должен из короткого имени "COM1" делать длинное "\\\\.\\COM1", а если на входе длинное имя - то ничего не делать.
И далее, это длинное имя он присваивает переменной mPort. (В линуксе и пр. ОС аналогично).
Метод же port() должен из длинного имени делать короткое и возвращать результат (мы ж так условились).

Поэтому можно было бы добавить еще методы nativeSetPort() / nativePort(). Т.е. для каждой из платформ будет своя реализация (на QRegExp к примеру).
Но если оставить так как есть сейчас - то придется химичить с дефайнами в serialport_p.h, что не есть хорошо, т.к. для этого есть serialport_p_unix/win.h
ИМХО.

Цитата: b-s-a
Код
C++ (Qt)
virtual bool saveOldsettings() = 0;
virtual bool restoreOldsettings() = 0;
 
Действительно ли это нужно? Или все-таки можно использовать стандартные механизмы?
Что имеешь ввиду под стандартными механизмами?
Сохранять/восстанавливать предыдущие параметры то нужно по-любому (после открытия и перед закрытием).

Насчет упростить и оставить virtual void detectDefaultSettings() {} :
ну, тут если упрощать - то слишком много кода придется писать в этот метод,
т.е. будет громоздко. ИМХО, лучше его разбить на 5 стадий по смыслу.

Насчет префиксов m/m_ у приватных членов - то может быть, их вообще не писать (т.е. опускать их)?
т.к. я бегло просмотрел исходники Qt и там очень редко встречается этот префикс.
Хотя, в исходниках QtCreator - повсеместно.
А то лишняя писанина получается и имя переменной растет.

----
А в целом, просмотрев твои идеи, согласен, давай так.

Цитата: lit-uriy
Ищи в этой же теме, я как-то тебе делал "Запрос на слияние" ещё в самом начале как ты на гиториусе поселился.
:) ок, думаю по ходу процесса, думаю, мне станет яснее.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 21, 2011, 22:28
Ну, вот, с методами setPort() / port() так просто не получится. Т.е. твою реализацию нужно подправить.
Что имею ввиду:
переменная mPort должна по идее всегда хранить длинные имена портов,
нативный метод setPort() (к примеру, для винды) должен из короткого имени "COM1" делать длинное "\\\\.\\COM1", а если на входе длинное имя - то ничего не делать.
И далее, это длинное имя он присваивает переменной mPort. (В линуксе и пр. ОС аналогично).
Метод же port() должен из длинного имени делать короткое и возвращать результат (мы ж так условились).

Поэтому можно было бы добавить еще методы nativeSetPort() / nativePort(). Т.е. для каждой из платформ будет своя реализация (на QRegExp к примеру).
Но если оставить так как есть сейчас - то придется химичить с дефайнами в serialport_p.h, что не есть хорошо, т.к. для этого есть serialport_p_unix/win.h
ИМХО.
Тогда уж лучше сделать методы:
Код
C++ (Qt)
virtual QString portName() const = 0; //возвращает короткое имя
virtual bool setNativePort(const QString &port) = 0; //устанавливает полный путь порта

Цитата: b-s-a
Код
C++ (Qt)
virtual bool saveOldsettings() = 0;
virtual bool restoreOldsettings() = 0;
 
Действительно ли это нужно? Или все-таки можно использовать стандартные механизмы?
Что имеешь ввиду под стандартными механизмами?
Сохранять/восстанавливать предыдущие параметры то нужно по-любому (после открытия и перед закрытием).
Не спорю о необходимости восстановления (хотя, я бы сделал возможность отключения этой возможности через некое свойство), я просто предложил восстановить через setParity/setRate/...
Насчет упростить и оставить virtual void detectDefaultSettings() {} :
ну, тут если упрощать - то слишком много кода придется писать в этот метод,
т.е. будет громоздко. ИМХО, лучше его разбить на 5 стадий по смыслу.
Разбей хоть на 50. Но это же можно сделать статическими функциями внутри cpp или приватными функциями классов-реализаций.
Насчет префиксов m/m_ у приватных членов - то может быть, их вообще не писать (т.е. опускать их)?
т.к. я бегло просмотрел исходники Qt и там очень редко встречается этот префикс.
Хотя, в исходниках QtCreator - повсеместно.
А то лишняя писанина получается и имя переменной растет.
Я лично использую суффикс _: rate_, parity_, ...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 22, 2011, 18:16
b-s-a,

Я пока заккомитил свою версию.

После этого увидел, что и ты мерж новый подогнал.

Вопросы:
1. Почему ты сменил каталог src на lib?
2. Зачем ты в serialport.cpp/serialportinfo.cpp
добавил дефайны и подключаешь приватные заголовки?
Код
C++ (Qt)
#ifdef Q_OS_WINDOWS
# include "serialport_p_win.h"
#elif defined(Q_OS_UNIX)
# include "serialport_p_unix.h"
#else
# error Unsupported Operating System
#endif
 
Имхо, это не правильно. Реализация в serialport.cpp ничего не должна знать об платформо зависимых вещах.
3. Почему убрал *.pri файл?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 22, 2011, 18:31
Заглянул в исходники на гиториусе (serialport_p_win.cpp):

Код
C++ (Qt)
bool SerialPortPrivateWin::dtr() const
{
   return (SerialPort::Dtr && lines());
}
 
bool SerialPortPrivateWin::rts() const
{
   return (SerialPort::Rts && lines());
}

Нужно бы исправить && на &


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 22, 2011, 18:52
Цитата: pastor
Нужно бы исправить && на &
Тьфу, заработался. Там еще много косяков.
Повелся не думая за b-s-a :)

2 b-s-a,
просмотрел еще раз твой мерж, и не понял: а чем тебя не устроил мой первоначальный вариант с AbstractPortPrivate ?
Тем более, что в твоей реализации нужно дополнительно создавать два лишних файла serialport_p_win/unix.h (зачем???), в которых нужно дублировать методы и т.п.
Я то думал, это какой-то особый "финт", но преимуществ такого разделения так и не увидел., только лишние телодвижения, ИМХО.
Я склоняюсь больше к варианту аналогичному как в сокетах.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 22, 2011, 19:26
Я склоняюсь к такому "набору" файлов:

serialport_p.h
serialport_win_p.cpp
serialport_mac_p.cpp
serialport_unix_p.cpp

Аналогично для приватного класса serialportinfo


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 07:17
pastor ,
да и я тоже к такому.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 08:40
Только я бы добавил еще промежуточные классы типа "Engine", т.к. такой подход скрывает в реализации "serialport.cpp" платформо-зависимые типы данных и т.п.

Я ниже приаттачил два примера scope_bad и scope_ok, которые демонстрируют этот подход.

В примере scope_bad (который аналогичен нашему текущему подходу) переменные Windows видны в "base.cpp" , что НЕ ПРАВИЛЬНО! Имхо.

В примере же  scope_ok любые платформо зависимые типы данных скрыты через класс BaseEngine, что ПРАВИЛЬНО!
Этот подход был ранее в библиотеке и выполнен.
Также, этим пользуются повсеместно тролли в Qt!

ИМХО, я бы не стал упрощать всё до такой степени как предлагает b-s-a!
Я за оставление структуры от версии "master".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 23, 2011, 08:42
1. Почему ты сменил каталог src на lib?
мне показалось более логичным разместить в lib. Так как потом еще будет tests, examples...
2. Зачем ты в serialport.cpp/serialportinfo.cpp
добавил дефайны и подключаешь приватные заголовки?
Код
C++ (Qt)
#ifdef Q_OS_WINDOWS
# include "serialport_p_win.h"
#elif defined(Q_OS_UNIX)
# include "serialport_p_unix.h"
#else
# error Unsupported Operating System
#endif
 
Имхо, это не правильно. Реализация в serialport.cpp ничего не должна знать об платформо зависимых вещах.
На то и MR существуют - не нравится, отклоняешь
3. Почему убрал *.pri файл?
Я поменял тип проекта на subdirs - т.е. будет куча независимых подпроектов.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 08:48
b-s-a (а также остальные заинтересованные лица), почитай(те) и выскажись(тесь) по тем доводам которые я привел выше про область видимости.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 23, 2011, 10:09
Ссылочки на MR скидывайте пожалуйста.

Встряну по поводу файловой структуры. Всячески агитирую за nix-style с помесью qt.
Код:
bin - binary
lib - binary
etc - text configs
share - shareable objects
  `translations
  `images
src - sources of modules
  `modules
  `examples
  `tests

Исчезновение *pri сводит на нет возможность вкомпиливания в приложение библиотеки. Нет ну можно конечно выкрутить статической библиотекой.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 10:22
Цитировать
Ссылочки на MR скидывайте пожалуйста.
http://gitorious.org/qserialdevice/qserialdevice/merge_requests

Цитировать
Исчезновение *pri сводит на нет возможность вкомпиливания в приложение библиотеки. Нет ну можно конечно выкрутить статической библиотекой.
Люто плюсую :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2011, 10:24
>>А как мне склонировать ветку 2.0? А то клонирую мастера постоянно.
да в принципе ни как, клонируется всё хранилище. Тебе просто нужно из твоего локального клона извлечь рабочие файлы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 23, 2011, 10:26
b-s-a (а также остальные заинтересованные лица), почитай(те) и выскажись(тесь) по тем доводам которые я привел выше про область видимости.
Не вижу смысла усложнять структуру и увеличивать потребление ресурсов ради убирания из области видимости реализации платформозависимых элементов. Тот же QFile содержит такое усложнение из-за использования общих с другими классами элементов. А вот, например, QSettings сделан иначе.
Цитировать
Исчезновение *pri сводит на нет возможность вкомпиливания в приложение библиотеки. Нет ну можно конечно выкрутить статической библиотекой.
Никто не мешает выделить pri из pro. Я как-то не подумал, что библиотека будет использоваться таким образом.
Я против включения  в репозиторий каталогов сборки и готовых файлов. Я, например, всегда пользуюсь теневой сборкой, чтобы не захламлять исходники.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 10:33
Что скажут остальные?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июнь 23, 2011, 10:34
Я не про каталоги сборки говорю, я уже упоминал, когда cmake правил, что бибилотека не должна знать куда ей собираться, это решает хост-проект. Я говорю о смысле именования папок.

Таки все пользуются теневой сборкой. Однако, когда программе надо загрузить переводы\кофиги\картинки, придумана структура для того, чтобы результирующие бинарники всегда знали где что лежит.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 23, 2011, 10:43
>>Никто не мешает выделить pri из pro.
вот и выделите его сразу.

>>Я против включения  в репозиторий каталогов сборки и готовых файлов.
pri-файл к ним никакого отношения не имеет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 23, 2011, 10:48
>>Я против включения  в репозиторий каталогов сборки и готовых файлов.
pri-файл к ним никакого отношения не имеет.
я говорил уже о другом - лень было процитировать часть исходного сообщения.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 10:50
Ну так об области видимости кто-нить что-нить выскажет ещё?
Или я не дождусь...

ЗЫ: Хотелось бы "услышать" ещё тов. BRE и Rcus


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Rcus от Июнь 23, 2011, 11:30
То есть с одной стороны пара условных секций для определения платформозависимых полей и инициализации в общем конструкторе. При этом структура довольно проста, но не позволяет иметь несколько реализаций порта в одной сборке (невелика потеря с моей точки зрения, но может пригодиться при работе с FT232 через её API, а не VCP драйвер). А расширение видимости платформенных определений в общую часть приватного класса - небольшая цена за простоту (главное что это не проникает в public header).
С другой стороны вызов проходит через Base::method -> BasePrivate::method -> BaseEngine::method -> BaseEnginePrivate::method от кого скрываемся так сказать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 11:40
Цитата: Rcus
главное что это не проникает в public header
Т.е. если приникает в базовую реализацию base.cpp - то и фик с ним?

Rcus, так, всё-таки, каков твой вердикт?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Июнь 23, 2011, 11:43
Согласен с камрадами по поводу избыточности такого скрывания (рекурсивно так можно уйти очень глубоко).  :)
Приватные классы и сама реализация все равно доступна только разработчику, так для чего и от кого что прятать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 23, 2011, 11:45
Т.е. если приникает в базовую реализацию base.cpp - то и фик с ним?
Ты не путай, "базовую реализацию" с "реализацией общей части". Это две большие разницы, как говорят в Одессе.  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 11:47
ОК,  парни, спасибо,  убедили. :)

Ща буду объединять твою, b-s-a, часть и то что уже есть на гиториосе.
Вечером (по москве) заккомичу.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 17:39
Всё, закоммитил.

Класс SerialPortInfo реализовал 1:1 как QPinterInfo с небольшими отличиями и, по-моему, получилось неплохо. :)
В классах SerialPort тоже некоторые отличия: микс кучи всего .

В общем, зацените.

ЗЫ: и на будущее, давайте условимся в выражениях сравнения - константы или функции возвращающие значения писать слева, а переменные справа.
Код
C++ (Qt)
...
   int value = 0;
   if (SerialPort::NoParity == value) {
   ...
   }
...
 

на всякий случай.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Июнь 23, 2011, 18:26
Цитировать
ЗЫ: и на будущее, давайте условимся в выражениях сравнения - константы или функции возвращающие значения писать слева, а переменные справа.

Почему так? Мы же всетаки читаем слева-направо, да и сравниваем значение переменной (функции) с неким значением, а не наоборот. Как-то такой вариант мне неочень


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2011, 18:58
Чтоб не ошибиться случайно


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 23, 2011, 21:11
Цитировать
ЗЫ: и на будущее, давайте условимся в выражениях сравнения - константы или функции возвращающие значения писать слева, а переменные справа.
А вот это зря. Если вдруг будем мержить с Qt, то придется судорожно везде исправлять. Тролли не принимают подобный код.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июнь 24, 2011, 05:38
>>Чтоб не ошибиться случайно
А в чём можно ошибиться?

>>Мы же всетаки читаем слева-направо
согласен, это более естественно


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 07:16
Ох, как всё сложно то...  :-\


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 08:10
Ох, как всё сложно то...  :-\
да ладно. вот если бы ты об этом узнал, когда весь код написал, вот тогда да - сложно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 09:15
Ну ладно.
Ну так что там с структурой классов SerialPort + SerialPortInfo и их приватных подклассов: примерно годится такой вариант или нет?
А то уже руки чешутся начинать реализацию писать :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 11:25
Внес ряд изменений:
https://gitorious.org/~bsa/qserialdevice/bsas-qserialdevice/commits/2.0


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 11:47
Вопросы:

по SerialPortInfo private.

1. Зачем убрал nullSerialPortInfoPrivate?
Чисто для получения метода isNull() ?

2. Может быть, код:
Код
C++ (Qt)
foreach(const SerialPortInfo &info, availablePorts()) {
   if (port.portName() == info.portName()) {
       *this = info;
break;
   }
}
 
заменить на:
Код
C++ (Qt)
QList<SerialPortInfo> list = availablePorts();
foreach(const SerialPortInfo &info, list) {
   if (port.portName() == info.portName()) {
       *this = info;
break;
   }
}
 
?
т.к. по идее нужно всего один раз вызвать availablePorts() , а не каждый раз при итерации.

--

Левые вопросы:
1. После того как я совершу мерж, как мне на сайте gitorious его закрыть?
Просто выбрать статус Closed и написать комментарий?

т.к. как кроме статусов Opened/Closed там больше нет никаких, а тов. lit-uriy говорил, что есть еще и Merged, если я правильно его понял.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 12:16
1. Зачем убрал nullSerialPortInfoPrivate?
Чисто для получения метода isNull() ?
По сути да. Зачем держать в памяти "пустой" объект, когда можно ограничиться нулевым указателем?

2. Может быть, код:
Код
C++ (Qt)
foreach(const SerialPortInfo &info, availablePorts()) {
   if (port.portName() == info.portName()) {
       *this = info;
break;
   }
}
 
заменить на:
Код
C++ (Qt)
QList<SerialPortInfo> list = availablePorts();
foreach(const SerialPortInfo &info, list) {
   if (port.portName() == info.portName()) {
       *this = info;
break;
   }
}
 
?
т.к. по идее нужно всего один раз вызвать availablePorts() , а не каждый раз при итерации.
foreach() гарантирует однократное выполнение второго параметра - т.е. availablePorts будет вызван 1 раз.

Левые вопросы:
1. После того как я совершу мерж, как мне на сайте gitorious его закрыть?
Просто выбрать статус Closed и написать комментарий?

т.к. как кроме статусов Opened/Closed там больше нет никаких, а тов. lit-uriy говорил, что есть еще и Merged, если я правильно его понял.
По хорошему, нужно выбирать Merged. Именно такой статус ставят тролли.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 12:21
Ок, насчет foreach не знал.

Цитировать
По хорошему, нужно выбирать Merged. Именно такой статус ставят тролли.
Ну я в упор там (на сайте) не вижу этого статуса: там только можно выбрать из Open/Closed в чекбоксе.
Где взять Merged?
Может это браузер тупит?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 12:46
Подозреваю, что там должна быть кнопка "вмержить".
Создал мерж реквест.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 12:56
Нету там (на сайте) этой кнопки.

Там, внизу, при выборе конкретного реквеста,
имеется только комбобокс с двумя (непустыми) вариантами:

Status :
1. Пустая строка
2. Open
3. Closed

--
Браузер - Firefox 4.0.1


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 14:04
Я думал так только у меня, создавшего реквест... Ладно, просто закрывай тогда.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 14:22
Я проверил, вдруг у меня пустая запись в комбобоксе (первая сверху) и есть недостающая надпись Merged (хз, вдруг js браузера играет шутку), я жмакнул её, но в итоге просто добавился мой комментарий к реквесту.

По ходу, какой-то касяк с гиториусом или хз что (типо может так и было задумано).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 19:07
Ты главное не просто соединяй версии, а мерж через git. Так будет хоть информация об авторе изменений сохраняться (чтобы знать, кто виноват).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 24, 2011, 19:46
Цитировать
Ты главное не просто соединяй версии, а мерж через git. Так будет хоть информация об авторе изменений сохраняться (чтобы знать, кто виноват).
Ну я и делал через git.

Цитировать
# Check out a new branch for integration
git checkout -b merge-requests/5

# Fetch the merge request into this branch
git pull \
  git://gitorious.org/qserialdevice/qserialdevice.git \
  refs/merge-requests/5

# Show the commits, assess they are okay
git log --pretty=oneline --abbrev-commit 2.0..merge-requests/5

# To apply the changes to your branch:
git checkout 2.0
git merge merge-requests/5
git push origin 2.0

Или как-то еще нужно?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 24, 2011, 19:59
Все правильно. Я не туда посмотрел.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 25, 2011, 21:31
Вот, не знаю, плакать нам или смеяться:
http://code.google.com/p/qt-communication-library/source/browse/trunk/QtCommunication/serialport.h

Сколько ж это может продолжаться? :)

b-s-e, признавайся, кто у кого скоммуниздил API: ты у него или он у тебя?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 26, 2011, 15:38
b-s-e, признавайся, кто у кого скоммуниздил API: ты у него или он у тебя?
я впервые это вижу. Зато еще один источник для идей реализации.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 26, 2011, 18:09
Я тут подумал насчет SerialPortInfo через udev при помощи QLibrary и
пришел к выводу, что это очень накладно:
мало того что придется декларировать прототипы используемых функций, так еще и сами структуры
(если, конечно, не использовать заголовки от udev).

Может лучше udev линковать в рантайме (а не через QLibrary), при этом, отделить дефайнами вариант с udev и без него?
Ведь, если в каком-то *nix нет библиотеки udev, то и нет его заголовков!

ЗЫ: по моему, даже в QPrinterInfo так и сделано (если я не ошибаюсь).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 26, 2011, 23:12
Я тут подумал насчет SerialPortInfo через udev при помощи QLibrary и
пришел к выводу, что это очень накладно:
мало того что придется декларировать прототипы используемых функций, так еще и сами структуры
(если, конечно, не использовать заголовки от udev).

Может лучше udev линковать в рантайме (а не через QLibrary), при этом, отделить дефайнами вариант с udev и без него?
Ведь, если в каком-то *nix нет библиотеки udev, то и нет его заголовков!

ЗЫ: по моему, даже в QPrinterInfo так и сделано (если я не ошибаюсь).
Как ты собираешься линковать в рантайме без использования QLibrary?
Вообще-то, если нет в системе udev, то и поддержка его не должна компилироваться. Таким образом, как минимум структуры переопределять не придется. Но для начала, я думаю, вообще от udev отказаться - просто парсить /dev/.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 27, 2011, 07:29
Цитировать
Как ты собираешься линковать в рантайме без использования QLibrary?
Эмм.. ну, я не правильно выразился наверное.
Имею ввиду линковку с явным прописыванием LIBS+= -ludev.
т.е. без QLibrary.
Цитировать
Вообще-то, если нет в системе udev, то и поддержка его не должна компилироваться. Таким образом, как минимум структуры переопределять не придется.
Да, именно так!
Я предлагаю сделать что-то вроде:
Код
C++ (Qt)
#if !defined (NO_UDEV)
//вот тут код или заголовки для udev
#else
//вот тут код обычного парсинга директории /dev
#endif
 
При этом, естественно, в зависимости от дефайна NO_UDEV подключать или нет LIBS+= -ludev.

Выставлять дефайн NO_UDEV можно или вручную в флагах перед сборкой библиотеки или, может быть, оно будет выставляться/сбрасываться автоматически
после проверки существования udev в системе.
Не знаю, возможно ли это при использовании qmake, но CMake это позволяет.

Можно сделать какой нить скрипт типа: configure и т.п.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Июнь 27, 2011, 14:50
а подскажите пожалуйста как его интегрировать в мой проект для чтения или записи с порта tty0?

давил просто два файла abstractserial.h и abstractserial.cpp. QT Creator не может найти "../qserialdevice_global.h".
Библиотеку скомпилировал, по крайней мере BuildLibrary.pro выполнился без ошибок....


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 27, 2011, 15:17
а подскажите пожалуйста как его интегрировать в мой проект для чтения или записи с порта tty0?

давил просто два файла abstractserial.h и abstractserial.cpp. QT Creator не может найти "../qserialdevice_global.h".
Библиотеку скомпилировал, по крайней мере BuildLibrary.pro выполнился без ошибок....
1. Попробуй в abstractserial.h закоментировать строку с: #include "../qserialdevice_global.h".
2. abstractserial.cpp не нужен


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Июнь 27, 2011, 15:19
я имею в виду то что я скопировал в папку с проектом папку src и что дальше? Вроде заработало...

добавил #include "src/qserialdevice/abstractserial.h". далее делаю по документации..
Код
C++ (Qt)
..
       AbstractSerial *serialDevice = new AbstractSerial(this);
       ..
и получаю от creator:
Цитировать
Выполняется сборка проекта Timer...
Настройки не изменились, этап qmake пропускается.
Запускается «E:\Qt\qtcreator-2.2.0\mingw\bin\mingw32-make.exe»
E:/Qt/qtcreator-2.2.0/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `F:/QT/Timer-build-desktop'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"e:\Qt\4.7.3\include\QtCore" -I"e:\Qt\4.7.3\include\QtGui" -I"e:\Qt\4.7.3\include" -I"e:\Qt\4.7.3\include\ActiveQt" -I"debug" -I"." -I"..\Timer" -I"." -I"e:\Qt\4.7.3\mkspecs\win32-g++" -o debug\dialog.o ..\Timer\dialog.cpp
..\Timer\dialog.cpp: In member function 'void Dialog::start()':
..\Timer\dialog.cpp:23: warning: unused variable 'serialDevice'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\Timer.exe debug/main.o debug/dialog.o debug/moc_dialog.o  -L"e:\Qt\4.7.3\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4
mingw32-make[1]: Leaving directory `F:/QT/Timer-build-desktop'
debug/dialog.o:F:\QT\Timer-build-desktop/../Timer/dialog.cpp:23: undefined reference to `AbstractSerial::AbstractSerial(QObject*)'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Timer.exe] Error 1
mingw32-make: *** [debug] Error 2
Процесс «E:\Qt\qtcreator-2.2.0\mingw\bin\mingw32-make.exe» завершился с кодом 2.
Возникла ошибка при сборке проекта Timer (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»
[/color]


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 27, 2011, 15:50
См. примеры. /examples , /test


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Июнь 27, 2011, 16:21
ну или как хотя бы папку src всю включить в проект???
к тому же неопределенная ссылка на `AbstractSerial::AbstractSerial(QObject*)', значит что то с проектом...я же просто всавил #include "src/qserialdevice/abstractserial.h" и давай дальше с ним работать...
а examples и test сложен для понимания...



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Июнь 27, 2011, 17:07
спасибо,разобрался...надо читать матчасть и примеры :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 28, 2011, 18:18
Итак, в ветку 2.0 я напихал (набросал) примерную связку новых классов и т.п. (и вообще, основную идею и взаимодействие между классами).
Просьба к коллегам: разобраться досконально в моих наработках и, может быть, посоветовать что-то лучше, что-то добавить, что-то выкинуть, что-то изменить.

ЗЫ: Жду комментариев (по делу!).   


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 28, 2011, 20:39
А обязательно делать функцию waitForReadOrWrite()? Почему нельзя по-отдельности?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 29, 2011, 07:35
Нельзя, см. внимательнее реализацию: bool SerialPort::waitForReadyRead(int msecs) и bool SerialPort::waitForBytesWritten(int msecs)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июль 04, 2011, 10:34
Нельзя, см. внимательнее реализацию: bool SerialPort::waitForReadyRead(int msecs) и bool SerialPort::waitForBytesWritten(int msecs)
спасибо. я понял, зачем этот зверь нужен.

Сделал ряд исправлений компиляции под *nix.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Июль 15, 2011, 10:02
перенес приложение на ОС Ubuntu 11.04, при компиляции в Creator ругается на отсутствие #include <libudev.h>,при закоменте строки вылетает куча ошибок. Что нибудь можно сделать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: zenden от Июль 15, 2011, 10:10
перенес приложение на ОС Ubuntu 11.04, при компиляции в Creator ругается на отсутствие #include <libudev.h>,при закоменте строки вылетает куча ошибок. Что нибудь можно сделать?

наверно нужно установить пакет libudev-dev

sudo apt-get install libudev-dev


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Июль 18, 2011, 08:31
kuzulis, не очень понял как добавить merge request или написать баг, но вроде строчка с return'ом должна бы выглядеть вот так:

Код:
diff --git a/src/qserialdevice/nativeserialnotifier_unix.cpp b/src/qserialdevice/nativeserialnotifier_unix.cpp
index 753c7f4..5ecfeb7 100644
--- a/src/qserialdevice/nativeserialnotifier_unix.cpp
+++ b/src/qserialdevice/nativeserialnotifier_unix.cpp
@@ -114,7 +114,11 @@ bool NativeSerialNotifier::eventFilter(QObject *obj, QEvent *e)
         this->engine->exceptionNotification();
         return true;
     }
-    return NativeSerialNotifier::eventFilter(obj, e);
+#ifdef Q_OS_WIN
+    return QWinEventNotifier::eventFilter(obj, e);
+#else
+    return QThread::eventFilter(obj, e);
+#endif
 }
 
 void NativeSerialNotifier::run()


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июль 18, 2011, 09:48
sne, название файла предполагает, что он будет компилироваться только для unix. Поэтому условие #ifdef Q_OS_WIN никогда не выполнится.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Июль 18, 2011, 14:07
b-s-a, да, конечно же ты прав.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 20, 2011, 19:41
>>Что-то за последнее время не наблюдается движухи для версии 2.0 (судя по исходникам). Автор ушёл на каникулы?  Улыбающийся
Не, жарко думать. :)
Да и криво как-то всё получается, громоздко.
Жду ваших замечаний и новых предложений, особенно связку SerialPort + SerialPortNotifier - надо бы как-то красиво придумать взаимодействие между ними, но шото нет мыслей вообще.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 20, 2011, 20:12
>>Думаю, что не надо ничего придумывать.
Надо.

>>За нас давно уже всё придумали. Нам нужно лишь адаптировать связку для Qt между Windows и Posix.
Это то всё адаптировано.

>>Обрати внимание на библиотеку RxTx.
Я там её исходники не могу найти.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июль 20, 2011, 21:10
z.yu, а чем RxTx лучше разрабатываемой библиотеки?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: LisandreL от Июль 20, 2011, 22:14
Совершенно не Qt Style. ???


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: asvil от Июль 21, 2011, 09:22
Так это же синтаксичны цукар.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 21, 2011, 09:38
Лан, парни, хорош флеймить.

Ну а по делу кто что скажет?
Имею ввиду: как быть с AbstractSerialPortPrivate + AbstractSerialPortNotifier и с SerialPortPrivate + SerialPortNotifier (см. исходники).
Или может как-то по другому это сделать? Но как?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 21, 2011, 23:11
>>Совершенно не Qt Style.
А как же
Код
C++ (Qt)
    QString i;           // current file's number
    QString total;       // number of files to process
    QString fileName;    // current file's name
 
    QString status = QString("Processing file %1 of %2: %3")
                    .arg(i).arg(total).arg(fileName);
??


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: LisandreL от Июль 22, 2011, 00:35
А как же??
Я про предложения z.yu.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: LisandreL от Июль 22, 2011, 22:31
Qt Style не панацея, лишь бы была удобность и однозначность понимания кода (я не против принятых правил).
Вот с понятностью-то и проблема. От функции baudrate ожидаешь, что она будет возвращать значение параметра, а не устанавливать его (должно быть setBaudrate).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Июль 23, 2011, 17:28
>>От функции baudrate ожидаешь, что она будет возвращать значение параметра, а не устанавливать его
с этим согласен


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 28, 2011, 17:43
Я тут закомитил много чего, уже библиотека в принципе наполовину работает:
- Windows - класс SerialPort + SerialPortInfo работают.
- .nix - только SerialPortInfo работают.

На что хотел бы заакцентировать внимание:
1. Нужна правильная реализация методов: setDataErrorPolicy(), dataErrorPolicy() .

Жду реализацию от тов. b-s-a.

2. Нужна правильная реализация отлова ошибок. В текущем варианте она криво реализована.
Для Windows: Реально они ловятся через CrearCommError, так вот, непонятно куда его сунуть в код (сунул пока
в bytesAvailable() и read()) - но некрасиво получается.

Жду реализацию от тов. b-s-a.

По п. 1. и 2. я там набросал на скорую примерный вариант - но, чую, что ерундово. :)
Почему от b-s-a - потому, что он предложил использовать Policy.

Так что, b-s-a, тебе и флаг в руки, т.к. я не оч. понимаю что требуется! :)

3. Так же от всех заинтересованных лиц хотел бы услышать в общем комментарии по поводу текущей структуры классов и их взаимодействия между собой.
Годится ли такая структура или нет?




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июль 28, 2011, 22:26
1. Нужна правильная реализация методов: setDataErrorPolicy(), dataErrorPolicy() .
Могу реализовать только под *nix
2. Нужна правильная реализация отлова ошибок. В текущем варианте она криво реализована.
Опять же, только под *nix


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 29, 2011, 07:20
Аха, пойдёт.
Я хоть тогда уловлю основную суть.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июль 29, 2011, 10:25
Реализовать просто. Главное, чтобы ОС позволяла точно определить место ошибки (*nix это позволяет). В этом случае все режимы реакции на ошибки эмулируются очень просто. Но, скорее всего, эмуляцию делать даже не придется, так как ОС позволяют ошибку игнорировать, опускать или заменять нулем. Остается реализовать только StopReceiving. Можно это сделать через unix подобный стек (если делается упреждающее чтение в фоновом режиме) - если возникла ошибка четности, то перед байтом данных пишется код 0xff, если пришел сам код 0xff, то перед ним тоже пишется 0xff (правда, тут есть одна проблема, если пришел битый код 0xff, то узнать об этом будет невозможно). Когда данные передаются пользователю, то этот код парсится и чтение прерывается ПЕРЕД кодом данных. Вот только необходимо еще проверить, как будет работать встроенный код буферизации. А то я долго ловил из-за него глюки.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 29, 2011, 10:45
>>так как ОС позволяют ошибку игнорировать, опускать или заменять нулем
В Windows можно только игнорировать, заменять нулем, блокировать операции чтения/записи (судя по MSDN),
а вот опускать/пропускать не получится наверное.

Эти опции устанавливаются в DCB:

StopReceiving
Цитировать
fAbortOnError

    If this member is TRUE, the driver terminates all read and write operations with an error status if an error occurs. The driver will not accept any further communications operations until the application has acknowledged the error by calling the ClearCommError function.


PassZero
Цитировать
fErrorChar

    Indicates whether bytes received with parity errors are replaced with the character specified by the ErrorChar member. If this member is TRUE and the fParity member is TRUE, replacement occurs.
Цитировать
ErrorChar

    The value of the character used to replace bytes received with a parity error.


Но!  Все эти опции в винде работают через Ж.. .

К примеру, если устанавливаю PassZero, то WaitCommEvent не генерирует событий на приход некоторых символов (например '6'),
и если набрав/жмакнув несколько раз '6666' а потом '7' - то событие появляется и класс читает все 5 символов (замененных нулями).

Если устанавливаю StopReceiving - то не получается остановить чтение, т.к.
перед тем как прочитать данные в классе вызывается метод bytesAvailable(), который содержит ClearCommError(), который
сбрасывает ошибку и разрешает чтение/запись. Поэтому чтение данных не останавливается (я так предполагаю).

В общем, в Windows много непонятных моментов ещё. И как ухитриться прикрутить её особенности к логике SerialPort для меня еще та загадка.

>>В этом случае все режимы реакции на ошибки эмулируются очень просто.
Не хотельсь бы заморачиваться с эмуляцией, т.к. это трата проц. времени и увеличение вычислительных ресурсов + замедление работы.
Хотельсь бы всё сделать нативными средствами.
Но посмотрим что получится.

-----

b-s-a, ок, делай что планировал, идеи в принципе понятны.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июль 29, 2011, 12:04
Значит под Windows не получится сделать большинство режимов без эмуляции. С другой стороны, их мало кто будет использовать, поэтому можно пренебречь. А потом, все равно поддержка четности Mark и Space будет эмулироваться на большинстве *nix (в т.ч. и MacOS X). Тебя же это никак не тревожит?  ;)

На данный момент у меня к сожалению нет времени (да и вдохновения тоже). Думаю, в сентябре возьмусь за реализацию поддержки *nix.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: eugene от Август 03, 2011, 07:21
Я юзаю библу на линухе на платформе ARM и у меня возникла следующая проблема. При подключении через библиотеку переходника USB-COM от профилинка периодически всё зависает. Данных гоняется через интерфейс немного и данные из буфер забираются каждые пару секунд. Причем после зависания система уже не реагирует на включение-отключение переходника и спасает только ребут. Версия библы 0.3.0, qt4.6.3. Никто не сталкивался с подобным поведением?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 03, 2011, 07:27
2 eugene ,
попробуй не 0.3.0 а текущую из мастера.

Да и код в студию.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: eugene от Август 03, 2011, 07:58
Ок, вечером будет код. Пробовал 0.4.0 и новую, с ней вообще не заводится, не может открыть порт, поэтому вынужден был остаться на 0.3.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 10, 2011, 15:24
А-А-А Help!

Решил попробовать добавить поддержку WinCE путем её "эмуляции" (т.е. открываю порт без FILE_FLAG_OVERLAPPED)
и наткнулся на грабли.

Т.е. как планировалось работать:

Для уведомлений о событиях порта используется отдельный поток в котором крутится:
Код
C++ (Qt)
void SerialPortNotifier::run()
{
   while (m_running) {
 
       m_setCommMaskMutex.lock();
       ::SetCommMask(m_ref->m_descriptor, m_setMask);
       m_setCommMaskMutex.unlock();
 
       if (::WaitCommEvent(m_ref->m_descriptor, &m_currentMask, 0) != 0) {
           if (EV_ERR & m_currentMask & m_setMask) {
               m_ref->canErrorNotification();
           }
           if (EV_RXCHAR & m_currentMask & m_setMask) {
               m_ref->canReadNotification();
           }
           //FIXME: This is why it does not work?
           if (EV_TXEMPTY & m_currentMask & m_setMask) {
               m_ref->canWriteNotification();
           }
       }
   }
}
 

т.е. при открытии порта (с нулевым dwFlagsAndAttributes)
Код
C++ (Qt)
...
   m_descriptor = ::CreateFile((const wchar_t*)nativeFilePath.constData(),
                               desiredAccess, shareMode, 0, OPEN_EXISTING, flagsAndAttributes, 0);
...
 
запускается поток в котором происходит отлов событий порта.

И т.к. WinCE не поддерживает асинхронных (OVERLAPPED) операций I/O, то поток
заблокируется на WaitCommEvent и будет вечно ждать пока не произойдет какое-то событие.

Тут всё работает "корректно", поток блокируется на  WaitCommEvent.

НО грабли начинаются, если я из главного потока (да думаю и из любого другого)
пытаюсь изменить настройки DCB порта, вызывая SetCommState.

А именно, эта функция SetCommState почему-то не возвращает управление немедленно,
а блокируется вечно!

Разблокировка происходит автоматически и она возвращает результат, только если
отработает WaitCommEvent в другом потоке, т.е. если появится любое событие в порте.

Нигде описания подобного поведения в MSDN я не встречал.

Кто что может посоветовать в этой ситуации?
Получается, невозможно одновременно и менять настройки порта и ловить события!

Останавливать поток перед переконфигурированием порта не айс.

Если же открывать порт с флагом FILE_FLAG_OVERLAPPED и с потоком в котором также WaitCommEvent блокируется, то
SetCommState не зависает.

PS: И кстати, WaitCommEvent блокирует любые коммуникационные функции при работе с текущим дескриптором порта.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 12, 2011, 09:42
Большая просьба ко всем, у кого имеется WinCE, кто заинтересован в поддержке WinCE в QSerialDevice и у кого есть несколько минут свободного времени,
провести пару тестов:


http://www.forum.crossplatform.ru/index.php?showtopic=7357

См. там ниже пост №9


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 16, 2011, 19:56
Итак, я попробовал добавить поддержку WinCE:

https://gitorious.org/qserialdevice/qserialdevice/archive-tarball/2.0

Огромная просьба ко всем - протестировать и проверить!


ЗЫ: иначе я положу болт на всё, т.к. не вижу особого участия.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Август 16, 2011, 21:57
kuzulis, возьми отпуск - отдохни. Летом мозги у людей вообще туго работают. Потерпи до октября. Тогда все начнут приходить в себя и подключатся.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 01, 2011, 18:13

Итак, я попробовал добавить поддержку WinCE:
https://gitorious.org/qserialdevice/qserialdevice/archive-tarball/2.0
Огромная просьба ко всем - протестировать и проверить!

Я подправил и добавил кое что для Win CE. Теперь проект собирается.
Но нужно протестировать реальную работу.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: navrocky от Сентябрь 02, 2011, 08:04
огромное спасибо за либу)
Я недавно ее заюзал для написания терминальчика (minicom меня замучал). Столкнулся с проблемой что на ядре 2.4 не компилится, потому что хочет udev, которого там нет, можно как-нибудь исключить udev? Я готов даже это сделать сам и прислать патч )


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 02, 2011, 08:45
navrocky, ну, не компиль класс SerialDeviceEnumerator, т.к. udev только там используется.
В файле проекта закоментируй всё что с этим связано.

Хотя, в новой ветке 2.0 планируется (и уже имеется) возможность при компиляции включать/отключать поддержку Udev, но, правда пока не очень удачно: нужно для этого редактировать исходники и *.pro файл.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: navrocky от Сентябрь 02, 2011, 08:58
Ок, попробую. Спасибо. В принципе для цмейка можно конфигурилкуз прикрутить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 02, 2011, 18:00
Цитата: kuzulis
Я подправил и добавил кое что для Win CE. Теперь проект собирается.
Но нужно протестировать реальную работу.
Библиотека для WinCE теперь работает!
Проверено на эмуляторе Pocket PC.

PS: Только необходимо разобраться с именованием последовательных устройств(портов) в WinCE,
т.к. там, как минимум, возможны два варианта:
Цитировать
1. $device/COM1
2. COM1:
и все они рабочие (т.е. порт открывается что так что так).

Эти имена извлекаются при помощи FindFirstDevice()  (http://msdn.microsoft.com/en-us/library/aa447798.aspx)
в структуру: DEVMGR_DEVICE_INFORMATION
в которой есть поля:
Код
C++ (Qt)
typedef struct _DevmgrDeviceInformation_tag {
 DWORD dwSize;
 HANDLE hDevice;
 HANDLE hParentDevice;
 WCHAR szLegacyName[6];
 WCHAR szDeviceKey[MAX_PATH];
 WCHAR szDeviceName[MAX_PATH];
 WCHAR szBusName[MAX_PATH];
} DEVMGR_DEVICE_INFORMATION, *PDEVMGR_DEVICE_INFORMATION;
 
где
Цитировать
dwSize
    Size of this structure.
hDevice
    Device handle obtained from ActivateDeviceEx.
hParentDevice
    Parent device's handle obtained from ActivateDeviceEx.
szLegacyName
    Legacy device name, for example, "COM1:".
szDeviceKey
    Registry key path passed to ActivateDeviceEx.
szDeviceName
    Device name in the $device namespace.
szBusName
    Device name in the $bus namespace.
соответственно, я беру поля szDeviceName и szLegacyName как имя и локацию.

Поэтому надо как-то придумать какое имя к чему отнести: или к имени порта или к локации порта - ХЗ, т.к. и так и так оно работает.
И в связи с этим,также, нужно как-то модифицировать методы: setPort() и portName().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Сентябрь 05, 2011, 10:09
COM1 - название
$device/COM1 - локация

в setPort можно передавать как название, так и локацию
метод port() возвращает всегда полную локацию
portName() только название


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: juvf от Сентябрь 07, 2011, 10:42
Вобщем нашел закономерность. У меня в компе есть 2 ком порта. COM1 на материнской плате, "честный" компорт. СОМ7 - преобразователь USB<->RS-232 на чипе prolific. Если мастеру назначаю СОМ1, т.е. "честный", а редэру СОМ7, то все работает без сбоев. Но если мастеру указываю порт СОМ7, а редэру СОМ1 - то ошибки долго не заставляют ждать. Сыпятся.
По хорошему надо бы выкинуть этот prolific и поставить нормальный преобразователь, типа ftdi, но дело в том, что подобный баг наблюдал и с преобразователями на чипах ftdi, и на USB GSM модемах.
Ага... Ок, проверю это дело... (Уменя в тестах мастер был "мамкин" порт, а слейв - "пролифик" PL2303)  :)
Не подтверждаю "ошибки". У меня работает как часы.
OS: Win7 x32
Шнурок: PL2303
Драйвер:
- поставщик Prolific
- дата разработки 19.11.2009
- версия 3.3.10.140

Давно уже переписал свое приложение на WinAPI и забыл про эту проблему. Вчера коллеги бились о стену со своим приложением. Иногда обмен сбивается. Они в две головы решали эту проблему, багу в коде искали. Сегодня к обеду проблему решили )). Я поинтересовался - где была ошибка..... А они просто поменяли преобразователь. Ну я не удивился, когда выяснил чем они пользуются для связи с компортом - старая знакомая библиотека для компорта под Qt.  ;D
Причем я грешил на Prolific, но они поставили другой преобразователь, тоже на Prolific-е и всё работает. А глючило и у меня и у них на преобразователе TU-S9. Может преобразователь кривой..... однако с GSM-модемом (Novacom) я такой-же глюк наблюдал, а с этим "глючным" TU-S9 на WinAPI всё работает как часы, без сбоев.

ps давно не слежу за развитием этой библиотеки, т.к. не использую, но может уже эту багу всё таки обнаружил автор и пофиксил.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sne от Сентябрь 07, 2011, 13:21
kuzulis, плз глянь вот эту строчку-то, вылетает же..

Код:
qserialdevice$ git diff
diff --git a/src/qserialdevice/nativeserialnotifier_unix.cpp b/src/qserialdevice/nativeserialnotifier_unix.cpp
index 753c7f4..4ab3f79 100644
--- a/src/qserialdevice/nativeserialnotifier_unix.cpp
+++ b/src/qserialdevice/nativeserialnotifier_unix.cpp
@@ -114,7 +114,7 @@ bool NativeSerialNotifier::eventFilter(QObject *obj, QEvent *e)
         this->engine->exceptionNotification();
         return true;
     }
-    return NativeSerialNotifier::eventFilter(obj, e);
+    return QThread::eventFilter(obj, e);
 }
 
 void NativeSerialNotifier::run()


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 17, 2011, 07:52
COM1 - название
$device/COM1 - локация

в setPort можно передавать как название, так и локацию
метод port() возвращает всегда полную локацию
portName() только название
Cмотри внимательнее! Там не COM1, а COM1: .
т.е. открыть можно и как "COM1" и как "COM1:" и как "$device/COM1"

И как парсить и что во что преобразовывать - пока не очень понятно,
тем более, в WinCE есть и другие последовательные устройства отличные от COM (например Bluetooth и т.п.) и их имена также нужно учитывать.

Ну это ладно, попробую разобраться.

Цитата: sne
kuzulis, плз глянь вот эту строчку-то, вылетает же..
Ок, поправил.


Название: Re: QSerialDevice [Symbian]
Отправлено: kuzulis от Сентябрь 29, 2011, 12:28
Всем доброго времени.

Вопрос к знатокам ОС Symbian!

Я нарыл немного информации  (http://library.developer.nokia.com/index.jsp?topic=/S60_3rd_Edition_Cpp_Developers_Library/GUID-35228542-8C95-4849-A73F-2B4F082F0C44/html/SDL_93/doc_source/reference/reference-cpp/C32/RCommServClass.html)(на сайте нокии) по API для доступа к последовательным портам в ОС Symbian
и непонятен один момент.

Там, одним из методов класса RComm является метод NotifyDataAvailable()
Цитировать
NotifyDataAvailable()

Capability:    Illegal    

IMPORT_C void NotifyDataAvailable(TRequestStatus &aStatus) const;
Description

Notifies the client when data is available to be read from the input buffer.
Parameters
TRequestStatus &aStatus    

On return, system wide error code for asynchronous function.

Т.е. оно как-то должно уведомлять об поступлении в приемный буфер порта данных, доступных для чтения.

Внимание, вопрос:
1. Каким образом мне отловить это уведомление?
2. Как в симбе построена система уведомлений/нотификации?
3. Где б об этом можно почитать подробнее и/или может есть любые "левые" примеры с использованием
нотификации?


Название: Symbian. Нужна помощь.
Отправлено: kuzulis от Октябрь 02, 2011, 17:51
Люди!

Кто шарит в программировании для Symbian,
нужна помощь в реализации методов
- SerialPort::read()
- SerialPort::write()

а то я что-то запутался с преобразованием/приведением  симбиановских буферов типа TBuf8 и т.п. к *char и т.п.

Я уже реализовал и проверил на эмуляторе класс SerialPortInfo - он работает  ::) (я сцуко крут!) ,
и для класса SerialPort реализовал основные его методы (кроме вышеперечисленного и пр.).

Кому интересно - можете потестить у себя на реальных девайсах с симбианом.  :P


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 03, 2011, 22:43
Ревизия текущего состояния библиотеки:
1. Считаю, что методы SerialPortPrivate::setReadNotificationEnabled и пр. следует перенести в AbstractSerialPortPrivate. В том числе и нотификатор, дабы не плодить сущностей.
2. Считаю, что SerialPort не должен вызывать приватные/защищенные методы SerialPortPrivate/AbstractSerialPortPrivate (начал работать с этим, но лучше пусть автор сделает)
3. serialport_p.h, думаю, стоит разделить по архитектурам. Не нравятся мне такие нагромождения.

Работоспособность библиотеки пока еще не проверял, но под Linux компилировал.
Все мои изменения в MR.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 04, 2011, 08:01
2 b-s-a

Спасибо огромное.
Я вот жду жду пока кто-то покритикует и наставит на путь истинный,
а то что-то зачумел совсем :)
Цитировать
1. Считаю, что методы SerialPortPrivate::setReadNotificationEnabled и пр. следует перенести в AbstractSerialPortPrivate. В том числе и нотификатор, дабы не плодить сущностей.
Ок, вечером сделаем. Я и сам думал об этом.

Цитировать
2. Считаю, что SerialPort не должен вызывать приватные/защищенные методы SerialPortPrivate/AbstractSerialPortPrivate (начал работать с этим, но лучше пусть автор сделает)
Согласен.
Т.е. типа их (эти приватные/защищенные методы) сделать открытыми?
Но лучше примерчик замерж.

Цитировать
3. serialport_p.h, думаю, стоит разделить по архитектурам. Не нравятся мне такие нагромождения.
Ок. Мне тоже уже не нравится.
Вопросы:
При раскидке по архитектурам, имя класса SerialPortPrivate оставлять таким же или что-то типа WinSerialPortPrivate, UnixSerialPortPrivate, и т.п. ?
И если имя менять - то как быть с конструкторами SerialPort:
Цитата: cpp
SerialPort::SerialPort(QObject *parent)
: QIODevice(parent)
, d_ptr(new SerialPortPrivate(this)) // << вот с этим именем SerialPortPrivate как быть тогда?
{
}

Цитировать
Все мои изменения в MR.
Ок, посмотрел, вечером объединю всё.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 04, 2011, 20:34
Цитата: kuzulis
Цитата: b-s-a
1. Считаю, что методы SerialPortPrivate::setReadNotificationEnabled и пр. следует перенести в AbstractSerialPortPrivate. В том числе и нотификатор, дабы не плодить сущностей.
Ок, вечером сделаем. Я и сам думал об этом.
Нет, нифига при таком подходе не получается.
ИМХО, все-таки нужно было делать через промежуточный класс engine

2 b-s-a
Также глянул твой цикл где ты применяешь бинарный поиск и заметил, что если скорость будет равна 4000000 бод, то она в
список не добавится, т.к. её адрес равен standardRates_end.
Нужно наверное в массив еще добавить любое значение больше чем 4000000 - и тогда должно работать. Не?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 04, 2011, 20:36
С именами варианта 2:
1. Для всех архитектур одно имя
2. Для каждой архитектуры свое имя, но в конце хидера typedef на общее имя. typedef лучше стоит делать в общем хидере, который будет условно подключать нужный платформенный.

Цитировать
Нет, нифига при таком подходе не получается.
ИМХО, все-таки нужно было делать через промежуточный класс engine
Почему не получается? Сделай их абстрактными, а в SerialPortPrivate переопредели. Какие проблемы?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 04, 2011, 20:47
Цитировать
Почему не получается? Сделай их абстрактными, а в SerialPortPrivate переопредели. Какие проблемы?
С нотификатором хрень получается. Хотя.. хз..

Не, переопределять
Цитировать
    bool isReadNotificationEnabled() const;
    void setReadNotificationEnabled(bool enable);
    bool isWriteNotificationEnabled() const;
    void setWriteNotificationEnabled(bool enable);
скорее всего не придется, т.к. у этих методов одна и таже реализация.


ЗЫ:
И глянь выше мое сообшение (я отредактировал) про бинарный поиск.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 05, 2011, 11:14
Также глянул твой цикл где ты применяешь бинарный поиск и заметил, что если скорость будет равна 4000000 бод, то она в
список не добавится, т.к. её адрес равен standardRates_end.
Нужно наверное в массив еще добавить любое значение больше чем 4000000 - и тогда должно работать. Не?
Именно что "не". Смотри, если у тебя массив из N элементов, то что лежит по индексу N (ведь *(array + N) - это аналог array[N])?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 05, 2011, 14:04
>Именно что "не". Смотри, если у тебя массив из N элементов, то что лежит по индексу N (ведь *(array + N) - это аналог array[N])?
Да, точно, по индексу N переменная будет за пределом (N-1) массива лежать и в ней будет всякая хрень. Тупил ночью  ::)

Но с архитектурой приватных классов библиотеки срочно нужно что-то предпринять/переделать. А то какая то хрень получилась.
Но вот что - хз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 05, 2011, 16:09
И какая же?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 05, 2011, 16:58
И какая же?
ХЗ какая, но я вот предлагаю теперь такую, с учетом твоих пожеланий о разделении по платформам.
Я приаттачил простенький проектик с наброском новой архитектуры.

Там изменения коснулись только приватных классов SerialPortPrivate и SerialPortNotifier.
Теперь классы SerialPortPrivate и  SerialPortNotifier являются абстрактными, и имеют статический метод create(),
который создает наследников SerialPortPrivate и SerialPortNotifier в зависимости от платформы.

т.е. наследниками являются WinSerialPortPrivate, UnixSerialPortPrivate  и т.п., WinSerialPortNotifier , UnixSerialPortNotifier и т.п.
и, соответственно, теперь в конструкторе SerialPort вместо
Код
C++ (Qt)
SerialPort::SerialPort(QObject *parent)
   : QIODevice(parent)
   , d_ptr(new SerialPortPrivate(this))
{}
 
теперь
Код
C++ (Qt)
SerialPort::SerialPort(QObject *parent)
   : QObject(parent)
   , d_ptr(SerialPortPrivate::create(this))
{
}
 

В общем, зацени наметаным глазом, если будет время (желательно побыстрее).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 05, 2011, 21:41
Можно и так. А можно реализацию этого SerialPortPrivate::create кинуть в платформенные cpp-файлы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 05, 2011, 23:38
Цитировать
Там изменения коснулись только приватных классов SerialPortPrivate и SerialPortNotifier.
Теперь классы SerialPortPrivate и  SerialPortNotifier являются абстрактными, и имеют статический метод create(),
который создает наследников SerialPortPrivate и SerialPortNotifier в зависимости от платформы.

.е. наследниками являются WinSerialPortPrivate, UnixSerialPortPrivate  и т.п., WinSerialPortNotifier , UnixSerialPortNotifier и т.п.


А почему не выбрали для всех архитектур одно имя? Зачем так сложно: абстрактный класс, наследование, статический метод? API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 06, 2011, 10:39
А почему не выбрали для всех архитектур одно имя? Зачем так сложно: абстрактный класс, наследование, статический метод? API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.
В принципе, можно и так. Но... У всех приватных классов есть общие данные. Логично их вынести в общий предок, чтобы не дублировать код. А виртуальные методы были сделаны для того, чтобы добавить немного контроля над реализациями...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 06, 2011, 11:37
Цитировать
У всех приватных классов есть общие данные. Логично их вынести в общий предок, чтобы не дублировать код.

Да, с этим согласен. Общие данные нужно вынести конечно

2 b-s-a: А эти данные общие для SerialPortPrivate и SerialPortNotifier или у этих классов свои данные?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 06, 2011, 13:06
Notifier, я так понимаю, входит в состав Private в виде члена. Не помню точно, но кажется он платформозависимый.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 06, 2011, 13:33
Цитата: pastor
API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.
так оно и было (есть)

Цитата: b-s-a
Notifier, я так понимаю, входит в состав Private в виде члена. Не помню точно, но кажется он платформозависимый.
Именно.

Ну так что, годится новая структура?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 06, 2011, 15:38
Цитата: pastor
API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.
так оно и было (есть)

так зачем наследование и метод create()?


upd: Заглянул в исходники. Несовсем так. Имена классов для различных платформ не одинаковое.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 06, 2011, 17:25
Цитата: pastor
так зачем наследование и метод create()?
Затем, что приватные классы для каждой платформы наследуются от одного базового приватного класса, который содержит одинаковые параметры для любой
платформы (например, скорость, четность и т.п.).
Но каждая платформа, наследуясь от базового класса привносит свои параметры.

Поэтому метод create() создает экземпляр нужного приватного класса для даной платформы.
Если б не было этого метода, то
Код
C++ (Qt)
SerialPort::SerialPort(QObject *parent)
   : QIODevice(parent)
   , d_ptr(new SerialPortPrivate(this))
{}
 
создавал бы базовый класс SerialPort, а не тот что реально нужен (SerialPort для винды - WinSerialPort).

Цитата: pastor
upd: Заглянул в исходники. Несовсем так. Имена классов для различных платформ не одинаковое.
В смысле?

ЗЫ: и парни, разберитесь досконально в исходниках, перед тем как что-то советовать (это камень к пастору) :).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 06, 2011, 21:38
pastor, имена разные для того, чтобы путаницы при отладке не было. Да и чтобы парсеры IDE сильно не насиловать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 07, 2011, 00:27
ЗЫ: и парни, разберитесь досконально в исходниках, перед тем как что-то советовать (это камень к пастору) :).

Совершенно необоснованный ничем камень в мою сторону. Я так понимаю b-s-a понял очем речь. При одинаковых именах отпадает надобность в методе create() и впринципе в наследовани. Но это всего другой подход к решению одной и тойже задачи.

ЗЫ: А исходники я конечно смотрел.

Вот короткая иллюстрация:

serialport_p.h

Код
C++ (Qt)
class SerialPortPrivate
{
public:
   // some common methods
...
#ifdef Q_WS_WIN
  //some windows specified methods
#endif
#ifdef Q_WS_MAC
  //some mac specified methods
#endif
#ifdef Q_WS_X11
 //some unix specified methods
#endif
....
private:
   // some common data
};

В  файле serialport.cpp будет находится общая для всех платформ реализация методов.
В фалах serialport_win.cpp, serialport_mac.cpp, serialport_unix.cpp будет находиться реализация этих методов для каждой платформы

Ну и наконец

Код
C++ (Qt)
SerialPort::SerialPort(QObject *parent)
   : QIODevice(parent)
   , d_ptr(new SerialPortPrivate(this))
{}

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

В качестве примера можно рассмотреть qthread класс.

ЗЫЫ: Чтобы не перегружать serialport_p.h специфическими для платформы вспомогательными методами, их можно вынести в соотвествующее cpp файлы и оформить как статические функции.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 07, 2011, 00:42
pastor, имена разные для того, чтобы путаницы при отладке не было. Да и чтобы парсеры IDE сильно не насиловать.

Путаницы и сложности отладки я ненаблюдал, но снова таки дело вкуса.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 07, 2011, 09:47
2 pastor,
да, я понял твою мысль.
Но, увы, там будут не только платформоспецифичные методы, но и переменные.
Поэтому всё усложнится и загромоздится, если все сваливать в один заголовочный файл.
Поэтому, лучше всё это разделить на несколько заголовков.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 07, 2011, 12:33
В принципе, можно все слить в cpp платформы... Но на мой взгляд это не очень практично.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 07, 2011, 13:20
Ну так как сделать то? :)
Я склоняюсь к варианту всё разделить (например, так сделаны Qt4 классы: евент диспетчер и т п.).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 07, 2011, 17:14
Мне разделенный вариант тоже нравится больше. Так как каши меньше - не люблю огромные исходники.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 07, 2011, 21:40
Блин, с разделением тоже не все гладко.
Проблема с методами:
Код
C++ (Qt)
bool SerialPortPrivate::canReadNotification()
{
#if defined (Q_OS_WINCE)
   QMutexLocker locker(&m_readNotificationMutex);
#endif
 
   Q_Q(SerialPort);
...
...
emit q->readyRead();
...
...
}
 
bool SerialPortPrivate::canWriteNotification()
{
#if defined (Q_OS_WINCE)
   QMutexLocker locker(&m_writeNotificationMutex);
#endif
...
...
}
 

т.е. если методы принадлежат классу SerialPortPrivate, то этот класс не видит
члены m_writeNotificationMutex, m_readNotificationMutex которые являются платформоспецифичными (для вин це)
и реально находятся в классе наследнике WinSerialPortPrivate.

если же эти методы перенести в WinSerialPortPrivate, то перестает работать макрос  Q_Q(SerialPort); ,
и выдает ошибку на emit q->readyRead();

Вот засада.  :-\

И теперь склоняюсь к мнению pastor-а, чтобы не делать наследование, а впихнуть всё в один заголовочный файл с делением дефайнами,
а уже реализацию оставить в разных cpp файлах.  ::)

ЗЫ: я приаттачил редактированную версию в которой проявляется проблема. (компилить пока на Linux)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 07, 2011, 22:10
Но, увы, там будут не только платформоспецифичные методы, но и переменные.
Поэтому всё усложнится и загромоздится, если все сваливать в один заголовочный файл.

Можно сделать в этом случае вот как:

Код
C++ (Qt)
class SerialPortPrivateData;
 
class SerialPortPrivate
{
public:
   // some common methods
...
private:
   // some common data
   SerialPortPrivateData *m_data;
};

В SerialPortPrivateData будут "сложены" все переменные класа и методы каждой платформы в отдельности.

И каждый платформенный cpp будет иметь свое объявление и реализацию SerialPortPrivateData.

В таком случае иы измежим нагромождение дефайнов с хэдере.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 07, 2011, 22:20
2 pastor,
ну так это уже получается что m_data имеет тот же эквивалент, что и engine в исходниках Qt4 для сокетов и пр. классов. Не?
А если это так - то мы же (b-s-a) был против такого деления (хотя я был не против :) ).
Т.е. через engine бла сделана версия библиотеки 0.4.0 и master ветка.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 07, 2011, 23:06
Ну я бы неназвал это engine. Скорее это приватные данные приватного класса ))


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 08, 2011, 10:13
Ну я бы неназвал это engine. Скорее это приватные данные приватного класса ))
Кинь, если не затруднит, твой примерчик с приватными данными, применительно к реальной реализации.,
т.е. с набором тех методов и членов, которые ты бы сунул в эти приватные данные.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 08, 2011, 12:36
Кинь, если не затруднит, твой примерчик с приватными данными, применительно к реальной реализации.,
т.е. с набором тех методов и членов, которые ты бы сунул в эти приватные данные.

Ок


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Октябрь 08, 2011, 13:44
Можно как-то так


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 08, 2011, 19:15
Я посмотрел. Спасибо за идейку.
Думаю объединить мнения всех трех сторон: твое, пастор, б-с-а и мое.

И в итоге сделаю что-то среднее. Уже есть идея как реализовать.
Попожжа скину результат ниже.

Думаю, что оно будет самое то!

PS:
Вот, прикрепил готовый компилябельный (под Win/WinCE/Linux/Symbian) проект, со всеми пожеланиями.
Конечно, нужно кое что подрихтовать (например методы canWriteNotification() и т.п.) - но это мелочи.

Блин, накосячил при упаковке: не добавил директорию include. Но теперь перезалил проект.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 09, 2011, 16:45
Я не понял, зачем SerialPortNotifier сделан отдельным классом? Почему те методы и атрибуты нельзя сразу включить в SerialPortEngine? И вообще, зачем он нужен? Т.е. не привносит ли он что-либо ненужное, что слишком далеко находится от изначальной идеологии QIODevice?
Дальше, QIODevice изначально работает в неблокирующем режиме. Поэтому, зачем нужны методы setDataInterval() и setReadTimeout()?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 09, 2011, 18:59
Цитировать
Я не понял, зачем SerialPortNotifier сделан отдельным классом? Почему те методы и атрибуты нельзя сразу включить в SerialPortEngine? И вообще, зачем он нужен? Т.е. не привносит ли он что-либо ненужное, что слишком далеко находится от изначальной идеологии QIODevice?
Согласен, выкину его вообще.
Просто написал его от балды, типо чтоб понятно было, что эти методы от нотификатора, а вон те от енжины,

Цитировать
Дальше, QIODevice изначально работает в неблокирующем режиме. Поэтому, зачем нужны методы setDataInterval() и setReadTimeout()?
Ну, с setDataInterval() согласен, оно не нужно в принципе.
А вот  setReadTimeout() пусть останется, т.к. для QIODevice  есть флаг Unbuffered,
и я подразумевал, что в Unbuffered режиме (когда отключен внутренний буфер класса) можно
читать с таймаутами из порта (в блокирующем режиме).
Ну незнаю, кому-то оно необходимо (не факт что всех устроит неблокирующий режим), так что пусть setReadTimeout() останется.

ЗЫ: Ну а так, в целом, годится такая архитектура?
Т.к. удачно она решила проблему с некоторыми вещами и упростила.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: b-s-a от Октябрь 09, 2011, 20:10
А вот  setReadTimeout() пусть останется, т.к. для QIODevice  есть флаг Unbuffered,
и я подразумевал, что в Unbuffered режиме (когда отключен внутренний буфер класса) можно
читать с таймаутами из порта (в блокирующем режиме).
Ну незнаю, кому-то оно необходимо (не факт что всех устроит неблокирующий режим), так что пусть setReadTimeout() останется.
Unbuffered - как я понял, это аналог опции O_SYNC у функции open стандарта POSIX. Т.е. данные идут на диск напрямую, минуя внутренние кэши.
Предлагаю, полностью отказаться от блокирующего режима для SerialPort. Так как это реализуется довольно просто.
Еще раз повторяюсь, блокирующий режим не достаточно точно работает, для меня. Например, мне необходимо отправить 1 байт с четностью Mark, затем дождаться отправки данных (но менее 5 мс), затем переключить порт в режим четности Space и отправить еще N байт. Затем дождаться фактической отправки всех данных (ОС с достаточно точностью это не поддерживают, на сколько я понял), затем ждать не более 20 мс первый байт ответа. Если он пришел, то ждать остальные. Между байтами интервал не более 5 мс.

Лично мне непонятно, зачем делать приватный класс для приватного класса?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 09, 2011, 21:23
2 b-s-a

Цитировать
Предлагаю, полностью отказаться от блокирующего режима для SerialPort.
Ладно, хрен с ним, выкинуть не вопрос.

Цитировать
Так как это реализуется довольно просто.
Пример в студию.

Цитировать
Лично мне непонятно, зачем делать приватный класс для приватного класса?
Engine реализует нативный (платформо-зависимый) интерфейс, а также обеспечивает нотификацию, т.е. весь функционал в одном классе "движок", т.е. оно должно быть от QObject!!!

Теперь, SerialPort (не от QObject) предоставляет вспомогательный общий функционал (всякие промежуточные методы), а также связывает SerialPort и Engine. Это сделано для того чтобы не придумывать что-то свое, а взять готовую реализацию вспомогательных\промежуточных методов из сокетов и тупо их скопипастить, т.к. они уже проверены и отработаны годами.

Опять же, кроме как из сокетов, примеров больше взять неоткуда, ну нет в Qt4 больше классов с аналогичной функциональностью (есть жалкий аналог - это QProcess, но он не то). 
А если делать самому с нуля - то нужно дофига чего учитывать и не факт, что оно потом заработает как надо.

Предложи свой реальный компилябельный вариант "без приватных классов для приватных классов", а не просто на словах (хотя бы для одной платформы).

И допили для линукса обработку ошибок паритета, фрейма и политик.
Раз ты предложил эти методы - то тебе и флаг. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 09, 2011, 23:52
Пример в студию.
Код
C++ (Qt)
QByteArray ret;
while(qint64 remains = size - ret.size()) {
   serial.waitForReadyRead(-1);
   ret += serial.read(remains);
}
return ret;
Т.е. это простейший вариант блокирующего чтения.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 10, 2011, 10:58
И допили для линукса обработку ошибок паритета, фрейма и политик.
Раз ты предложил эти методы - то тебе и флаг. :)
Жду, когда ты закончишь с реструктуризацией проекта, чтобы потом конфликты судорожно не решать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 10, 2011, 21:29
Ну вроде я закончил, см. gitorious


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 13, 2011, 12:11
При реализации поддержки политик обработки ошибок четности возникли некоторые сложности.
Во-первых, надо каким-то образом хранить информацию о местах ошибок в данных. Вариантов вижу не много - только 2. Первый вариант - хранение в виде, в котором они поступают со стороны Unix (ошибки и 255 экранируются кодом 255). Второй вариант - хранить список позиций ошибок в отдельном списке (гиморней делать, но быстрее будет работать).
Во-вторых, текущий вариант чтения не подходит, так как в *nix можно потерять второй байт данных в случае ошибки (когда экранирующий символ будет считан в буфер, а сами данные уже не поместятся в буфер).
В-третьих, QIODevice производит предварительное чтение данных в свой внутренний буфер. Ориентируется на bytesAvailable(). Думаю, необходимо будет отключить эту фичу, иначе будет проблема с тем видом ошибок.
В-четвертых, может ввести булевый метод parityError(), который будет принимать значение true, если последняя операция чтения завершилась из-за ошибки четности.
Итак, решение я вижу следующее:
1. добавить в engine метод чтения по одному байту: char nativeGetChar(bool *ok)
2. добавить внутренний буфер чтения и список положений сбойных байтов
3. побайтное чтение использовать только для случая StopReceivingPolicy
4. способ чтения должен выбирать класс SerialPortPrivate в зависимости от настроек (если четность есть и выбрана StopReceivingPolicy, то чтение по байтам через буфер, иначе - блоками напрямую)
4. попробовать принудительно выставлять флаг Unbuffered при вызове QIODevice::open(), чтобы отключить встроенную буферизацию.

Я только одного не понял, зачем нужны публичные методы с пиставкой native? Логичнее было бы, чтобы они были защищенными, а публичными были без этой приставки. А то лишняя какая-то писанина получается. Понятно что engine - это и так нативная реализация под конкретную платформу...

Жду конструктивную критику предложенного.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 13, 2011, 21:20
Цитировать
Во-первых, надо каким-то образом хранить информацию о местах ошибок в данных. Вариантов вижу не много - только 2. Первый вариант - хранение в виде, в котором они поступают со стороны Unix (ошибки и 255 экранируются кодом 255). Второй вариант - хранить список позиций ошибок в отдельном списке (гиморней делать, но быстрее будет работать).
А зачем хранить эту информацию о местах ошибок? Т.е. ты планируешь добавить еще какой-то метод для получения списка этих позиций/мест?
Что это дает?
Не проще ли при обнаружении (при чтении) просто устанавливать в переменную ошибки последнее значение ошибки,
типа: ошибка паритета, ошибка фрейма и т.п?

Цитировать
В-третьих, QIODevice производит предварительное чтение данных в свой внутренний буфер. Ориентируется на bytesAvailable(). Думаю, необходимо будет отключить эту фичу, иначе будет проблема с тем видом ошибок.
А на что влияет bytesAvailable()? Оно сбрасывает ошибки или что?

Ведь можно сделать аналогично тому, как я сделал в винде, алгоритм примерно такой:

1. Если у нас установлена любая политика не равная "игнорировать", то в методе
WinSerialPortEngine::read(char *data, qint64 len) , когда приходит время читать, параметру len присваивается 1.
И метод read() читает ровно 1 байт.

2. Есть еще виндовый нотификатор, который кроме событий EV_RXCHAR и EV_TXEMPTY, отлавливает и EV_ERR.

3. Есть еще булевая переменная m_flagErrorFromCommEvent, которая устанавливается в true при возникновении любой ошибки по евенту EV_ERR
и сбрасывается в методе WinSerialPortEngine::read() после чтения и анализа байта.

Так вот, как это все работает:
при приходе в UART "битого" байта, срабатывает сначала нотифир по евенту EV_ERR (ХЗ почему, но вроде в винде оно так получается ) и устанавливает
через SerialPortPrivate::canErrorNotification() => m_engine->processIOErrors() одновременно в переменную ошибок - тип ошибки,
а также делает m_flagErrorFromCommEvent = true.
Далее, в этом же нотифире на этот же байт срабатывает событие  EV_RXCHAR и автоматом вызывается метод чтения,
через SerialPortPrivate::canReadNotification() => readFromPort() => read() => nativeRead().
Далее в nativeRead() смотрим: если политика есть "не игнорировать", то читаем один байт и далее,
смотрим: а булева переменная m_flagErrorFromCommEvent == true ?
И если да - то смотрим, а какая же политика установлена: SkipPolicy, PassZeroPolicy, StopReceivingPolicy
и в зависимости от того, какая политика - мы просто либо подменяем прочитанный байт на ноль либо еще что - то и т.п.
и в конце этого дела мы сбрасываем m_flagErrorFromCommEvent = false.

Т.к. все эти действия: нотификация по  EV_ERR, а потом по EV_RXCHAR происходят в одном потоке, то по идее, они должны и
соответствующие методы выполнять по порядку, т.е. сначала фиксируется факт ошибки, а потом происходит чтение байта.

Так вот, можно было б и что-то аналогичное для *nix сделать:
аналогом нотифира ошибок сделать QSocketNotifier(), настроенный на отлов ошибок.
Но тут проблема: неизвестно, реагирует ли он на ошибки паритета и фрейма,
и если даже и реагирует - то быстрее чем такойже нотифир но на событие о приходе байта?

Цитировать
В-четвертых, может ввести булевый метод parityError(), который будет принимать значение true, если последняя операция чтения завершилась из-за ошибки четности.
Итак, решение я вижу следующее:
1. добавить в engine метод чтения по одному байту: char nativeGetChar(bool *ok)
2. добавить внутренний буфер чтения и список положений сбойных байтов
Попробуй, т.к. я не особо понимаю как в *nix поймать ошибки четности и паритета.

Но насчет введения nativeGetChar(), а почему прочто не выставлять в методе nativeRead() размер = 1?

Цитировать
3. побайтное чтение использовать только для случая StopReceivingPolicy
А почему не сделать побайтное чтение для всех политик не равных "игнорировать"?

Цитировать
4. способ чтения должен выбирать класс SerialPortPrivate в зависимости от настроек (если четность есть и выбрана StopReceivingPolicy, то чтение по байтам через буфер, иначе - блоками напрямую)
4. попробовать принудительно выставлять флаг Unbuffered при вызове QIODevice::open(), чтобы отключить встроенную буферизацию.
Ну так если отключить буферизацию, то отключится и асинхронное чтение и (вроде так оно сейчас там сделано, т.е. если флаг m_isBuffered == true,
то вызывается SerialPortPrivate::readFromPort ).

Цитировать
Я только одного не понял, зачем нужны публичные методы с пиставкой native? Логичнее было бы, чтобы они были защищенными, а публичными были без этой приставки. А то лишняя какая-то писанина получается. Понятно что engine - это и так нативная реализация под конкретную платформу...
Ок, убрал все упоминания о "native" :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 13, 2011, 23:10
А разве под Windows нельзя задать работу порта в режиме игнорирования, зануления и пропуска битых данных? Просто под *nix это можно сделать через настройки порта.
Дальше, отлов ошибок четности/фрейма под *nix возможен только в виде, когда перед сбойным байтом посылается байт 255 (и перед 255 тоже посылается): 255 0 - пришел 0 с ошибкой четности или фрейма (они не отличаются), 255 255 - пришел нормальный байт 255.

Почему я предложил getChar, так просто потому, что она позволяет получить информацию о битости данных. А в остальных случаях контроля ошибок все будет делать система.

Для реализации адекватной работы эмуляции четности mark/parity необходимо точное ожидание (именно на его основе необходимо делать реализацию метода flush, так как tcdrain и аналог под Windows работают с неадекватной точностью, поэтому данные прутся с ужасными промежутками - на осциллографе очень хорошо видно). Для этого был сделано изменение в QThread::usleep()/QThread::msleep(): https://qt.gitorious.org/qt/qt/merge_requests/1420 Поддержите по возможности. Кстати, критика приветствуется.
Цитировать
Ну так если отключить буферизацию, то отключится и асинхронное чтение и (вроде так оно сейчас там сделано, т.е. если флаг m_isBuffered == true,
то вызывается SerialPortPrivate::readFromPort ).
Что-то я эту область кода не заметил. Зачем оно нужно вообще? По идее, это реализует сам QIODevice. И я долго занимался сексом с отладчиком, пока не понял, что давая команду чтения одного байта, QIODevice вызывает readData для всего доступного на чтение.
Асинхронное чтение мне вообще не понятно. Зачем? По идее, все это делает ОС. Зачем дублировать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 14, 2011, 09:40
Цитировать
А разве под Windows нельзя задать работу порта в режиме игнорирования, зануления и пропуска битых данных? Просто под *nix это можно сделать через настройки порта.
Можно, но я выше в топиках уже писал, что оно работает как-то странно, т.е. через одно место и приходится эмулировать вот таким образом.
см http://www.prog.org.ru/index.php?topic=9537.msg127752#msg127752
пост №565

Цитировать
Для этого был сделано изменение в QThread::usleep()/QThread::msleep(): https://qt.gitorious.org/qt/qt/merge_requests/1420 Поддержите по возможности. Кстати, критика приветствуется.
ОК, гляну.

Цитировать
Что-то я эту область кода не заметил. Зачем оно нужно вообще? По идее, это реализует сам QIODevice. И я долго занимался сексом с отладчиком, пока не понял, что давая команду чтения одного байта, QIODevice вызывает readData для всего доступного на чтение.
Ну да, на все 16386 (или сколько там)  :)

Цитировать
Асинхронное чтение мне вообще не понятно. Зачем? По идее, все это делает ОС. Зачем дублировать?
в смысле? о чем ты?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 14, 2011, 15:50
Я про это
Ну так если отключить буферизацию, то отключится и асинхронное чтение и (вроде так оно сейчас там сделано, т.е. если флаг m_isBuffered == true,
то вызывается SerialPortPrivate::readFromPort ).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 14, 2011, 16:56
Ну, все правильно.
Под асинхронным чтением я имею ввиду автоматическое чтение в буфер самого класса при появлении данных в UART.
Т.е. асинхронное == автоматическое  ;D
Я не так выразился.

Цитировать
Что-то я эту область кода не заметил. Зачем оно нужно вообще? По идее, это реализует сам QIODevice.
Не реализует он это! Поэтому метод readFromPort() введен именно для автоматического чтения из UART в буфер класса при буферизованном режиме.
И если этот буф. режим отключить, то ничо в буфер класса читаться не будет.

Тем более, readFromPort() придуман не мной, а троллями (точнее метод readFromSocket() ), так что выкинуть его не получится.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Октябрь 14, 2011, 23:14
Ничего не понял... :(
Зачем это вообще нужно?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 15, 2011, 08:57
Ничего не понял... :(
Зачем это вообще нужно?
посмотри исходники сокетов и поймеш  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Октябрь 29, 2011, 12:32
Скажите пожалуйста: я попытался скомпилировать библиотеку на qt 4.4.1 и ничего не вышло, выдалось такое сообщение:
Код:
C:/Qt/projects/qserialdevice-qserialdevice-master_new/qserialdevice-qserialdevice/src/qserialdevice/abstractserial_p.h:43: 
error: 'const struct QList<QByteArray>' has no member named 'length'


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Странник от Октябрь 29, 2011, 13:51
Скажите пожалуйста: я попытался скомпилировать библиотеку на qt 4.4.1 и ничего не вышло, выдалось такое сообщение:
Код:
C:/Qt/projects/qserialdevice-qserialdevice-master_new/qserialdevice-qserialdevice/src/qserialdevice/abstractserial_p.h:43: 
error: 'const struct QList<QByteArray>' has no member named 'length'
ну вы б еще на 4.0 собирали = ) метод QList::length() только в 4.5 появился. если обновиться никак - можете попробовать заменить length() на size() или count(). но очень не факт, что еще что-нибудь не вылезет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Октябрь 31, 2011, 19:14
Скажите,а есть что нибудь так сказать менее требовательное к версии библиотеки...реализующее лишь функции приема и отправки, ну и задание скорости соединения...(желательно что бы поддерживалась 921600)...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Странник от Октябрь 31, 2011, 21:32
Скажите,а есть что нибудь так сказать менее требовательное к версии библиотеки...реализующее лишь функции приема и отправки, ну и задание скорости соединения...(желательно что бы поддерживалась 921600)...
нужно кроссплатформенное решение? из альтернатив знаю только QextSerialPort, но он тоже под 4.5 и старше. по крайней мере, был - может ситуация и изменилась. но я вам категорически советую обновиться.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 01, 2011, 08:30
к сожалению нет возможности...а так давно бы,неужели патовая ситуация...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Странник от Ноябрь 01, 2011, 08:47
к сожалению нет возможности...а так давно бы,неужели патовая ситуация...
есть вариант реализовать поддержку <4.5 самостоятельно, не так это и сложно. насколько я помню, ничего экстраординарного не добавили.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 01, 2011, 09:10
хм..а как это сделать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 01, 2011, 09:27
>> хм..а как это сделать?

Попробовать собрать под вашу Qt4, посмотреть на что жалуется компилятор, исправить его жалобы. ВСЁ!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Странник от Ноябрь 01, 2011, 09:31
хм..а как это сделать?
ну вот вывалил вам компилятор ошибку, не знает метода QList::lenght:
Цитировать
C:/Qt/projects/qserialdevice-qserialdevice-master_new/qserialdevice-qserialdevice/src/qserialdevice/abstractserial_p.h:43:
error: 'const struct QList<QByteArray>' has no member named 'length'
открываете документацию по последней версии библиотеки, смотрите, что этот QList::lenght() делает:
Цитировать
int QList::length () const
This function is identical to count().
This function was introduced in Qt 4.5.
See also count().
ага, тут все просто - есть аналогичная функция count(). меняем length() на count(), пробуем собрать. можно отписать автору библиотеки, чтобы не выпендривался и использовал более совместимые методы <= )


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 01, 2011, 15:44
kuzulis, в версии 2.0 предлагаю заменить всякие saveOldsettings на более вменяемую структуру:
1. при открытии порта текущие настройки ВСЕГДА сохраняются.
2. есть метод, который позволяет отключить восстановление исходных настроек при закрытии порта (свойство инициализируется значением "восстанавливать" в конструкторе, меняется только этим методом).
3. если свойство восстановления включено, то при закрытии настройки порта восстанавливаются
4. если при открытии порта не удалось загрузить текущие настройки, значит это не последовательный порт и дальнейшая работа невозможна.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 01, 2011, 16:58
Сделал MR:
Исправлена ошибка реализаций bytesAvailable/bytesToWrite - необходимо было вызывать методы базового класса.
Исправлен ряд ошибок связанных с эмуляцией mark/space
Добавлена базовая поддержка для DataErrorPolicy (кстати, под windows она не реализована)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 01, 2011, 17:20
>> хм..а как это сделать?

Попробовать собрать под вашу Qt4, посмотреть на что жалуется компилятор, исправить его жалобы. ВСЁ!
Ввиду невеликого опыта программирования в QT это тоже не самое простое...можно я у вас буду спрашивать,возникающие вопросы?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 01, 2011, 21:03
Цитата: b-s-a
Сделал MR:
Ок, я слил.
Теперь у меня в проекте появился статус merged (оказывается эти статусы можно создавать самому,
меняя настройки проекта!).
Вот только почему-то твой MR так и остался висеть. Должно так быть или нет - я хз.

Цитата: b-s-a
кстати, под windows она не реализована
в смысле? я ж вроде реализовывал.

Цитата: b-s-a
если при открытии порта не удалось загрузить текущие настройки, значит это не последовательный порт и дальнейшая работа невозможна.
Ну не знаю. До этого мне кто-то доказывал (по электронке вроде), что если при открытии не удалось получить настройки - то это не критично, поэтому я и сделал так как есть на текущий момент.
Хотя, ранее было именно так как ты говоришь.

И приведи примерчик насчет более вменяемой структуры и т.п. , а то я могу не так понять :)

Цитата: Edynchik
Ввиду невеликого опыта программирования в QT это тоже не самое простое...можно я у вас буду спрашивать,возникающие вопросы?
Да. Но желательно переходить в будущем на ветку 2.0, т.к. предыдущую уже не охота поддерживать.  ::)




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 02, 2011, 11:26
И приведи примерчик насчет более вменяемой структуры и т.п. , а то я могу не так понять :)
Я же уже привел...
Добавляем методы:
bool restoreSettingsOnClose() const;
void setRestoreSettingsOnClose(bool value);

Добавляем свойство в класс SerialPortPrivate: bool m_restoreSettingsOnClose;
В конструктор добавляем его инициализацию значением true.
в метод open добавляем сохранение текущих настроек. И копирование структур (current -> old).
В метод close добавляем условное восстановление настроек по флагу m_restoreSettingsOnClose.

И не делай методы с именами restoreOldsettings()/saveOldsettings(). Я минут 15 втыкал, что это такое (я уж не говорю об ошибке именования - после Old должна быть большая буква S).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 03, 2011, 23:02
b-s-a,
OK, я переделал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Ноябрь 09, 2011, 16:39
Пытался собрать библиотеку под Visual Studio 2008 express:
qmake -tp vc BuildLibrary.pro
но после запуска получившегося проектного файла открывается пустое решение, без проектов.
как собрать библиотеку? Спасибо...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Странник от Ноябрь 09, 2011, 16:56
Пытался собрать библиотеку под Visual Studio 2008 express:
qmake -tp vc BuildLibrary.pro
но после запуска получившегося проектного файла открывается пустое решение, без проектов.
как собрать библиотеку? Спасибо...
любопытно, у меня на VS2008 Pro отлично все собралось.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Ноябрь 09, 2011, 17:03
а какую ты версию собирал? я 0.4.0...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Ноябрь 09, 2011, 17:45
собрал с помощью cmake, все работает...Спасибо...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Странник от Ноябрь 09, 2011, 19:05
а какую ты версию собирал? я 0.4.0...
если что, я 2.0 собирал - с ней проблем не предвидится)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 26, 2011, 22:35
Доброго всем времени.

Люди, как кто считает, пора ли делать документацию для ветки 2.0?
И если да, то в каком виде: стиль Doxygen или QDoc ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Prm от Ноябрь 28, 2011, 09:37
До сих пор пользовался Doxygen-версией. В принципе, все устраивает (скажу больше - все классно). Но если у автора есть желание освоить новые горизонты - документация в формате QDoc не повредит.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 28, 2011, 09:43
Цитировать
Но если у автора есть желание освоить новые горизонты - документация в формате QDoc не повредит.
Просто хочется, чтобы документацию можно было "интегрировать" в ассистент
и чтобы она придерживалась Qt-шного стиля и чтобы,
к примеру, работали клики по ссылкам на Qt-шные классы.

Раз уж библиотека для Qt, то и документация должна быть тоже в QDoc...
Штоб уж интегрировать - так интегрировать. Не?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 28, 2011, 10:26
голосую за qdoc


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pastor от Ноябрь 28, 2011, 14:52
Я за QDoc


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 28, 2011, 23:51
Ок. Я начал добавлять комментарии.
У кого есть желание - можете присоединяться, помогать, критиковать.

А лучше - создать сопутствующие файлы конфигурации для QDoc и т.п.,
а то я не в теме как там и что нужно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 29, 2011, 16:54
Как проявляется зависание? Какая ОС? Стандартный ли COM порт или нет, если нет то какой? Какая версия библиотеки? Приведи минимальную программу, которая воспроизводит проблему.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 29, 2011, 16:56
Скажите,а в чем может быть причина зависания машины при чтении с использованием библиотеки?
версия библиотеки 0.1.0,ввиду qt4.4.1
Код
C
   AbstractSerial *serialDevice = new AbstractSerial("/dev/ttyS2");
   bool ret = serialDevice->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
   serialDevice->setBaudRate(AbstractSerial::BaudRate115200);
   serialDevice->setDataBits(AbstractSerial::DataBits8);
   serialDevice->setParity(AbstractSerial::ParityNone);
   serialDevice->setStopBits(AbstractSerial::StopBits1);
   serialDevice->setFlowControl(AbstractSerial::FlowControlOff);
   serialDevice->setCharIntervalTimeout(0);//применялось 0,5,50..без результата
   if(ret == true)
       serialDevice->read(buf.data(),buf.size());
   serialDevice->flush();//добавлялось и удалялось..без результата
   serialDevice->reset();////добавлялось и удалялось..без результата
   serialDevice->close();
правда скорость не стандартная,921600..но все таки...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 29, 2011, 16:58
Как проявляется зависание? Какая ОС? Стандартный ли COM порт или нет, если нет то какой? Какая версия библиотеки? Приведи минимальную программу, которая воспроизводит проблему.
машина зависает наглухо,помогает только ребут...порт не стандартный,стоит умножитель скорости на 8...ну и приведенный код срабатывает по таймеру каждые 10 мс...к тому же это бывает только тогда,когда данные есть на порте...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 29, 2011, 20:49
Глухое зависание возможно только из-за проблем аппаратуры или драйверов. Обычное приложение повесить современную систему не может - недостаточно привелегий.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 29, 2011, 21:47
Глухое зависание возможно только из-за проблем аппаратуры или драйверов. Обычное приложение повесить современную систему не может - недостаточно привелегий.
но она же завешивает не сразу,а через различные промежутки времени...притом разные...(установил счетчиком)...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 29, 2011, 23:11
ошибки в программах бывают разные. Какие-то сразу проявляются, какие-то через некоторое время. А какие-то вообще иногда при определенной фазе луны...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 30, 2011, 09:02
притом что если отключить источник данных то все норм, т.е. порт открывается,настраивается, читает данные(их нет), закрывает...и не зависает...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 30, 2011, 10:04
Цитата: Edynchik
Скажите,а в чем может быть причина зависания машины при чтении с использованием библиотеки?
версия библиотеки 0.1.0,ввиду qt4.4.1
Хоспади, ну попробуй поновее версию собрать в своей древней Qt 4.4.1. , например QSerialDevice 2.0 (желательно).
И покажи сюда лог ошибок при сборке. Можно попробоватьисправить.

Но не факт, что оно заработает, т.к. в классе QIODevice от версии 4.4 до 4.7 сильно изменилась имплементация методов read/write.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: Edynchik от Ноябрь 30, 2011, 10:22
Код:
In file included from serialport.cpp:6:
../include/serialportinfo.h:9:35: QtCore/qscopedpointer.h: оЕФ ФБЛПЗП ЖБКМБ ЙМЙ ЛБФБМПЗБ
In file included from serialport.cpp:6:
../include/serialportinfo.h:53: error: 'QScopedPointer' is used as a type, but
is not defined as a type.
../include/serialportinfo.h: In member function `SerialPortInfoPrivate*
SerialPortInfo::d_func()':
../include/serialportinfo.h:29: error: `d_ptr' undeclared (first use this
function)
../include/serialportinfo.h:29: error: (Each undeclared identifier is reported
only once for each function it appears in.)
In file included from serialport_p.h:9,
from serialport.cpp:7:
ringbuffer_p.h: In member function `const char*
RingBuffer::readPointerAtPosition(long long int, qint64&) const':
ringbuffer_p.h:44: error: `length' undeclared (first use this function)
вот такие ошибки...
к тому же я использовал вот эту библиотеку(не вашу), такой же результат...полный завис...
может и в вашей библиотеки, и в той которую я тоже использовал можно проставить какой-нибудь таймаут т.к. проблемы одни и те же...
потому что более опытного человека по работе с последовательными портами мне кажется на форуме нет...

length() исправил на size(), а что делать с QScopedPointer?


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: b-s-a от Ноябрь 30, 2011, 10:31
к тому же я использовал вот эту библиотеку(не вашу), такой же результат...полный завис...
может и в вашей библиотеки, и в той которую я тоже использовал можно проставить какой-нибудь таймаут т.к. проблемы одни и те же...
Я тебе уже указал на список истинных виновников происходящего.
Какие таймауты? Данная библиотека даже и не пытается читать, если данных нет (bytesAvailable() вернула 0).


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: Edynchik от Ноябрь 30, 2011, 10:34
Я тебе уже указал на список истинных виновников происходящего.
Какие таймауты? Данная библиотека даже и не пытается читать, если данных нет (bytesAvailable() вернула 0).
просто как то не хочется приговаривать железо :(
к тому же,если на порт повесить Commi(com-терминал)...он то не зависает...


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: b-s-a от Ноябрь 30, 2011, 13:10
к тому же,если на порт повесить Commi(com-терминал)...он то не зависает...
ты не железо приговаривай. а драйвер попробуй обновить. Или, в крайнем случае, свяжись с производителем драйвера и сообщи об ошибке.
А твой Commi может работать например потому, что не использует некоторые функции, которые использует данная библиотека. Или он их использует иначе...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Ubuntu_linux от Ноябрь 30, 2011, 13:21
А возиожна ли работа на emdeb linux?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 30, 2011, 13:49
А почему бы и нет? Если там Qt работает, то и эта либа будет. Попробуй.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 30, 2011, 14:52
Добавил в комметарии к классу SerialPort 2.0 его описание.
Посмотрите кто-нить, кому не лень, что туда еще добавить, что исправить и т.п.
А может и грамматические ошибки пофиксить, а то я с инглишем через гуглтранслятор только :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 30, 2011, 15:25
Я вот только одного не понял. какое отношение QtSerialPort имеет к сетям (QtNetwork)?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 30, 2011, 15:38
> If you are unsure of the serial port name, for this you can use the class SerialPortInfo to obtain the correct serial port name.
надо вообще переформулировать.
> To check the currently set name, use the method portName()
To retrieve current port name use method portName().

Как-то так.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 30, 2011, 15:40
Да и еще. Попробуй толкнуть эту реализацию на включение в Qt. Только начни с их IRC. Думаю, тебя там направят в нужном направлении.
Кстати, нужно быть готовым некоторое время после включения в Qt осуществлять поддержку данной подсистемы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 30, 2011, 16:06
Цитата: b-s-a
Я вот только одного не понял. какое отношение QtSerialPort имеет к сетям (QtNetwork)?
Никакого. Я там поставил вопросики, типо: а что сюда писать?
Цитировать
надо вообще переформулировать.
Как?
Цитировать
To retrieve current port name use method portName().
Исправил.

Цитировать
Да и еще. Попробуй толкнуть эту реализацию на включение в Qt. Только начни с их IRC. Думаю, тебя там направят в нужном направлении.
Я недавно пробовал что-то подобное. Заходил на IRC на freenode и т.п. Но что-то я не понял как там происходит
процесс разговора, я шумел, шкмел, а мне что-то никто ничо не ответил вообще. :)
Наверное я не туда зашел?
И кстати, раз ты в теме, то не замолвиш словечко там сам сам?  ::)

Цитировать
Кстати, нужно быть готовым некоторое время после включения в Qt осуществлять поддержку данной подсистемы.
Ну я рассчитываю на помощь сообщества, т.к. один не потяну. Семья и все такое...
Хотя, никакой помощи от "сообщества" особо не видать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 30, 2011, 17:07
Все оказалось банально просто, не надо открывать порт 100 раз в секунду...открыл и забил до деструктора....


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 30, 2011, 18:02
Все оказалось банально просто, не надо открывать порт 100 раз в секунду...открыл и забил до деструктора....
:o Не удивительно, что возникли глюки.
Мда... Но драйвер все равно кривой. ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Ноябрь 30, 2011, 20:32
ну вроде как правило хорошего тона, открыл попользовался,закрыл...но не на частоте 100 Гц как оказалось...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 30, 2011, 22:15
Вообще-то, у каждого правила есть своя область применения. Если твоя программа не подразумевает параллельной работы с устройством других программ, то она должна открывать порт и держать открытым все время, что работает с этим устройством. В частности, программа мониторинга должна держать его открытым все время, что работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 02, 2011, 12:14
2 b-s-a,

кстати, я тут посмотрел твою реализацию метода:

qint64 UnixSerialPortEngine::readPerChar(char *data, qint64 maxSize)

и мне что-то стало не понятно: а обрабатываются ли политики при паритетах Even, Odd ?

А то получается, судя по коду, что оно работает только для *nix ОС, не поддерживающих CMSPAR
и только в режимах паритета Mark или Space.

Надо бы подправить, чтобы политики (кроме Ignore) работали при любых паритетах, кроме None,
а то оно как-то наполовину получается.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 02, 2011, 14:28
и мне что-то стало не понятно: а обрабатываются ли политики при паритетах Even, Odd ?
Не работает только политика StopReading. У меня вообще есть сомнения, что она будет работать...
Все остальные политики реализованы средствами ОС.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 02, 2011, 14:32
Цитировать
Не работает только политика StopReading. У меня вообще есть сомнения, что она будет работать...
Все остальные политики реализованы средствами ОС.

Код
C++ (Qt)
bool UnixSerialPortEngine::setDataErrorPolicy(SerialPort::DataErrorPolicy policy)
{
...
}
 
тут реализованы?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 02, 2011, 14:42
Ах, елки, так у тебя ж еще не реализована запись кода ошибки
типа PortError::ParityError (или FramingError), при её обнаружении,
чтобы можно было методом error() просмотреть код последней ошибки,
при необходимости.

Блин, как бы это реализовать?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 02, 2011, 16:48
Цитировать
тут реализованы?
Да.
Цитировать
Ах, елки, так у тебя ж еще не реализована запись кода ошибки
типа PortError::ParityError (или FramingError), при её обнаружении,
чтобы можно было методом error() просмотреть код последней ошибки,
при необходимости.
Под *nix невозможно определить что за ошибка произошла. FramingError и ParityError определяются по одним и тем же признакам... Разве что, когда не используется четность можно предположить FramingError.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 02, 2011, 16:50
В случае политик отличных от StopReading код ошибки вообще нет смысла выставлять. А саму политику реализовать проблематично. я об это уже писал - QIODevice вытянет все данные из порта и закэширует, пользователь даже не узнает, что была ошибка.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 02, 2011, 17:07
Цитировать
Под *nix невозможно определить что за ошибка произошла. FramingError и ParityError определяются по одним и тем же признакам... Разве что, когда не используется четность можно предположить FramingError.
Ну тут ладно, значит только ParityError

Цитировать
А саму политику реализовать проблематично. я об это уже писал - QIODevice вытянет все данные из порта и закэширует, пользователь даже не узнает, что была ошибка.
Ну это я знаю. Но ведь подразумеваем, что по error() возвращается код последней ошибки.

Т.е. даже если QIODevice и вытянет данные, то если они приняты с ошибками - то должен
установиться код этой последней ошибки.

Т.е. логика установки кода ошибок должна быть такой, что следующая ошибка перетирает предыдущую.
Но код NoError должен устанавливать только метод unsetError(),
т.е. сбрасывать ошибку должен сам пользователь тогда когда ему необходимо.
Например, сразу перед началом чтения данных или т.п.

Тогда, если пользователь читает из  QIODevice данные, он может косвенно определить, а битые ли
они хоть в каком либо месте и уже принять какие нить меры: или отказаться от данных или т.п.

Как насчет такого подхода? т.к. я подразумевал и реализовывал именно его.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 03, 2011, 19:05
Я попробовал создать минимальный конфигурационный файл для генерации QDoc документации для библиотеки,
что мог - причесал. Но оно все-равно вываливает кучу ошибок:
Цитировать
[kuzulis@kuzulis doc]$ qdoc3 ./qserialdevice.qdocconf
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1068: Cannot find base function for '\reimp' in open()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1111: Cannot find base function for '\reimp' in close()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1347: Cannot find base function for '\reimp' in reset()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1359: Cannot find base function for '\reimp' in atEnd()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1478: Cannot find base function for '\reimp' in isSequential()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1486: Cannot find base function for '\reimp' in bytesAvailable()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1502: Cannot find base function for '\reimp' in bytesToWrite()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1520: Cannot find base function for '\reimp' in canReadLine()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1542: Cannot find base function for '\reimp' in waitForReadyRead()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1589: Cannot find base function for '\reimp' in waitForBytesWritten()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1696: Cannot find base function for '\reimp' in readData()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1732: Cannot find base function for '\reimp' in readLineData()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1739: Cannot find base function for '\reimp' in writeData()
    [The function either doesn't exist in any base class with the same signature or it exists but isn't virtual.]
/home/kuzulis/git/ng/qserialdevice/src/serialportengine_p_symbian.cpp:5: Cannot find 'SymbianSerialPortEngine' specified with '\class' in any header file
/home/kuzulis/git/ng/qserialdevice/src/serialportengine_p_win.cpp:5: Cannot find 'WinSerialPortEngine' specified with '\class' in any header file
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:660: Cannot link to 'All Modules' in SerialPort
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:660: Cannot link to 'reentrant' in SerialPort
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:660: Cannot link to 'All Modules' in SerialPort
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:660: Cannot link to 'QIODevice::waitForReadyRead()' in SerialPort
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:30: No documentation for 'SerialPort::dataBits'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:34: No documentation for 'SerialPort::dataErrorPolicy'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:35: No documentation for 'SerialPort::dtr'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:37: No documentation for 'SerialPort::error'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:33: No documentation for 'SerialPort::flowControl'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:31: No documentation for 'SerialPort::parity'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:29: No documentation for 'SerialPort::rate'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:38: No documentation for 'SerialPort::restoreSettingsOnClose'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:36: No documentation for 'SerialPort::rts'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:32: No documentation for 'SerialPort::stopBits'
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1359: Cannot link to 'readyRead()' in SerialPort::atEnd()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1486: Cannot link to 'read()' in SerialPort::bytesAvailable()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1520: Cannot link to 'readLine()' in SerialPort::canReadLine()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1111: Cannot link to 'QIODevice::close()' in SerialPort::close()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1327: Cannot link to 'write()' in SerialPort::flush()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1068: Cannot link to 'QIODevice::OpenMode' in SerialPort::open()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1429: Cannot link to 'read()' in SerialPort::readBufferSize()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1445: Cannot link to 'read()' in SerialPort::setReadBufferSize()
/home/kuzulis/git/ng/qserialdevice/src/serialport.cpp:1542: Cannot link to 'QIODevice::readyRead()' in SerialPort::waitForReadyRead()
/home/kuzulis/git/ng/qserialdevice/src/serialportinfo.cpp:12: Cannot link to 'All Modules' in SerialPortInfo
/home/kuzulis/git/ng/qserialdevice/src/serialportinfo.cpp:12: Cannot link to 'All Modules' in SerialPortInfo


Генерил из линукса.

Мог бы кто-нибудь прокомментировать каждую из ошибок?
Т.е. что ему не хватает и т.п..

А еще лучше - пофиктить их!  :)

ЗЫ:
собирать документацию примерно пока еще так:
Цитировать
$ cd qserialdevice/doc
$ export SERIALDEVICE_DIR=/home/kuzulis/git/ng/qserialdevice
$ $ qdoc3 ./qserialdevice.qdocconf
где /home/kuzulis/git/ng/qserialdevice - это путь к исходникам библиотеки

С нетерпением жду помощи!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 04, 2011, 00:54
Подозреваю, что "Cannot find base function for '\reimp' in open()" значит, что ты не указал какому классу принадлежит переопределяемый open().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 04, 2011, 11:26
Не, скорее всего оно не знает из какого базового происходит переопределение - т.е от QIODevice::open().
Наверное нужно как-то где-то это указать - но как - хз.

Далее,
Цитировать
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:30: No documentation for 'SerialPort::dataBits'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:34: No documentation for 'SerialPort::dataErrorPolicy'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:35: No documentation for 'SerialPort::dtr'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:37: No documentation for 'SerialPort::error'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:33: No documentation for 'SerialPort::flowControl'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:31: No documentation for 'SerialPort::parity'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:29: No documentation for 'SerialPort::rate'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:38: No documentation for 'SerialPort::restoreSettingsOnClose'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:36: No documentation for 'SerialPort::rts'
/home/kuzulis/git/ng/qserialdevice/include/serialport.h:32: No documentation for 'SerialPort::stopBits'

Не создает описание этих методов, т.к. их имена также указаны в
Код
C++ (Qt)
   Q_PROPERTY(qint32 rate READ rate WRITE setRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(PortError error READ error RESET unsetError)
   Q_PROPERTY(bool restoreSettingsOnClose READ restoreSettingsOnClose WRITE setRestoreSettingsOnClose)
 

 В общем, нужно разбираться серьезно - но нет времени ижелания. Мож кто поможет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 04, 2011, 16:47
Сделал поддержку StopReceivingPolicy для платформ, поддеживающих CMSPAR. И добавил новый код ошибки BreakConditionError.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 04, 2011, 17:54
Ок. Спс. Но не вижу mr.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 04, 2011, 17:59
гы. видимо не нажал на "создать".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 04, 2011, 18:42
Ага, замержил, также добавил и для Windows обработку этой ошибки.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 05, 2011, 10:13
Я тут сходил с утреца на #qt-labs, "немного" пообщался:

Цитировать
chriadam   but I guess lars and thiago would be the people to give you an answer regarding the feasibility of your QSerialDevice component for inclusion into Qt (as an add-ons module I presume you mean?)

kuzulis   Yes. But we also need help, as We have few resources.

kuzulis   Here is a link to the project https://gitorious.org/qserialdevice/qserialdevice/trees/2.0

chriadam   kuzulis: it's probably worth sending an email to the qt development mailinglist (development@qt-project.org) outlining your proposal, clearly explaining what you hope to achieve, what
                        you bring to the table, what you'd like the community to provide (eg, Symbian implementation etc), who should be maintainer etc etc

chriadam   that way, if there's a lot of interest, you may find that there's no shortage of people willing to provide expertise and effort maintaining the module. but if there's very little interest,
                        then it's less likely that the proposal will be accepted.

chriadam   purely because as you mention, for a new module to be added to Qt, it absolutely must be actively maintained and have CI integration etc, I would assume.

Я так понимаю, им на development@qt-project.org нужно что-то написать, типа что у нас уже есть, чего не хватает и т.п.
Но я не понял в принципе процесс.

Кто нибудь может помочь в написании петиции и объяснить, что это и с чем его едят?
Где регистрироваться на этот список рассылки и как и т.п.?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 05, 2011, 11:15
Вот, набросал кратко текст петиции
Цитировать
Hello

We want to provide a library QSerialDevice v 2.0 to work with serial ports:
https://gitorious.org/qserialdevice/qserialdevice/trees/2.0

We would like to include it as a separate module for Qt.
The implementation of the library is closely linked to the internal architecture of Qt
and uses some private classes Qt.

We want to know:
Is there interest in this subject, and find like-minded in its development?

At present, the library has two classes of SerialPort and SerialPortInfo.

So what we have:

SerialPort - full-fledged support for OS Windows, WinCE, POSIX-compatible.
Partially implements the interface for OS Symbian.

SerialPortInfo - fully supports OS Windows, WinCE, GNU/Linux, MacOSX, other * nix (simplified), Symbian.

For all classes added comments in QDoc style.

What else is needed make:

1. Implement SerialPort support in OS Symbian.
2. Make a proper configuration for documentation generation.
3. Make the correct configuration to build the project.
4. Correct spelling errors in comments.

Что еще писать нужно?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 05, 2011, 20:33
Вообще-то, им очень не хочется получить никому не нужный компонент, который придется тащить на себе. Поэтому они и хотят, чтобы ты указал, кто будет поддерживать его (хотя бы первое время), а так же узнать, сколько народу заинтересовано в нем. Так как в случае большой аудитории среди сообщества значительно повышаются шансы на поддержку с его стороны. Таким образом, если после отправки письма много народу поддержит идею включения, то она с большой долей вероятности будет включена (точнее, дальше начнется работа по интеграции - скорее всего, придется делать глубокий рефакторинг).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 05, 2011, 20:36
Ок. Ну а регистрироваться где-то нужно, или просто шлю письмо на этот адрес и все?

И что в письме писать то?
Нужно ж как-то пафосно, с чувством и расстановкой, с хорошим литературным слогом.
И как его озаглавить?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Igors от Декабрь 05, 2011, 21:09
Если уж такое неумное желание написать, тогда короче
Цитировать
Hello Qt

Here is my library QSerialDevice v 2.0
https://gitorious.org/qserialdevice/qserialdevice/trees/2.0 (https://gitorious.org/qserialdevice/qserialdevice/trees/2.0)

If you're interested to include it into reguar Qt stuff - please let me know

Thanks
kuzulis

Делая copy/paste чата на паблик форум Вы уменьшаете свои шансы возможно до нуля. Это никак не зависит от содержания чата, просто если человек понимает что значит "private" - это высоко оценивается всеми, (буржуинами никак не меньше) и наоборот.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 05, 2011, 21:15
Озаглавить можно как-то так: "What about including serial port support component to Qt?"
Да пафосно, думаю, не нужно. Это письмо в список рассылки. Думаю, тебе сразу начнут задавать вопросы. Как вариант, можешь создать отдельный баг на багтрекере и в письмо воткнуть ссылку на него. На багтрекере общаться удобней.

Igors, на счет "Hello Qt" я сильно сомневаюсь. Уж лучше тогда "Hello, developers" или просто "Hi". Остальной текст тоже ни о чем. Потому что chriadam четко написал, что он хотел бы узнать. Думаю, максимум этой информации и надо предоставить в письме.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Igors от Декабрь 05, 2011, 21:35
Озаглавить можно как-то так: "What about including serial port support component to Qt?"
Да пафосно, думаю, не нужно. Это письмо в список рассылки. Думаю, тебе сразу начнут задавать вопросы. Как вариант, можешь создать отдельный баг на багтрекере и в письмо воткнуть ссылку на него. На багтрекере общаться удобней.

Igors, на счет "Hello Qt" я сильно сомневаюсь. Уж лучше тогда "Hello, developers" или просто "Hi". Остальной текст тоже ни о чем. Потому что chriadam четко написал, что он хотел бы узнать. Думаю, максимум этой информации и надо предоставить в письме.
Редко, но все же бывает что "думаю" не помогает. Поймите меня правильно, я никак не хочу Вас задеть. Но если Вы сами не ходили по этой дорожке - Вам лучше воздержаться от советов. 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 05, 2011, 21:59
Цитата: Igors
Делая copy/paste чата на паблик форум Вы уменьшаете свои шансы возможно до нуля. Это никак не зависит от содержания чата, просто если человек понимает что значит "private" - это высоко оценивается всеми, (буржуинами никак не меньше) и наоборот.
Да ладно, новичку "мне" простительно. Я не чатланин. На будущее учту.

Вот тогда как-то так:

Цитировать

Title : "What about including serial port support component to Qt?"

Hello.

We want to provide a library QSerialDevice v 2.0 to work with serial ports:
https://gitorious.org/qserialdevice/qserialdevice/trees/2.0

We would like to include it as a separate module for Qt.

The implementation of the library is closely linked to the internal architecture of Qt
and uses some private classes Qt.

We want to know:
Is there interest in this subject, and find like-minded in its development?

At present, the library has two classes of SerialPort and SerialPortInfo.

So what we have:

Class SerialPort - full-fledged support for OS Windows, WinCE, POSIX-compatible.
Partially implements the interface for OS Symbian.
As a basis of the SerialPort was taken QAbstractSocket, therefore, their implementation is somewhat similar.

Class SerialPortInfo - fully supports OS Windows, WinCE, GNU/Linux, MacOSX, other * nix (simplified), Symbian.
As a basis of the SerialPortInfo was taken QPrinterInfo, therefore, their implementation is somewhat similar.

For all class added comments in QDoc style.

What else is needed make:

1. Implement SerialPort support in OS Symbian.
2. Make a proper configuration for documentation generation.
3. Make the correct configuration to build the project.
4. Correct spelling errors in comments.

If you're interested to include it into reguar Qt stuff - please let me know

Thanks
kuzulis


Так пойдет?

ЗЫ:
Ну а письмо прям так и слать на этот емайл и всё? Больше ничего не нужно?

Блин.. стока всего наговорили.. Так как эфективнее будет то?

И как ОНИ будут задавать вопросы (т.е. как я получу ихние вопросы)?
Проведите-ка ликбез!  А то я ж не в теме совершенно. ::)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 11:59
Думаю, что в методах: WinSerialPortEngine::setRate, WinSerialPortEngine::setDataBits, WinSerialPortEngine::setParity нужно убрать проверки на UnknownRate, UnknownDataBits, UnknownParity. Это выполнит ОС. А проверку проводить после updateDcb.

Например rate == UnknownRate (-1), фиксируем ошибку UnsupportedPortOperationError, возвращаем false.
Если rate == 5555, ошибку не фиксируем, но возвращаем false. Как потом ошибку анализировать?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 12:04
Цитировать
Если rate == 5555, ошибку не фиксируем, но возвращаем false. Как потом ошибку анализировать?
5555 это не ошибка. это Custom Rate


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 12:20
Ах да, для rate == 5555, если драйвер не тянет, будет ConfiguringError.
Но при rate == -1, который драйвер то же не тянет, будет UnsupportedPortOperationError.
В чём смысл? Не лучше ли их объединить в один тип, и  -1 так же отдать системе?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 12:33
Смысл в том, что при неправильном детектировании текущих настроек или при невозможности их детектирования
присваивается значение -1, т.е. Unknown.

Хотя, да, ошибку ConfiguringError можно заменить на UnsupportedPortOperationError.
И, кстати да, можно и проверки на Unknown убрать - драйвер сам матюкнется если что не так.

Подождем мнения остальных по этому вопросу..


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 12:55
поддерживаю poru


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 12:58
Ок. Исправил.

2 b-s-a, ну а насчет текста сообщения на их е-майл то что?
Давайте ка побыстрее организуемся и быстрее отправим -
а то затянулось все как-то


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 13:55
Итак, идешь сюда (http://lists.qt-project.org/mailman/listinfo/development), подписываешься. Затем отправляешь это письмо. И ждешь реакции. Рекомендую раскопать еще соответствующий баг (feature request) и кратко отписаться в нем.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 14:09
Всё, скопипастил и на список рассылки и в трекер :)
Теперь ждемс.

Итак, парни, кто заинтересован - просьба отписаться тут (https://bugreports.qt.nokia.com/browse/QTBUG-9980?focusedCommentId=169450#comment-169450)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 16:27
В рассылку уже ответили. Ждут тебя с распростертыми руками... (http://lists.qt-project.org/pipermail/development/2011-December/000704.html)  ;)
Кстати, я уже "принял" "соглашение", о котором идет речь. Если, конечно, не надо это делать заново.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 16:38
serialportengine_p_win.cpp
строка 266


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 16:42
Цитата: b-s-a
В рассылку уже ответили. Ждут тебя с распростертыми руками...  Подмигивающий
Кстати, я уже "принял" "соглашение", о котором идет речь. Если, конечно, не надо это делать заново.

Ага, а в баг-трекере послали нафик. :)
Кстати, а как принять соглашение?

Цитата: poru
serialportengine_p_win.cpp
строка 266
Ща гляну. Исправил.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 16:44
Цитировать
Кстати, а как принять соглашение?
Там ссылка дана. Надо зарегистрироваться на gerrit, зайти в настройки и выбрать agreements, добавить новое и вперед.

на баг трекер не обращай внимания.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 16:52
Вроде дошел до конца и жмакнул: I AGREE

И теперь в агрементах:

Status   Name   Description   Accepted
Pending   Individual   Individual contributor agreement   Dec 6, 2011 5:51 PM

И что теперь?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 17:10
Если мы Unknown's отдали на съедение ОС, тогда содержимое WinSerialPortEngine::isRestrictedAreaSettings нужно отправить туда же.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 17:15
Имеешь ввиду удалить нафик этот метод для всех платформ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 17:20
Именно так. К тому же OneAndHalfStop - в никсах не существует.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 17:30
2 poru.

Ок. Убрал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 17:46
А теперь филосовский вопрос.
1. Если ОС не позволяет записать неверные настройки в DCB, тогда сможем ли мы, когда либо получить такие же неверные настройки?
2. Если у меня есть driver к микросхеме, обладающей расширенными возможностями, тогда detectDefaultSettings мне наставит Unknown's. Как дальше быть?

Это я к тому, что от Unknown's надо как то избавляться. Получается, что мы вводим искуственные ограничения на те области, которые однозначно до конца не знаем. (А кто-то может и знает)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 17:56
Цитировать
1. Если ОС не позволяет записать неверные настройки в DCB, тогда сможем ли мы, когда либо получить такие же неверные настройки?
Вполне. Так и происходит. Проверь. Особенно в *nix.
Хотя может это из-за ошибок в этом самом детекторе.
Если удастся однозначно детектить состояние на всех платформах- то от Unknown's можно и избавиться.

Цитировать
2. Если у меня есть driver к микросхеме, обладающей расширенными возможностями, тогда detectDefaultSettings мне наставит Unknown's. Как дальше быть?
Мы не рассматриваем расширенные возможности, т.к. это частности, все возможные варианты м/сх и т.п. не отследишь и не учтешь. 
Ну выставит оно Unknown's - ну и что, можно далее выставить что нужно.

Поэтому пока принудительно ограничиваем область на всякий случай.

ЗЫ:
Вот даже сейчас проверил в Win7, открыл порт, а оно мне выдало что FlowControl unknown,
хотя такого ведь не может быть? ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 17:58
kuzulis, напиши с список что сделал все что было велено. Кстати, а кто третий разработчик?
2. Если у меня есть driver к микросхеме, обладающей расширенными возможностями, тогда detectDefaultSettings мне наставит Unknown's. Как дальше быть?
Это вряд ли. В противном случае, драйвер данного устройства вообще не соответствует стандарту Windows. И, соответственно, не может быть использован. По хорошему, все дополнительные фишки должны быть реализованы так, чтобы они не препятствовали основной функции. Поэтому, скорее всего, unknown не будет нигде.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 18:02
Цитировать
kuzulis, напиши с список что сделал все что было велено. Кстати, а кто третий разработчик?
Ну я написал, что зарегался. А что еще то?
Насчет третьего разработчика - пока ХЗ.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 18:12
в логах гиториуса только ты и я? Или есть еще кто?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 19:41
Если по ветке 2.0, то только я, ты и
один раз по мелочи, типа этого  (https://gitorious.org/qserialdevice/qserialdevice/merge_requests/9)
Кстати, в логах есть unknown - это тоже я (ток ХЗ почему unknown) .

Если по старой ветке, то я, ты, Юра (lit-uriy) засветился с самого начала (он помогал перенести проект из SVN в GIT.),
ну и из SVN еще некий Костя.

Остальные просто как клоны или висящие MR.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 19:57
Цитировать
Ну выставит оно Unknown's - ну и что,
Тем самым вы обрезаете возможность узнать, а что же там было!
А вот для каких целей мне нужно знать то значение, это уже моё дело.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 06, 2011, 20:19
Цитировать
Тем самым вы обрезаете возможность узнать, а что же там было!
Ну а как ты узнаешь, что же там было, если искомый параметр является логической комбинацией нескольких флагов и т.п.
и что если эта комбинация не попадает под перечень известных, допустимых ?
В этом случае и выставляется Unknown.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 06, 2011, 21:07
Тогда по порядку.
Rate - Можем ли отобразить пользователю начальное значение скорости? Можем. Пусть там да же будет сплошной хаос. Как-то это повлияет в дальнейшем? Возможно, но это проблема программиста, пишущего какое то решение. Зачем закрывать это поле UnknownRate-ом? И то только для одной платформы.
DataBits - пусть мы получим 9. И что? Ну скажет программист юзеру, что в настройках порта полная ересь. А дальше как хочет. Зачем тогда закрывать UnknownDataBits-ом?
Parity - вопрос несколько сложнее, надо посмотреть более детально.
StopBits - элементарный вопрос, для никсов 2 варианта, для винды - несколько больше  :) Почему бы не показать на форме значение отличное от 3х вариантов. Кому то плохо станет?
FlowControl - вот, пожалуй единственный аргумент в вашу пользу. Тут я не спорю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 06, 2011, 21:21
poru, можешь быть конкретнее. Что твое хитрое устройство выдает?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Декабрь 07, 2011, 09:25
Не буду конкретизировать. Выскажу свои соображения.
1. Отказаться от всех Unknown's. Причины уже описывались.
2. Так как нет Unknown's - не понадобятся методы detectDefaultSettings и им подобные.
3. Отказаться от сохранения и восстановления старых настроек. Оставить это на усмотрение другим программистам. Хотят сохранят, хотят востановят, это их дело. Или хотя бы предоставить возможность.
4. Предоставить возможность получать указатель на структуры типа DCB и пр. Вдруг комуто понадобится их детальный анализ.
5. Минимизировать использование дублирующих переменных, к примеру m_dataBits, для них и так уже выделена пямять.
6. Не инициализировать параметры в кострукторе. Их значения будут иметь смысл только после открытия порта.

Удачи с интеграцией в Qt.
 ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 07, 2011, 10:06
Цитировать
1. Отказаться от всех Unknown's. Причины уже описывались.
2. Так как нет Unknown's - не понадобятся методы detectDefaultSettings и им подобные.
Нуну.. вот открыл ты порт. И что покажешь пользователю?
Как в случае без detectDefaultSettings ты покажешь что же действительно установлено в текущий момент?

Цитировать
3. Отказаться от сохранения и восстановления старых настроек.
Не согласен. Открыл порт. Поработал с ним. И перед закрытием будь добр
восстанови все как было до открытия. Не тобой оно было до этого установлено
и не тебе это менять.
 
Цитировать
Оставить это на усмотрение другим программистам. Хотят сохранят, хотят востановят, это их дело.
Или хотя бы предоставить возможность.
Так вообще то оно сейчас реализовано.
Плохо код смотрел.

Цитировать
4. Предоставить возможность получать указатель на структуры типа DCB и пр. Вдруг комуто понадобится их детальный анализ.
Аха, для *nix на termios, для Symbian на TCommConfig...
Ну вот нафига? Что это за зоопарк будет? Скажы ты мне.
Убеди!

Цитировать
5. Минимизировать использование дублирующих переменных, к примеру m_dataBits, для них и так уже выделена пямять.
Где оно дублируется?

Цитировать
6. Не инициализировать параметры в кострукторе. Их значения будут иметь смысл только после открытия порта.
Начальная инициализация переменных еще никому ничего плохого не сделала.
И выигрыш "производительности" или "размера" или чего там, от этого сомнителен.


Ждем остальных. Пусть выскажутся.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 07, 2011, 10:17
1. не уверен, что для всех пунктов подойдет. Но можно рассмотреть такой вариант.
2. согласен с kuzulis
3. согласен с kuzulis
4. согласен с poru, пример реализации подобного можно найти в QWidget.
5. дублирования нет. я в свое время тоже хотел так, но при реализации не получилось.
6. начальная инициализация еще никому не повредила.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 07, 2011, 10:29
Цитировать
4. согласен с poru, пример реализации подобного можно найти в QWidget.
Может тогда лучше отдавать дескриптор порта (добавить метод типа descriptor().
А программист, если ему уж так нужно будет что-то особенное переконфигурить, сам по этому дескриптору получит необходимые ему DCB,
COMMTIMEOUTS и т.п.

Как такой вариант?

При этом, у нас не будет зоопарка указателей на структуры,
тем более, если использовать указатели, то придется инклюдить платформо специфичные заголовки снаружи.

Поэтому, склоняюсь к дескриптору. Хотя, для симбиана дескриптор - это отдельный класс.

Хотя, можно возвращать указатель на дескриптор в виде (void *),
а уже в конкретной платформе программист сам будет приводить этот указатель или к HANDLE или к int или к RComm.

Не знаю..что-то не горю желанием.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 07, 2011, 11:37
В любом случае, добавить новый метод можно всегда. А вот удалить...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 07, 2011, 12:02
Ну да.

Блин, что-то молчат нокиевцы. Ничего в расылку не пишут больше.
Наверное кирдык, заглохло.  :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 07, 2011, 12:40
Ну а ты туда что-нибудь написал еще? Вроде собирался.
Кстати, надеюсь ты пишешь именно рассылку, а не лично на почту. ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 07, 2011, 12:59
Аааа.. А я думал, что при ответах оно самостоятельно в рассылку попадает.

Вот только что мне Lars написал что Marius и Sergio могут нам помочь.
Что после устаканивания каких-то правовых документов они начнут
и  Sergio начнет импорт.

Они решили переименовать в QtSerialPort, поднимут и свои предыдущие наработки
(у них же был ранее для Embedded linux аналогичный класс).

Но я так и не понял, они сами проявят инициативу, или мне нужно им писать.
Вот я задал этот вопрос и жду ответа. :)

Тем более, судя по коммитам в гиториус, в новой Qt5 класс QWinEventNotifier планируют сделать открытым,
и не придется кочевряжиться. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 07, 2011, 13:42
Ох уж эти юристы...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 08, 2011, 14:30
Кстати, может есть смысл разделить FlowControl::HardwareControl, на два типа: Rts/Cts и Dsr/Dtr?
т.к. их два реально!

FlowControl::HardwareOutputControl (Rts/Cts)

FlowControl::HardwareInputControl (Dsr/Dtr)

Как кто считает?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 08, 2011, 14:41
Что-то я не заметил, чтобы *nix поддерживал управление потоком через DSR/DTR.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 08, 2011, 14:48
Тыц. (http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.commadmn%2Fdoc%2Fcommadmndita%2Fasynch_flowcontrol_dtr.htm)

Но хотя да.. И я не встречал. Просто под виндой заглянул в исходники putty и для винды оно имеется, да и в симбиане можно его вроде тоже.

Посмотрел маны для никсовой stty:
Цитировать
      * [-]crtscts
         enable RTS/CTS handshaking (disables DTR/DSR)

       * [-]cdtrdsr
         enable  DTR/DSR handshaking (disables RTS/CTS), no stty readable
         form available, has to be supported by device
и там заявлено вроде как cdtrdsr

И покопавшись в гугле нашел, что в некоторых линуксах используется флаг CDTRDSR для включения такого режима.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 08, 2011, 20:11
Даже флаг CRTSCTS является неофициальным фактически. А про CDTRDSR я вообще впервые слышу.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 09, 2011, 09:30
Итак,

Marius из нокии пишет, что в принципе все готово к началу и необходимо перейти к получению подписей для CLA.

Просит также предоставить ему список всех участников проекта(контрибьюторов) для
того чтобы он создал для них JIRA задачи для подписи.
Если у них нет JIRA то они должны подписать CLA для того чтобы вносить вклад в проект.

Так что, я так понимаю, ему необходимы имена аккаунтов
в Jira или как? т.е. в каком виде ему необходимы списки?
И слать этот список необходимо именно ему на почту или в рассылку?

Так что все желающие поучавствовать в развитии проекта - шлите сюда свои аккаунты!

b-s-a, что можешь посоветовать? Ведь и ты получил это сообщение в рассылке?
(или я не понимаю как узнать, что это все получили кто подписан, или только я?)
И кого писать в список (ну, Я, ТЫ - это сомо собой.. А кого еще?)?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 09, 2011, 10:37
b-s-a, что можешь посоветовать? Ведь и ты получил это сообщение в рассылке?
(или я не понимаю как узнать, что это все получили кто подписан, или только я?)
И кого писать в список (ну, Я, ТЫ - это сомо собой.. А кого еще?)?
Кроме тебя это сообщение никто не получил. Оно было приватным. Смотри архив: http://lists.qt-project.org/pipermail/development/2011-December/thread.html
Писать письмо надо было в список, а не лично человеку. Тогда бы его увидели все.
В список писать всех, кто засветился в логе гиториуса этой ветки (проще говоря, всех чьи MR в ветку 2.0 ты принял). На jira я под ником b-s-a.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 09, 2011, 10:44
Цитировать
Писать письмо надо было в список, а не лично человеку. Тогда бы его увидели все.
Да, касяк.

Цитировать
В список писать всех, кто засветился в логе гиториуса этой ветки (проще говоря, всех чьи MR в ветку 2.0 ты принял). На jira я под ником b-s-a.
Ну а список людей то писать в личку или в список рассылки?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 09, 2011, 13:04
конечно в личку.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 09, 2011, 13:05
кстати, будешь заливать туда проект откажись от истории (чтобы была только одна фиксация - Initial Import).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 09, 2011, 13:07
Цитировать
конечно в личку.
OK.

Цитировать
кстати, будешь заливать туда проект откажись от истории (чтобы была только одна фиксация - Initial Import).
Напиши мне по шагам последовательность заливки без истории, на всякий.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 09, 2011, 13:21
Цитировать
кстати, будешь заливать туда проект откажись от истории (чтобы была только одна фиксация - Initial Import).
Напиши мне по шагам последовательность заливки без истории, на всякий.
[/quote]Тебе будет дан пустой репозиторий (скорее всего), клонируешь, копируешь туда файлы, добавляешь, коммитишь и пашишь. ВСЕ. Что тут объяснять?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 09, 2011, 13:35
ну так по умолчанию клонируется же и история?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 09, 2011, 14:02
конечно. вот только история пустого репозитория тоже пуста. или я ошибаюсь?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Декабрь 12, 2011, 17:00
Добрый день! Подскажите пожалуйста, как можно реализовать следующее. Я работаю с модемом через последовательный порт. Все прекрасно работает, когда запрос делаешь один. При нескольких запросах ответы сливаются в один. Н-р:
Код:
query("#CCID");
query("+CPIN?");
query("+CREG?");
query("+CGATT?");

а в ответ:
AT#CCID

ERROR
AT+CPIN?

ERROR
AT+CREG?

+CREG: 0,0

OK
AT+CGATT?

+CGATT: 0

OK


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Декабрь 12, 2011, 17:33
проверил сколько раз вызывается слот присоединенный к readyRead, пишет, что один раз, а отправлено 4 запроса...как такое может быть?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 12, 2011, 17:38
Очень просто. состояние порта проверяется не в реальном режиме, а периодически. Если модем успевает ответить на все команды за этот период, то ответы сливаются. Рекомендую тебе делить ответы по строкам - это в любом случае надежней.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Декабрь 12, 2011, 18:01
в смысле строками? я и так отсылаю строку за строкой....можно поподробнее...спасибо


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Larry от Декабрь 12, 2011, 18:48
Не знаю правильно или нет, но проблему решил блокированием порта до прихода сообщения, а остальные направляю в очередь...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 13, 2011, 11:07
kuzulis, как успехи в переговорах с Nokia? Все заглохло?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 11:15
По ходу да. Жду ответа, ничего не было слышно с пятницы.
Сегодня подожду еще чуток и напомню им, мож забыли.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 15:04
2 b-s-a,

Я вот что думаю, зря наверное для перечислений типа Parity и т.п.
мы присвоили им конкретные значения.

В частности, для Windows и *nix для того же Parity значения отличаются,
и в Windows они не совпадают с тем, что заявлено в serialport.h.

В serialport.h:
Код
C++ (Qt)
...
enum Parity {
       NoParity = 0,
       EvenParity = 2,
       OddParity = 3,
       SpaceParity = 4,
       MarkParity = 5,
       UnknownParity = -1
   };
...
 

в winbase.h:
Код
C++ (Qt)
...
#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define MARKPARITY 3
#define SPACEPARITY 4
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2
...
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 15:57
Итак, только что я получил от Marius-a письмо о том, что он не забыл про QSerialDevice.
Он написал, что недавно они закончили процесс легализации (юридические дела)
и в ближайшее время он начнет создавать в Jira "CLA sign-off tasks".
И тогда мы получим назначенные Jira задачи, где мы будем добавлять/отклонять
специальные CLA.

И он говорит, что хотя-бы у одного человека должна быть регистрация в Jira
для того, чтобы была возможность назначить задачу.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 13, 2011, 16:05
2 b-s-a,

Я вот что думаю, зря наверное для перечислений типа Parity и т.п.
мы присвоили им конкретные значения.
Хочешь не хочешь, а по любому что-то присвоить придется. По умолчанию, enum в любом случае присваивает. Или ты хотел делать через константы?
В частности, для Windows и *nix для того же Parity значения отличаются,
и в Windows они не совпадают с тем, что заявлено в serialport.h.
Знаю что отличаются. Но в отличие от *nix под виндой не надо эмулировать Mark/Space. А именно из-за этого я настаивал на данных значениях.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 16:15
Цитата: b-s-a
Хочешь не хочешь, а по любому что-то присвоить придется.
По умолчанию, enum в любом случае присваивает. Или ты хотел делать через константы?
Я думал, что может вообще отказаться от конкретных значений enum-ов, которые
есть сейчас (ну, кроме Unknown). т.е. пусть компилятор
сам им присвоит по умолчанию 0, 1, 2 и т..п.
А от enum Rate можно было бы вообще отказаться.
А в эмуляции паритета и т.п. использовать или константы или другие enum - но уже
внутри engine конкретной платформы.

К чему это я все: к тому, что при генерации документации текущие
значения enum будут отражены и в ней тоже. И юзер посмотрит
их и скажет, а почему оно равно 3 а не 5 и не 99.
т.е. не нужно "выносить сор из избы" (с). И лучше,
если в документации эти enum будут без значений вообще.

Ну и от Unknown тоже придется скорее всего избавляться.


Цитировать
Знаю что отличаются. Но в отличие от *nix под виндой не надо эмулировать Mark/Space. А именно из-за этого я настаивал на данных значениях.
Я понял. Просто оно как-то некрасиво что-ли получается. Типо для одной платформы эти константы "заточены".

Хотя - ХЗ. Посмотрим что дальше будет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 13, 2011, 16:22
На счет Unknown согласен, возможно следует избавиться. Оно где-то реально используется?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 16:37
Цитировать
Оно где-то реально используется?
Только при определении текущих настроек порта во время его открытия,
т.е. в случае каких либо ошибок при их детектировании
или неизвестном параметре устанавливается Unknown.

Т.е. реально в структурах типа DCB и termius могут быть
значения полей /битов установленные "от балды". И
в этом случае мы спасаемся, присвоив   Unknown соответствующему параметру.

Например, вдруг, гипотетически в DCB.ByteSize будет установлено 9 (ну или сочетание
любых флагов типа fRtsControl, fDsrSensitivity и т.п. не будет соответствовать ожидаемой комбинации),
и что тогда отображать пользователю? Какое значение параметра?

Вот в этом то и вся заковырка.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 13, 2011, 17:23
ну если byteSize равен 9, то нет проблем - оставляем 9 (через cast). Но только чтение работать не будет...
Под *nix я, например, не знаю как получить четность Unknown.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 17:53
ну если byteSize равен 9, то нет проблем - оставляем 9 (через cast). Но только чтение работать не будет...
Под *nix я, например, не знаю как получить четность Unknown.
Ну, byteSize это был просто пример. Меня больше волнуют различные флаги и т.п. для других параметров
типа FlowControl и т.п.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 13, 2011, 22:38
Как вариант, можно недействительные флаги сводить к известным. Например, к NoParity, NoFlowControl...

Под Windows можно выключать приемник порта? Под *nix можно. Иногда требуется выключать на время передачи данных. Может сделать такой метод?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 22:41
Кстати, нашел неприятный момент с QWinEventNotifier под Windows (естественно).

Суть в том, что если я кликаю в запущеном приложении по заголовку его окна и "держу" это окно,  
не отпуская клавишу мышки - то QWinEventNotifier перестает обрабатывать любые события.

Я создал тестовое приложение, которое воспроизводит проблему:
это приложение по протоколу Modbus шлет запросы через последовательный порт
в симулятор ModSim32 (симулятор качается в инете, поиск рулит).

Параметры запроса: адрес ведомого устройства = 1, функция чтения = 3, читаем 3 регистра, начиная с нулевого,
собственно сам запрос:  01030000000305cb

Сначала необходимо запустить ModSim32,

Настройки главного окна Modsim32:
1. Dev. ID     = 1
2. Fun            = 3 HOLDING REGISTERS
3. Start Addr = 1
4. Len             = 10  

Настройки соединения Modsim32:
Connection->Port#, где # - 1...9 (COM1-COM9) номер вашего порта на
котором будет "висеть" Modsim32,
19200 8 N 1

Для просмотра траффика запросов/ответов через ModSim32 жмакаем Display->Show Traffic/ Show Data

далее тестовое приложение.

Итак, запуск тестового приложения:
1. Вводим имя порта на котором "висит" тестовое приложение.
2. Жмакаем Open
3. Жмакаем Send

И с периодом в 1 сек тестовое приложение начнет слать запросы к  ModSim32.

В нашем случае наше тестовое приложение - мастер, а ModSim32 - слейв.

Порты должны быть соединены кросс кабелем, или же можно юзать виртуальные
порты типа: Eltima Virtual Serial Port

Для воспроизведения проблемы достаточно жмакнуть мышкой на заголовке тестового приложения
и тогда отладочный вывод типа "Event #" из bool Port::event(QEvent *e) тестового приложения остановится.
И если потом отпустить - то вновь заработает.

Код
C++ (Qt)
static int event_counter = 0;
bool Port::event(QEvent *e)
{
   bool ret = false;
   if (e->type() == QEvent::WinEventAct) {
 
       qDebug() << "Event " << event_counter++; //<< ВОТ ЭТООТ ВЫВОД ПЕРЕСТАЕТ РАБОТАТЬ
                                                  //      И, СООТВЕТСТВЕННО, EV_RXCHAR НЕ СРАБАТЫВАЕТ
                                                   //      И emit readyRead() не излучается;
 
       if (EV_RXCHAR & m_currMask & m_setMask) {
           //qDebug("Event: EV_RXCHAR\n");
           emit readyRead();
           ret = true;
       }
       if (EV_TXEMPTY & m_currMask & m_setMask) {
           //qDebug("Event: EV_TXEMPTY\n");
           ret = true;
       }
 
       if (!ret)  {
           //qDebug("Other event\n");
           ret = true;
       }
   } else
       ret = QWinEventNotifier::event(e);
 
   ::WaitCommEvent(m_hd, &m_currMask, &m_oe);
   return ret;
}
 

Само тестовое приложение и результаты его работы в аттаче.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 13, 2011, 22:45
Цитировать
Как вариант, можно недействительные флаги сводить к известным. Например, к NoParity, NoFlowControl...
Да, но тогда нужно будет в действительности устанавливать  NoParity, NoFlowControl при открытии,
т.к. если просто присвоить NoParity, NoFlowControl - то получится хрень, т.к. реально там не NoParity, NoFlowControl !!!

Цитировать
Под Windows можно выключать приемник порта? Под *nix можно. Иногда требуется выключать на время передачи данных. Может сделать такой метод?
ХЗ, а в *nix это какой метод?

И еще не факт, что в Symbian можно такое же сделать - так что ХЗ,
я пока сомневаюсь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 14, 2011, 00:14
в *nix не метод. там флаг CREAD надо снять и все.  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 14, 2011, 10:22
Цитировать
в *nix не метод. там флаг CREAD надо снять и все.
Ок. Но не факт что в других оськах аналогичную фишку можно провернуть.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 14, 2011, 11:52
Вот я и спрашиваю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 14, 2011, 11:57
А я не знаю. :)

Вот, кстати, количество вариантов управления потоком вообще равно 5!!!
Вот ссылка на Java библиотеку (http://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/SerialPort.html) в которой именно так и есть.
Вот бы вытянуть исходнички бы эти.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 14, 2011, 12:54
Под *nix, например, xon/xoff для входа/выхода включать можно раздельно. А вот аппаратное управление нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 17, 2011, 13:48
2 b-s-a,

Мне сегодня (в субботу) на почту пришло от Нокии письмо о том, чтобы
принять или отклонить соглашение CLA в их Jira.
Они на багтрекере создали задачу, я принял соглашение.

Тебе по идее оно тоже должно придти.
Отпишись сюда, что у тебя там в почте было.

Также они просят скорее принять соглашение и остальных участников,
типа чем быстрее - тем лучше.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 17, 2011, 22:52
Получил. Только что (23:51 по Москве) нажал на Accept.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 20, 2011, 16:32
И что дальше? ???


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 20, 2011, 16:56
ХЗ. Мож они еще кому разослали и ждут?
Напиши им письмо, спроси... :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 27, 2011, 00:14
лучше ты. ты же с ними общался.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 27, 2011, 10:32
Ok. Теперь только после НГ!

Ведь хепи крисмас - же. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 13, 2012, 14:38
новенькое что-нибудь есть?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 13, 2012, 15:31
Да, Мариус мне прислал письмо о том, что он ждет подтверждения еще от одного "участника", некоего arokux.
Мариус отправил ему письмо (такое-же как мне и тебе).

Этот arokux прислал мне единственный MR с простейшим контентом типа: https://gitorious.org/qserialdevice/qserialdevice/merge_requests/9

И я по своей "глупости" принял его.. Вот теперь этот arokux по-ходу не торопится принимать CLA, а может просто забил
на сообщение от Мариуса.

И из-за него теперь такой затык.

Вот вырезка из общения между мной и Мариусом:

Я:
Цитировать
> Maybe you can not expect Arokux, and begin to integrate the without the
> use code of Arokux?
> As its changes are small.
>
> If I knew in advance about such issues - I would not add code from Arokux to
> the project QSerialDevice.
> It is a pity.

Мариус:
Цитировать
Hi Denis,

The code which was done by Arokux would have to be rewritten by someone who accepts the CLA before we can move the project.

Но я его не понял: Кому придется переписать код Arokux-а? Когда это нужно делать?

Вот и жду - а чего жду ХЗ...  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 13, 2012, 15:42
напиши этому куксу через gitorious, чтобы он принял соглашение, отправленное Мариусом. Возможно, он просто удалил непонятное письмо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 13, 2012, 16:22
Отправил.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 17, 2012, 10:33
похоже, придется убивать его патч, раз до сих пор не ответил. спроси у Мариуса, можно ли это сделать путем наложения обратного патча или только путем отката всех до него включительно и восстановления.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 17, 2012, 11:21
Отправил вопрос, ждем...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 17, 2012, 16:32
Я спросил у Мариуса: "А чо собственно в этом случае делать?"

Он тветил:
Цитировать
If his patches are trivial, and not too important, you might be able to
rebase the repository to avoid his commits. Then you can describe the
issues fixed by the commits from Arokux, and get someone in the
community to solve them without using the original patch(es).

Т.е. типа можно создать новую ветку (например типа 2.0-to-integrity) без патча и этого будет достаточно?
Или что он имеет ввиду?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 17, 2012, 17:20
Вот как он еще уточнил:
Цитировать
If this is the only patch from Arokux, I say rebase the repo, and remove
that commit. It can easily be added later.

Т.е. как теперь, собственно, сделать "rebase the repo, and remove
that commit" ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 17, 2012, 17:53
создай локальную копию от того момента, когда не было патча, затем внеси все изменения после него. и запаш используя --force.
я так это понимаю.
попробуй почитать это, может поможет: http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Январь 17, 2012, 19:45
1) В локальном хранилище переходишь в ветвь (предположим master), в которой нужно откатится, в GitTk выделяешь предыдущее состояние, правой кнопкой щёлкаешь по нему и в контекстном меню выбираешь "Установить ветвь master в это состояние" (в место master может быть другая ветвь в которой нужно откатится).
2) git branch "имя ветки, в которой нужно откатится"
git reset --hard "идентификатор состояния, в которое нужно установить ветвь"

Ну а затем отправляешь в гиториус, незабыв поставить ключ/флажок "принудительно переписать существующую ветвь"


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 18, 2012, 10:22
и при этом будут утеряны все коммиты после удаляемого.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 18, 2012, 10:39
Кстати, на гиториусе появился мерж по исправлению установки нестандартной скорости под Linux.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 18, 2012, 10:48
Цитировать
Кстати, на гиториусе появился мерж по исправлению установки нестандартной скорости под Linux.

Да, я в курсе - но пока не буду мержить (я тому парню все объяснил почему и он вроде понял и не против) :)

Цитировать
и при этом будут утеряны все коммиты после удаляемого.

кстати, да теряются.

Блин, с rebase ничего не получается. Не работает нифига, да и я не понял ничего :(.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 18, 2012, 11:32
Все, вроде разобрался.

b-s-a, проверь ка и ты еще так или не так я сделал:

1. git rebase -i HEAD~17
где 17 - это было кол-во коммитов от последнего до коммита Arokux
2. В VIM (GIT консоли) я удалил коммит от Arokux
3. Перезалил проект на гиториус через push -force (вроде)
4. Отклонил ранее принятый MR от Arokux и написал почему он мешал.

Когда посмотриш - скажи и я тогда Мариусу напишу, что все готово.
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 18, 2012, 13:21
ты сам сравни. отличия должны быть только те, что были в MR того человека. Если кроме них нет ничего, то добавь собственноручно сделанное изменение. и вперед интегрироваться в Qt. :-)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 18, 2012, 13:24
смущают коммиты от некого Unknown (по косвенным признакам это твои).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 18, 2012, 13:40
Цитировать
ты сам сравни. отличия должны быть только те, что были в MR того человека. Если кроме них нет ничего, то добавь собственноручно сделанное изменение. и вперед интегрироваться в Qt. :-)
Ну дык я добавил.
Теперь, если сделать
Цитировать
#git clone
#cd qserialdevice
#git chechout 2.0

И посмотреть лог коммитов для 2.0 - то лога от коммита от Arokux уже нет (как и его кода).

Цитировать
смущают коммиты от некого Unknown (по косвенным признакам это твои).
Да, мои.

Ну так что, я пишу Мариусу?

---

Написал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Январь 25, 2012, 16:21
Новости есть какие?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 25, 2012, 17:43
Нет, Мариус не отвечает что-то. Судя по списку рассылки - он наверное в отпуске или еще что, ИМХО.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Февраль 06, 2012, 08:47
Скажите, а есть ли документация на ветку 2.0? Есть QDoc, но вот как им пользоваться...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 06, 2012, 10:03
Цитировать
Скажите, а есть ли документация на ветку 2.0?
Нету.
Цитировать
Есть QDoc, но вот как им пользоваться...
Я и сам не знаю.

Без документации и так  интуитивно понятно как пользоваться 2.0 (в принципе, ничем не отличается от 0.4 и т.п.)
за исключением иных имен классов и нетотором изменении API.
Смотри API из хедеров в /include.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Edynchik от Февраль 07, 2012, 09:39
А вот еще вопрос: у меня консольное приложение, в нем два класса,подключил вашу библиотеку,использовал...вроде все ок. Создаю некий файл main.h, чтобы описать глобальные переменные и происходит непонятное:
Код
C
./debug\thread.o: In function `Thread':
 
e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:113: multiple definition of `ba'

 
./debug\main.o:e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:113: first defined here
 
./debug\thmod.o: In function `Thmod':
 
e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:113: multiple definition of `ba'

 
./debug\main.o:e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:113: first defined here
 
./debug\moc_thread.o:e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/global/qglobal.h:1381: multiple definition of `ba'
 
./debug\main.o:e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:113: first defined here
 
./debug\moc_thmod.o:e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/global/qglobal.h:1381: multiple definition of `ba'

 
./debug\main.o:e:/Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:113: first defined here
 
collect2: ld returned 1 exit status
 
mingw32-make[1]: *** [debug\guiappd.exe] Error 1
 
mingw32-make: *** [debug] Error 2
Как можно исправить?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 07, 2012, 09:53
Это к теме не имеет отношения - создай другую тему.
Не имею понятия, разбирайся сам.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2012, 21:02
Наконец то Nokia клонировала репозиторий QSerialDevice 2.0 в Gerrit!!!

Ура, товарищи! За это не грех хряпнуть!  ::)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 08, 2012, 21:56
Нужно ли теперь переименовывать SerialPort в QSerialPort?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 09, 2012, 10:03
Да, теперь оно:
# git clone ssh://codereview.qt-project.org:29418/playground/qtserialport.git

Но мне непонятен до сих пор принцип разработки в Gerrit и т.п.

Наш диалог с Мариусом, касающийся дальнейшего процесса разработки:

Цитировать
Я:
What are is now further action on my part and yours? ie what's next?

М:
You may now disable/stop using the Gitorious repo, and clone from Gerrit,
and start pushing to refs/for/2.0 to the Gerrit repo. Then those will show
up as review tasks for the 2.0 branch in Gerrit, and you can review it
there.

Basically, you may now use the Gerrit version as the main repository.

For the other Qt repos we treat the Gitorious repo as "public" repo, so
most people will clone from there. Then we regularly push from Gerrit to
Gitorious to keep them in sync. However, we disable Merge Requests in
Gitorious, since we want to force all contributions through the Gerrit
system.

Я:
I do not understand this bit:
Цитировать
For the other Qt repos we treat the Gitorious repo as "public" repo, so
most people will clone from there. Then we regularly push from Gerrit to
Gitorious to keep them in sync. However, we disable Merge Requests in
Gitorious, since we want to force all contributions through the Gerrit
system.
ie I and other "special/selected" developers will commits/push to Gerrit,
and then tested and approved by the pieces of code will be sent to
Gitorious?

М:
Well, not more "special" than having a Jira/Gerrit account with an
accepted CLA agreement :)

For the Qt Essential modules we have a script which automatically pushes
the latest changes to the Gitorious location. And we prefer most people to
use those as the primary clone location, since it offloads much of the
resource requirements from the Qt-Project infrastructure.

It's up to you really. If you don't want to mirror it to Gitorious on a
regular basis, you can just use the Gerrit repo as the primary location,
though I think people will need a Jira/Gerrit account to do so? Sergio,
can you please confirm or deny that?

My recommendation: Keep your Gitorious repo as the "primary" source, and
push the 2.0 branch from Gerrit to Gitorious whenever you feel it's stable
enough. Then add a notice on the Gitorious project that all development is
done at codereview.qt-project.org, and that Merge Requests in Gitorious is
therefore disabled.

For Qt Essentials, the init-repository script in qt5.git makes the
Gitorious repos the 'origin', while Gerrit is the 'gerrit' remotes.

Но я что-то не уловил сути.
Кто нить может перевести нормально на русский? А то гугл переводит хреновенько,
а я с английским не очень.

В принципе, основную теорию можно прочитать тут (http://wiki.qt-project.org/Code_Reviews) и тут (http://wiki.qt-project.org/Setting_up_Gerrit).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 09, 2012, 10:37
ну он тебе рассказывает о том, как будет происходить процесс разработки. делаешь изменения, пашишь в refs/for/2.0, затем ревьюируешь и оно мержится. Когда состояние ветки будет более или менее стабильным, пашишь в гиториоус, который остается основным местом для получения исходников пользователями. Разработчики должны использовать gerrit.

Вообще-то, зря он про 2.0. На геррите это уже мастер, вроде (что есть правильно, имхо). Теперь нужно уточнить название классов и можно продолжить развитие.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 09, 2012, 11:24
1. Но как разработчики узнают, что у них в Gerrit появилась новая "обуза" в виде этой библиотеки? Ведь об этом знаем только я, ты, Мариус и т.п. :)
2. Как на Gitorious отключить возможность MR? Теперь там только r/o должно быть.
3. Я так понял, адрес публичного репозитория так и останется http://gitorious.org/qserialdevice/qserialdevice/trees/2.0 ?
Но оно тогда как-то не будет стыковаться по названию, а также не все юзеры, качая qserialdevice знают, что нужно брать из 2.0! Я думал, что нокиевцы создадут сами публичный репозиторий на
Gitorious.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 09, 2012, 16:22
создай сам ;-) А этот пометь как "obsolete".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 09, 2012, 16:29
Как? Где? Давай инструкции!
Ты же больше в "теме". Как бы сделал ты?  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 09, 2012, 17:32
создай новый проект на гиториусе - QtSerialPort, как клон герритовского. Ты проекты создавать умеешь.
В описание старого проекта добавляешь извещение, что он устарел и адрес нового такой-то. В новом же указываешь, что проект только для чтения, поэтому все патчи направлять через геррит.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 10, 2012, 10:12
Информация для разработчиков, которые желают принять участие в разработке
в части структуры аддона, находится тут (http://wiki.qt-project.org/Creating_a_new_module_or_tool_for_Qt).

Блин, я думал, что и Нокиа будет помогать в разработке, но оказалось, что нифига подобного - все средствами энтузиастов. 
Но где их взять?
:(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 10, 2012, 10:50
Как только твой модулю будут использовать массово, то сразу посыпятся баги и патчи. А это уже хорошо. Думаю, что нокия тоже присоединится, когда начнут использовать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sy от Февраль 10, 2012, 16:13
Я задействовал QSerialDevice в своем проекте на микросхеме FT4232HL. Пока все работает нормально. Сейчас зреет еще пара проектов.
Спасибо разработчикам!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 11, 2012, 20:32
Я на Gerrit подготовил первые изменения структуры аддона в соответствии с этими (http://wiki.qt-project.org/Creating_a_new_module_or_tool_for_Qt) требованиями.
Посмотрите, кто в теме, что там не так и т.п.

Смотреть здесь (http://codereview.qt-project.org/16042), но только для зарегистрированных пользователей.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 12, 2012, 19:51
Есть подозрение, что не надо включать макросы вида QT_BEGIN_NAMESPACE_SERIALPORT. В документации сказано, что следует использовать QtSensors в качестве примера модуля.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 17, 2012, 11:04
Что-то проект пропал с геррита! Что случилось?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 17, 2012, 11:44
См. вчерашнюю переписку с темой "Question about push reviewed code to Gerrit repo" с Oswald Buddenhagen.
По ходу он что-то накосячил, ухандокав репозиторий, но зато сделал меня "администратором" группы Qt Serial Port (если в Gerrit жмакнуть Admin->Groups).  :D

Я вчера поздно вечером у него спросил, куда он дел репку - ответа пока нет, жду.
Вполне возможно, что я теперь сам могу залить туда проект, хотя ХЗ.

В общем, он дал мне полномочия чтобы я сам мог push-ить в репозиторий не ожидая пока кто-нить одобрит review,
хо по ходу что-то поломалось :)

Еще, он сказал, что нужно облагородить Gitorious-ную репку, заменив автора unknown на нормальное имя.

Так что, пока жду объяснений.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 17, 2012, 12:49
Все, Освальд исправил, теперь проект видится.

b-s-a, а ты видишь проект? Если нет, то может быть, мне тебя нужно добавить в группу.
Отпишись плз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 17, 2012, 13:41
вижу


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 21, 2012, 22:20
2 b-s-a,

Ну так что там с ревью?

Я шото не понял, Нокиевцы вообще помогать не собираются?
Они даж на простые для них вопросы об макросе QT_BEGIN_NAMESPACE_XXX
не хотят отвечать..

Блин, из-за этого стопорится всё.

И кстати, что ты там про *.pri упоминал?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 22, 2012, 12:36
я говорил, что надо разделить коммит на 2. в одном идет удаление ненужных файлов с соответствующими правками *.pri/pro файлов, а второй уже основные изменения. А то смотришь на список изменений и страшно становится.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 22, 2012, 16:15
Да вроде нормуль и так, т.к. там не только удаления, но и переименование и т.п.
ИМХО, лучше сразу весь этот огромный коммит закомитить, а потом уже разбираться. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2012, 18:00
2 b-s-a и остальным:

Предлагаю убрать эти проперти из класса SerialPort
Код
C++ (Qt)
   Q_PROPERTY(qint32 rate READ rate WRITE setRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(PortError error READ error RESET unsetError)
   Q_PROPERTY(bool restoreSettingsOnClose READ restoreSettingsOnClose WRITE setRestoreSettingsOnClose)
 

потому, что проперти подразумевает просто установку/чтение некоторых значений без возврата
результата успешности, т.е. для св-в должны быть назначены только такие методы:
Код
C++ (Qt)
void setProperty(Value value); //< Не должна возвращать значение.
Value property() const;            //< Именно константный метод.                
 

То, что есть сейчас, например пары dataBits/setDataBits и т.п. - это не свойства!

И предлагагаю оставить только такое св-во:
Код
C++ (Qt)
   Q_PROPERTY(PortError error READ error RESET unsetError)
 
т.к. иные методы не попадают в категорию свойств (ну, может быть, за исключением setPort/portName).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 02, 2012, 19:39
Думаю, надо не из списка свойств исключать, а из переделать сами методы, чтобы void возвращали. А ошибку узнавать через свойство error.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2012, 20:26
Что-то сомневаюсь в таком подходе, т.к. придется
каждый раз после каждого конфигурирования отдельного свойства вызывать error():
Код
C++ (Qt)
...
setRate(value);
if (error()) {
}
...
...
...
setParity(value);
if (error()) {
}
...
...
 

также не факт, что мы сможем поймать ошибку именно от конфигурирования.

Например, у нас был подконнекчен слот readyRead() (или не был, неважно), порт был открыт,
мы устанавливаем свойство setRate(value), и в это время вдруг
у нас происходит ошибка I/O (или еще что), поэтому вызов error()
вернет именно ошибку I/O, а не конфигурирования.

Те. между вызовами setRate() и error()  эта цепочка может прерваться
и отработать что-то из EventLoop, которое может изменить код ошибки... (или не может?)

Тут блин сложный вопрос, как бы не прогадать...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2012, 20:42
И кстати, b-s-a, зацени если будет время текущую реализацию как аддон на gerrit, я там смержил.

1) Теперь нужно добавить документацию (хотя бы ее шаблон, т.е. что на страницах показывать, какие страницы, о чем писать и т.п.),
2) ну и определиться с пропертями.
3) написать тесты ( я вообще не представляю что в тестах имплементировать, наверное из сокетов что-то по аналогии взять)
4) нужно ли выкинуть код для симбиана?
5) доделать политики
6) определиться с неймспейсами и именованием классов, т.к. нокиевцы не отвечают на мои вопросы по этому поводу
7) нарисовать парочку примеров, кстати, идеи что реализовывать в примерах приветствуются.
8 ) ну и выпустить первую "stable" версию в качестве аддона.

надо поторопиться, а то dbzhang800-qextserialport тоже начал что-то рефакторить для Qt4/Qt5, как бы не обогнал и как бы не приняли его вариант,
а наш похерили :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 02, 2012, 20:53
если уж так хочется надежности, то можно проверять так:
Код
C++ (Qt)
port.setRate(rate);
if (rate != port.rate()) {
...
}
Но я сильно сомневаюсь, что вообще кто-то заморачивается на это.

Ты еще не вмержил свои изменения? Если нет, то давай. А то есть идеи, но реализовать их нельзя, например:

Сейчас всегда нужно вызывать 6 методов для инициализации порта. Это в корне не верно! Нужно, или устанавливать настройки "по-умолчанию" при открытии (добавить соответствующий флажок, для отключения начальной настройки), или добавить метод:
Код
C++ (Qt)
setup(
     qint32 rate = Rate9600,
     Parity parity = NoParity,
     DataBits dataBits = Data8,
     StopBits stopBits = OneStop,
     FlowControl flow = NoFlowControl,
     DataErrorPolicy policy = IgnorePolicy
     );
Я склоняюсь к первому варианту.

1. С документацией я никогда не работал. Даже не в курсе.
2. с пропертями у меня есть свое мнение :)
3. с сокетами проще, для них не нужна аппаратная поддержка. А вот для RS232 она требуется
4. зачем его выкидывать? кому мешает?
5. что там осталось, а то я подзабыл?
6. тут без троллей никак
7. Qt5 довольно сырая еще. Я собрал ее, запустил лингвист, был неприятно удивлен ужасному виду. Думаю, до релиза Qt5 еще долго. нужно пока работать с 4.8


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2012, 21:08
Цитировать
Но я сильно сомневаюсь, что вообще кто-то заморачивается на это.
Ага, а потом ловят глюки т.к. не проверяют возвращаемые значения.
Многие уже на забугорных форумах писали, что библиотека не работает - помогите - а сами не проверяли
никаких значений после конфигурирования. :)

Цитировать
Ты еще не вмержил свои изменения? Если нет, то давай.
Вмержил, все компилится и работает, проверял.

Даже QT += serialport работает (только для Qt5 проверял). :)

Цитировать
Сейчас всегда нужно вызывать 6 методов для инициализации порта. Это в корне не верно! Нужно, или устанавливать настройки "по-умолчанию" при открытии (добавить соответствующий флажок, для отключения начальной настройки)

Так он и так при открытии открывается со своими настройками по умолчанию!!!
Только если ему не удается определить текущую конфигурацию - то св-во устанавливается в Unknown.

Т.е. если при открытии текущие настройки удовлетворяют пользователя - то ничего настраивать не нужно.

Цитировать
2. с пропертями у меня есть свое мнение Улыбающийся
Это понятно, но не отгребем ли мы в дальнейшем проблем с функционированием и неудовольство от юзания потенциальных пользователей?
Цитировать
3. с сокетами проще, для них не нужна аппаратная поддержка. А вот для RS232 она требуется
в принципе, на потом можно оставить..
Цитировать
4. зачем его выкидывать? кому мешает?
Ну, она наполовину реализована, тем более, в Qt5 вроде ж вычистили код от симбиана.
Цитировать
5. что там осталось, а то я подзабыл?
Да нам с тобой договорится об понимании политик, т.к. у меня понимание иное (под Win) нежели так, как реализовал ты (в Lin),
т.е. разные точки зрения.
Цитировать
6. тут без троллей никак
Ну это понятно, в принципе потом ничего не мешает тупо заменить макросы и переименовать классы.
Цитировать
7. Qt5 довольно сырая еще. Я собрал ее, запустил лингвист, был неприятно удивлен ужасному виду. Думаю, до релиза Qt5 еще долго. нужно пока работать с 4.8
А мне понравилось, виджеты в Win какие-то прям реактивные стали  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 02, 2012, 21:59
Так он и так при открытии открывается со своими настройками по умолчанию!!!
Только если ему не удается определить текущую конфигурацию - то св-во устанавливается в Unknown.

Т.е. если при открытии текущие настройки удовлетворяют пользователя - то ничего настраивать не нужно.
Он сохраняет текущие настройки порта. Т.е. открыв его пользователь не знает, как он настроен и должен проверять или тупо перенастраивать все, чтобы гарантированно работать с определенными его протоколом настройками.
Сохранение текущих настроек порта при открытии - это мало кому нужная вещь. Сейчас, после открытия, порт находится в неизвестном состоянии. Что провоцирует ошибки - в 9 случаях работает, а в одном нет.

Цитировать
2. с пропертями у меня есть свое мнение Улыбающийся
Это понятно, но не отгребем ли мы в дальнейшем проблем с функционированием и неудовольство от юзания потенциальных пользователей?
А с классами Qt как?
Цитировать
4. зачем его выкидывать? кому мешает?
Ну, она наполовину реализована, тем более, в Qt5 вроде ж вычистили код от симбиана.
Ну если вычистили, то да...
Цитировать
5. что там осталось, а то я подзабыл?
Да нам с тобой договорится об понимании политик, т.к. у меня понимание иное (под Win) нежели так, как реализовал ты (в Lin),
т.е. разные точки зрения.
        SkipPolicy - если произошла ошибка, то байт проглатывается (пользователь его не получает вообще)
        PassZeroPolicy - если произошла ошибка, то пользователь получает 0 вместо битого байта
        IgnorePolicy - если произошла ошибка, то пользователь получает то, что пришло
        StopReceivingPolicy - если произошла ошибка, то текущая операция чтения прерывается СРАЗУ ПОСЛЕ СЧИТЫВАНИЯ ПРОБЛЕМНОГО БАЙТА и выставляется соответствующая ошибка.

Цитировать
7. Qt5 довольно сырая еще. Я собрал ее, запустил лингвист, был неприятно удивлен ужасному виду. Думаю, до релиза Qt5 еще долго. нужно пока работать с 4.8
А мне понравилось, виджеты в Win какие-то прям реактивные стали  :)
Я под Linux запускал  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 02, 2012, 22:44
Цитировать
Он сохраняет текущие настройки порта. Т.е. открыв его пользователь не знает, как он настроен и должен проверять или тупо перенастраивать все, чтобы гарантированно работать с определенными его протоколом настройками.
Сохранение текущих настроек порта при открытии - это мало кому нужная вещь. Сейчас, после открытия, порт находится в неизвестном состоянии. Что провоцирует ошибки - в 9 случаях работает, а в одном нет.
Но так как предлагаешь ты - было реализовано в ранних релизах (там устанавливался при открытии режим 9600 8N1).
Эта реализация была удалена, т.к. кто-то говорил что это неправильно и приводил конкретный пример с конкретным оборудованием.

Тем более если сделаем как ты предлагаешь, если вдруг при открытии порта с установкой параметров возникнет ошибка при устрановке
любого свойства - то возвращать open() как false? Т.е. приплыли, не смогли открыть порт и установить настройки по умолчанию.
Тем более, что могут быть у-ва, которые не поддерживают 9600 8N1 и получится, что порт никогда не откроется.

Но даже если open() возвратит false, и далее по error() мы узнаем точно причину (пусть она в установке свойства) - то придется опять же по очереди перебирать
св-ва rate(), dataBits(), parity() и т.п. чтобы узнать, в каком из методов возник касяк.

Так что, имхо, это не то. Или ты имеешь ввиду что-то еще?  :)

Цитировать
А с классами Qt как?
в смысле?

Цитировать
SkipPolicy - если произошла ошибка, то байт проглатывается (пользователь его не получает вообще)
        PassZeroPolicy - если произошла ошибка, то пользователь получает 0 вместо битого байта
        IgnorePolicy - если произошла ошибка, то пользователь получает то, что пришло
        StopReceivingPolicy - если произошла ошибка, то текущая операция чтения прерывается СРАЗУ ПОСЛЕ СЧИТЫВАНИЯ ПРОБЛЕМНОГО БАЙТА и выставляется соответствующая ошибка.

Я не по это - я про факт установки parity/frame error. Да и вообще, про св-во error().
Т.е. в моем понимании error() - это не что иное - как код последней ошибки, т.е. следующая ошибка перетирает предыдущую!

Исходя из этого, при определении parity/frame error хотя бы в одном из принятых байтов в внутреннем буфере - должна быть установлена эта ошибка,
и не сниматься, пока пользователь не сбросит её.

Т.е. SerialPort автоматом читает входящие данные, анализирует их согласно конкретной политике, выставляет коды ошибок и
сохраняет данные в свой кольцевой буфер.

У тебя же ошибка устанавливается только при StopReceivingPolicy ! Что не правильно!
Реально ошибку нужно выставлять и при SkipPolicy, PassZeroPolicy !!!

Это необходимо для  того, чтобы пользователь после сигнала readyRead (в слоте) до вызова метода read(), мог например, вызвать error() и проверить - а не битые ли где-то в кольцевом буфере SerialPort данные??!! Это просто для информации.
Например, если битые - то их точно незачем читать и можно весь этот буфер очистить, не принимая этих данных - отказаться от них.
А можно и прочитать - все на совести самого пользователя.

Т.е. идея в том, что пользователь должен знать заранее состояние принятых данных в кольцевом буфере класса перед их чтением!!!

С
Цитировать
StopReceivingPolicy - если произошла ошибка, то текущая операция чтения прерывается СРАЗУ ПОСЛЕ СЧИТЫВАНИЯ ПРОБЛЕМНОГО БАЙТА и выставляется
что ты подразумеваешь под "прерывается"? Вообще прерывается ?
т.е. если имеем последовательность байт в UART (где V-валидный байт, E-байт с ошибкой)

VVVEVVVV - то в результате класс в свой кольцевой буфер прочитает только VVV, установит ошибку паритета/фрейма  и все?
На этом процесс чтения остановится навсегда, пока пользователь не сбросит error() ?
Т.е. rearyRead() грубо излучится один раз при приеме VVV и всё, а подсистема нотификации  класса просто будет читать в dev/null
все приходящие символы из UART, или они будут тупо накапливаться в UART (драйвере), пока не произойдет переполнение UART?

Поясни конкретнее принцип по StopReceivingPolicy как ты его видишь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 03, 2012, 08:15
Во-первых, должно быть два метода open. Один открывает со стандартными (или даже предустановленными - настройки менять можно до открытия) настройками, второй оставляет настройки неизменными. Если не удалось выставить настройки, то open не должна открывать порт с выставлением соответствующей ошибки. Как вариант, можно ввести функцию setup, которая за один вызов настроит все.
Как в стандартных Qt-шных классах подобные вещи сделаны? Там возвращаются коды ошибок или что? Например, у сокета.
Во-вторых, во всех режимах, кроме StopReceivingPolicy, мы сами внутри не контролируем возникновение ошибок (это стандартные режимы работы порта, поэтому нет никакого смысла что-то там придумывать). Думаю, если юзеру надо, то пусть он выставляет StopReceivingPolicy и уже тогда разбирается.
В режиме StopReceivingPolicy происходит следующее:
в порту есть данные VVVEVVVV. Пользователь по bytesAvailable() получает результат 8 (сможем победить фоновое буферизирование?). Читает. Метод read считывает только VVVE, а код ошибки выставляется Parity/Frame error. Таким образом, нет никаких проблем для продолжения чтения - ты сбрасываешь ошибку (или игнорируешь) и продолжаешь. Следующий read вернет уже VVVV.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 03, 2012, 14:12
Цитировать
Во-первых, должно быть два метода open. Один открывает со стандартными (или даже предустановленными - настройки менять можно до открытия) настройками, второй оставляет настройки неизменными. Если не удалось выставить настройки, то open не должна открывать порт с выставлением соответствующей ошибки. Как вариант, можно ввести функцию setup, которая за один вызов настроит все.
Нет, я против такого зоопарка. Я считаю, что пользователь сам напишет метод setup и т.п. если ему нужно.
И тот факт - что у нас куча конкретных методов для конкретных действий - это хорошо. Это юникс вей!
Эти методы - это кирпичики - минимальный и гибкий интерфейс класса.
Нагромождать/менять/добавлять еще что-то не имеет смысла.
Ну, можно только на крайняк переписать сеттеры так, чтобы они не возвращали значение,
а оно возвращалось в error(). Имхо, то что сейчас есть - это наилучший вариант и не нужно ничего сверху мудрить со всякими open(), setup() и т.п. !
Я против!  :)

Цитировать
Как в стандартных Qt-шных классах подобные вещи сделаны? Там возвращаются коды ошибок или что? Например, у сокета.
В том то и дело, что сокет несколько отличается от порта.

Хотя, в сокетах сеттеры типа setSocketOption() возвращают только void, но нигде не устанавливается error(), хотя в приватных кишках метод engine->setOption() возвращает bool. Т.е. тут не так однозначно: почему они не возвращают нигде код ошибки в некоторых сеттерах, почему этого не сделано??

Короче, нужно хорошо проанализировать аналогии и что-то взять, а что-то нет.

Также тут покопался в сокетах и вспомнил, что они имеют еще дополнительно такие сигналы как:
Код
C++ (Qt)
 
void connected();
void disconnected();
void error(QAbstractSocket::SocketError);
 

может быть и нам ввсести что-то похожее:
Код
C++ (Qt)
 
void opened();
void closed();
void error(SerialPort::SerialPortError);
 

?

Цитировать
Во-вторых, во всех режимах, кроме StopReceivingPolicy, мы сами внутри не контролируем возникновение ошибок (это стандартные режимы работы порта, поэтому нет никакого смысла что-то там придумывать). Думаю, если юзеру надо, то пусть он выставляет StopReceivingPolicy и уже тогда разбирается.
Нифига!
Первична - это ошибка паритета/фрейма, вторично - это уже ее обработка при помощи разных политик!
Т.е. сама ошибка паритета/фрейма никуда не делась, и о ней необходимо сигнализировать во всех  политиках кроме Ignore,
т.к. только в этом режиме мы её не анализируем вообще!

Цитировать
В режиме StopReceivingPolicy происходит следующее:
в порту есть данные VVVEVVVV. Пользователь по bytesAvailable() получает результат 8 (сможем победить фоновое буферизирование?). Читает. Метод read считывает только VVVE, а код ошибки выставляется Parity/Frame error. Таким образом, нет никаких проблем для продолжения чтения - ты сбрасываешь ошибку (или игнорируешь) и продолжаешь. Следующий read вернет уже VVVV.
В том то и дело, что первично - фоновое буферизирование - это режим по умолчанию! И побеждать его не надо, нужно отталкиваться именно от него.  :)

В буферизированном режиме bytesAvailable() возвращает кол-во байт, доступных в кольцевом буфере , а не в UART!!
В режиме же без буферизации - кол-во доступных байт в UART!!!

Поэтому в небуферизованном режиме - будет работать так как ты описал,
но в режиме с буферизацией - оно автоматом должно тогда вычитать в кольцевой буфер из UART набор VVVE, выставить ошибку,
и больше ничего в кольцевой буфер не принимать, до того как юзер сбросит error(). Т.е. остальные данные
будут накапливаться в UART пока мы не сбросим ошибку.

Но тут возникает проблема с дальнейшей генерацией сигнала readyRead(), т.е. допустим, в UART пришло именно столько байт VVVEVVVV,
подсистема нотификации по приходу первого байта вызвала внутренний обработчик для перезаписи этих данных в кольцевой буфер класса.
ОК, она записала VVV, дошла до E, записала его, выставила ошибку и все, ждем. Тут пользователь, сбросил ошибку, вычитал все данные (или не все)
из кольцевого буфера... И - что дальше? Подсистема нотификации больше не сработает (по крайней мере на винде) даже если в UART у нас
остались еще не прочитанными VVVV, поэтому юзет не получит сигнала readyRead().
Хотя, такое же поведение с отсутствием readyRead() будет и не в буферизованном режиме.

Нужно как-то принудительно заставлять класс проверять наличие непрочитанных данных в UART, т.к. подсистема нотификации
не всегда срабатывает (в гребаной винде именно так) - в линуксе оно срабатывает пока что-то есть в UART,
поэтому для линукса это не проблема :)

Также, с режимом StopReceivingPolicy  - есть опасность переполнения буфера UART, если пользователь не успеет снять ошибку error().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Март 03, 2012, 14:20
2kuzulis
По последней проблеме для венды. Можно добавить, например, таймер, который будет генерировать сигнал при возвращении в цикл обработки событий (с тайоутом = 0). И по его сигналу переэмитить сигнал readyRead. Ну и отключать его, если данных в UART нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 03, 2012, 14:27
Хотя, и с заменой сеттеров на методы, возвращающие void с записью ошибки в error() не все гладко,
например:

метод setRate() может закончится хреново со следующими кодами ошибок: UnsupportedOperation (если rate такая, что не поддерживается)
или с чем нить вроде InternalError (чисто гипотетически), т.е. метод может вернуть одну из нескольких ошибок!

Токда, проверка типа:
Код
C++ (Qt)
...
setRate()
 
if (error() == UnsupportedOperation || error() == InternalError ) {
// то точно произошла ошибка при setRate() а не при каком-то
// действии до вызова setRate().
}
...
 

Не находишь, что это как-то кривовато.
Не будет же юзер перед каждым вызовом сеттера делать unsetError() ?
Это глупо.

ИМХО, лучше убрать эти проперти вообще, и оставить гетеры/сеттеры такими какие они сейчас. т.е. с возвратом bool,
т.к. проверка:
Код
C++ (Qt)
if (!setRate()) {
   qDebug() << error();
}
 
намного правильнее и проще и короче, не находишь?  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 03, 2012, 14:28
2kuzulis
По последней проблеме для венды. Можно добавить, например, таймер, который будет генерировать сигнал при возвращении в цикл обработки событий (с тайоутом = 0). И по его сигналу переэмитить сигнал readyRead. Ну и отключать его, если данных в UART нет.

А Таймер не сильно будет грузить ОС? А если у меня мультипортовая плата с 32 портами, то 32 таймера нужно...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Март 03, 2012, 14:44
А Таймер не сильно будет грузить ОС? А если у меня мультипортовая плата с 32 портами, то 32 таймера нужно...
Так они вообще ничего ждать не будут. Как только в eventloop дело дойдет до обработки таймеров, то все активные сработают и пользователи получат свои readyRead. Если в 32 портах будут не прочитанные данные, сработаю все 32.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 03, 2012, 14:50
Цитата: BRE
Так они вообще ничего ждать не будут. Как только в eventloop дело дойдет до обработки таймеров, то все активные сработают и пользователи получат свои readyRead. Если в 32 партах будут не прочитанные данные, сработаю все 32.
Ну ка, кинь примерчик как ты это представляешь, а то я не соображу.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Март 03, 2012, 15:01
Ну ка, кинь примерчик как ты это представляешь, а то я не соображу.

Код
C++ (Qt)
// Создаем таймер
m_readyReadTimer = new QTimer;
connect( m_readyReadTimer, SIGNAL(timeout()), SIGNAL(readyRead()) );
m_readyReadTimer->setInterval( 0 );
m_readyReadTimer->setSingleShot( false );
 
 
// Я давно не смотрел как там у тебя сейчас все внутри работает... просто предположу
// В месте где ты получаешь нотификацию от венды о появлении данных
m_readyReadTimer->start();
 
 
// В том месте, где данные вычитываются из UART
if( uartEmpty() )
   m_readyReadTimer->stop();
 

В таком варианте, пришли данные, венда сообщила, запустился таймер, пользователь получил свой сигнал readyRead, вычитал часть данных и вышел из слота. Управление вернулось в цикл обработки событий, произошла проверка запущенных таймеров, такой таймер есть (m_readyReadTimer), таймаут == 0, он срабатывает, формируется сигнал timeout -> readyRead, пользователь опять получает сигнал readyRead. И пока он не вычитает все он будет его получать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 03, 2012, 19:00
2 BRE,

работает оно сейчас так:

во "внутреннем" платформо-зависимом классе Engine происходит обработка евентов от порта:
Код
C++ (Qt)
bool WinSerialPortEngine::event(QEvent *e)
{
   bool ret = false;
   if (e->type() == QEvent::WinEventAct) {
...
       if (EV_RXCHAR & m_currentMask & m_setMask) {
           m_parent->canReadNotification();
           ret = true;
       }
...
}
 

где m_parent - объект приватного класса SerialPortPrivate.

Где canReadNotification() ничем не отличается от аналогичного метода из сокетов.

Код
C++ (Qt)
bool SerialPortPrivate::canReadNotification()
{
   Q_Q(SerialPort);
 
#if defined (Q_OS_WINCE)
   m_engine->lockNotification(SerialPortEngine::CanReadLocker, true);
#endif
   // Prevent recursive calls.
   if (m_readSerialNotifierCalled) {
       if (!m_readSerialNotifierStateSet) {
           m_readSerialNotifierStateSet = true;
           m_readSerialNotifierState = m_engine->isReadNotificationEnabled();
           m_engine->setReadNotificationEnabled(false);
       }
   }
   m_readSerialNotifierCalled = true;
 
   //if (!m_isBuffered)
   //    this->serialEngine->setReadNotificationEnabled(false);
 
   // If buffered, read data from the serial into the read buffer.
   qint64 newBytes = 0;
   if (m_isBuffered) {
       // Return if there is no space in the buffer.
       if (m_readBufferMaxSize
               && (m_readBuffer.size() >= m_readBufferMaxSize)) {
 
           m_readSerialNotifierCalled = false;
           return false;
       }
 
       // If reading from the serial fails after getting a read
       // notification, close the serial.
       newBytes = m_readBuffer.size();
 
       if (!readFromPort()) {
           m_readSerialNotifierCalled = false;
           return false;
       }
       newBytes = m_readBuffer.size() - newBytes;
 
       // If read buffer is full, disable the read serial notifier.
       if (m_readBufferMaxSize
               && (m_readBuffer.size() == m_readBufferMaxSize)) {
 
           m_engine->setReadNotificationEnabled(false);
       }
   }
 
   // Only emit readyRead() when not recursing, and only if there is data available.
   bool hasData = (m_isBuffered) ? (newBytes > 0) : (bytesAvailable() > 0);
 
   if ((!m_emittedReadyRead) && hasData) {
       m_emittedReadyRead = true;
       emit q->readyRead();
       m_emittedReadyRead = false;
   }
 
   if ((!hasData) && m_engine->isReadNotificationEnabled())
       m_engine->setReadNotificationEnabled(true);
 
   // Reset the read serial notifier state if we reentered inside the
   // readyRead() connected slot.
   if (m_readSerialNotifierStateSet &&
           (m_readSerialNotifierState != m_engine->isReadNotificationEnabled())) {
 
       m_engine->setReadNotificationEnabled(m_readSerialNotifierState);
       m_readSerialNotifierStateSet = false;
   }
   m_readSerialNotifierCalled = false;
   return true;
}
 

в этом методе есть метод readFromPort() который также ничем практически не отличается от метода readFromSocket() из сокетов
и который, собственно и читает данные из порта в кольцевой буфер класса m_readBuffer.
Код
C++ (Qt)
bool SerialPortPrivate::readFromPort()
{
   qint64 bytesToRead = (m_policy == SerialPort::IgnorePolicy) ?
               bytesAvailable() : 1;
 
   if (bytesToRead <= 0)
       return false;
 
   if (m_readBufferMaxSize
           && (bytesToRead > (m_readBufferMaxSize - m_readBuffer.size()))) {
 
       bytesToRead = m_readBufferMaxSize - m_readBuffer.size();
   }
 
   char *ptr = m_readBuffer.reserve(bytesToRead);
   qint64 readBytes = read(ptr, bytesToRead);
 
   if (readBytes <= 0) {
       m_readBuffer.chop(bytesToRead);
       return false;
   }
   m_readBuffer.chop(int(bytesToRead - ((readBytes < 0) ? qint64(0) : readBytes)));
   return true;
}
 

ну и в нем, собственно метод read(), который делает вызов m_engine->read(data, len);
где m_engine->read - это платформо-зависимый метод чтения данных из порта,
в котором происходит обработка политик и установка ошибок паритета/фрейма
Код
C++ (Qt)
qint64 WinSerialPortEngine::read(char *data, qint64 len)
{
#if !defined (Q_OS_WINCE)
   clear_overlapped(&m_ovRead);
#endif
 
   DWORD readBytes = 0;
   bool sucessResult = false;
 
   // FIXME:
   if (m_parent->m_policy != SerialPort::IgnorePolicy)
       len = 1;
 
#if defined (Q_OS_WINCE)
   sucessResult = ::ReadFile(m_descriptor, data, len, &readBytes, 0);
#else
   if (::ReadFile(m_descriptor, data, len, &readBytes, &m_ovRead))
       sucessResult = true;
   else {
       if (::GetLastError() == ERROR_IO_PENDING) {
           // FIXME: Instead of an infinite wait I/O (not looped), we expect, for example 5 seconds.
           // Although, maybe there is a better solution.
           switch (::WaitForSingleObject(m_ovRead.hEvent, 5000)) {
           case WAIT_OBJECT_0:
               if (::GetOverlappedResult(m_descriptor, &m_ovRead, &readBytes, false))
                   sucessResult = true;
               break;
           default: ;
           }
       }
   }
#endif
 
   if(!sucessResult) {
       m_parent->setError(SerialPort::IoError);
       return -1;
   }
 
   // FIXME: Process emulate policy.
   if (m_flagErrorFromCommEvent) {
       m_flagErrorFromCommEvent = false;
 
       switch (m_parent->m_policy) {
       case SerialPort::SkipPolicy:
           return 0;
       case SerialPort::PassZeroPolicy:
           *data = '\0';
           break;
       case SerialPort::StopReceivingPolicy:
           break;
       default:;
       }
   }
   return qint64(readBytes);
}
 

----------

Так вот, это я к чему: куда сюда вставить то, что ты предложил?
Я не пойму что-то все-равно?

Если не трудно, а то что-то голова не варит  :(

И к слову, надо же принудительно не еммитить readyRead() - а принудительно вызывать метод canReadNotification() и
то только в случае, если в UART еще имеются непрочитанные данные,
а также учесть тот факт, что могут также и придти и еще несколько байт в UART  и следовательно,
подсистема нотификации тоже вызовет canReadNotification() - получится, что он вызовется дважды!



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: BRE от Март 03, 2012, 19:36
Идея такая. Если венда посылает уведомление только один раз, то нам нужен кто-то, кто будет ее замещать и генерировать сигнал readyRead вместо нее, пока есть данные.
Для этого хорошо подходит таймер. Завязываем его сигнал timeout на наш readyRead. Теперь нам нужно его вовремя запускать и останавливать.
Запускать я думаю можно будет в canReadNotification, перед посылкой сигнала readyRead.
Останавливать наверное можно и в readFromPort, и в canReadNotification - когда поняли, что данных в порту уже нет.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 03, 2012, 19:55
Ааа.. ок. спасибо, обмозгуем.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 03, 2012, 22:57
Цитировать
Во-первых, должно быть два метода open. Один открывает со стандартными (или даже предустановленными - настройки менять можно до открытия) настройками, второй оставляет настройки неизменными. Если не удалось выставить настройки, то open не должна открывать порт с выставлением соответствующей ошибки. Как вариант, можно ввести функцию setup, которая за один вызов настроит все.
Нет, я против такого зоопарка. Я считаю, что пользователь сам напишет метод setup и т.п. если ему нужно.
И тот факт - что у нас куча конкретных методов для конкретных действий - это хорошо. Это юникс вей!
Эти методы - это кирпичики - минимальный и гибкий интерфейс класса.
Нагромождать/менять/добавлять еще что-то не имеет смысла.
Я не предлагаю отказаться от возможности раздельной настройки всех параметров. Я просто хочу уменьшить количество потенциальных ошибок, связанных с undefined behaviour после открытия порта. Сейчас человек каждый раз для настройки должен писать несколько вызовов функций. А теперь представь, что он забыл написать один из вызовов. У него все работает, а у заказчика нет - у него по умолчанию настройки другие и именно эту настройку он не трогал. Поэтому я и предлагаю как-то решить эту проблему, чтобы программист ВСЕГДА получал одинаковые настройки при открытии порта. Но если ему нужно открыть порт без изменения настроек, то для этого должна быть возможность.

Ну, можно только на крайняк переписать сеттеры так, чтобы они не возвращали значение,
а оно возвращалось в error(). Имхо, то что сейчас есть - это наилучший вариант и не нужно ничего сверху мудрить со всякими open(), setup() и т.п. !
Я против!  :)

Цитировать
Как в стандартных Qt-шных классах подобные вещи сделаны? Там возвращаются коды ошибок или что? Например, у сокета.
В том то и дело, что сокет несколько отличается от порта.

Хотя, в сокетах сеттеры типа setSocketOption() возвращают только void, но нигде не устанавливается error(), хотя в приватных кишках метод engine->setOption() возвращает bool. Т.е. тут не так однозначно: почему они не возвращают нигде код ошибки в некоторых сеттерах, почему этого не сделано??

Короче, нужно хорошо проанализировать аналогии и что-то взять, а что-то нет.
Я так подумал, на свойства действительно можно забить... Кому они нужны?

Также тут покопался в сокетах и вспомнил, что они имеют еще дополнительно такие сигналы как:
Код
C++ (Qt)
 
void connected();
void disconnected();
void error(QAbstractSocket::SocketError);
 

может быть и нам ввсести что-то похожее:
Код
C++ (Qt)
 
void opened();
void closed();
void error(SerialPort::SerialPortError);
 

?
Нахрена? В отличие от сокета, порт открывается в синхронном режиме. А на случай закрытия у QIODevice уже есть сигнал.

Цитировать
Во-вторых, во всех режимах, кроме StopReceivingPolicy, мы сами внутри не контролируем возникновение ошибок (это стандартные режимы работы порта, поэтому нет никакого смысла что-то там придумывать). Думаю, если юзеру надо, то пусть он выставляет StopReceivingPolicy и уже тогда разбирается.
Нифига!
Первична - это ошибка паритета/фрейма, вторично - это уже ее обработка при помощи разных политик!
Т.е. сама ошибка паритета/фрейма никуда не делась, и о ней необходимо сигнализировать во всех  политиках кроме Ignore,
т.к. только в этом режиме мы её не анализируем вообще!
Почему-то мне всю жизнь казалось, что в винде ошибки четности/фрейма можно не замечать, исключать поврежденный байт и занулять его. Причем во всех этих случаях никакие флаги нигде не сигнализируют об ошибках. И только в одном режиме, можно ловить событие об ошибке...
Если так подумать, то зануление и исключение вообще не имеют особого смысла на практике. А игнор можно реализовать через stopreading. Думаю, надо еще раз обмозговать это дело...
Цитировать
В режиме StopReceivingPolicy происходит следующее:
в порту есть данные VVVEVVVV. Пользователь по bytesAvailable() получает результат 8 (сможем победить фоновое буферизирование?). Читает. Метод read считывает только VVVE, а код ошибки выставляется Parity/Frame error. Таким образом, нет никаких проблем для продолжения чтения - ты сбрасываешь ошибку (или игнорируешь) и продолжаешь. Следующий read вернет уже VVVV.
В том то и дело, что первично - фоновое буферизирование - это режим по умолчанию! И побеждать его не надо, нужно отталкиваться именно от него.  :)
Так в чем дело? Буферизируй с учетом ошибок (т.е. вместо одного байта - два).

В буферизированном режиме bytesAvailable() возвращает кол-во байт, доступных в кольцевом буфере , а не в UART!!
В режиме же без буферизации - кол-во доступных байт в UART!!!
Не вижу противоречий со сказанным мной. То что я говорил - это уровень пользователя, а не внутренней реализации. Так как он первичен, и реализация должна под него подстраиваться.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 04, 2012, 18:48
Вмержили изменения, связанные с первым шаблоном документации.

И, кстати, я там закоментировал все проперти (раз уж они нафик не нужны), т.к. при генерации документации и при наличии проперти - необходимо удалить
описания методов геттеров/сетерров этого проперти, а вместо них - описать именно сами проперти.

И кстати, про gerrit, объясните мне суть inline комментариев и драфтов..
Зачем там два варианта ответов: "Ответить" и "Ответить готово", и воообще, в чем соль?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 04, 2012, 19:21
смысл inline в том, чтобы ты видел, что именно вызвало вопрос.
при выборе ответить, твой ответ становится "черновиком", а обеляется при нажатии на review (можно несколько ответов/комментариев за раз сделать). А "ответить готово", я так думаю, сразу набело.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 04, 2012, 20:34
2 b-s-a


Цитировать
смысл inline в том, чтобы ты видел, что именно вызвало вопрос.
при выборе ответить, твой ответ становится "черновиком", а обеляется при нажатии на review (можно несколько ответов/комментариев за раз сделать). А "ответить готово", я так думаю, сразу набело.
Так для чего это "набело"/"начерно" нужно то? Не пойму, что это дает?

Цитировать
Я не предлагаю отказаться от возможности раздельной настройки всех параметров. Я просто хочу уменьшить количество потенциальных ошибок, связанных с undefined behaviour после открытия порта. Сейчас человек каждый раз для настройки должен писать несколько вызовов функций. А теперь представь, что он забыл написать один из вызовов. У него все работает, а у заказчика нет - у него по умолчанию настройки другие и именно эту настройку он не трогал. Поэтому я и предлагаю как-то решить эту проблему, чтобы программист ВСЕГДА получал одинаковые настройки при открытии порта. Но если ему нужно открыть порт без изменения настроек, то для этого должна быть возможность.
Ок, если у тебя будет время - то сделай ревью для своих идей - а я буду минусовать (или плюсовать) :)

Цитировать
Почему-то мне всю жизнь казалось, что в винде ошибки четности/фрейма можно не замечать, исключать поврежденный байт и занулять его.
Ну да, там есть "аппаратная" возможность это делать - но она работает через Ж. , и трудно ее пристроить (по крайней мере у меня не получилось).
И, кстати, я об этом уже писал.

Но я не использую эту "фичу", вместо нее я эмулирую эти политики через другую фичу - евент EV_ERROR, который возникает всегда при
ошибках паритета/фрейма (если не ошибаюсь).

Суть в том, что этот евент EV_ERROR приходит всегда(?) раньше чем евент EV_RXCHAR, поэтому мы успеваем по евенту  EV_ERROR выполнить processIOErrors(),
выяснить, что же именно за ошибка: паритета или фрейма или break, установить ее в error() и взвести флаг m_flagErrorFromCommEvent.

Код
C++ (Qt)
bool WinSerialPortEngine::processIOErrors()
{
   DWORD err = 0;
   COMSTAT cs;
   bool ret = (::ClearCommError(m_descriptor, &err, &cs) != 0);
   if (ret && err) {
       if (err & CE_FRAME)
           m_parent->setError(SerialPort::FramingError);
       else if (err & CE_RXPARITY)
           m_parent->setError(SerialPort::ParityError);
       else if (err & CE_BREAK)
           m_parent->setError(SerialPort::BreakConditionError);
       else
           m_parent->setError(SerialPort::UnknownPortError);
 
       m_flagErrorFromCommEvent = true;
   }
   return ret;
}
 

Где флаг m_flagErrorFromCommEvent будет использован в дальнейшем в методе read() при обработке политик,
после приема EV_RXCHAR (который идет строго за EV_ERROR)

Код
C++ (Qt)
qint64 WinSerialPortEngine::read(char *data, qint64 len)
{
...
...
 
   // FIXME: Process emulate policy.
   if (m_flagErrorFromCommEvent) {
       m_flagErrorFromCommEvent = false;
 
       switch (m_parent->m_policy) {
       case SerialPort::SkipPolicy:
           return 0;
       case SerialPort::PassZeroPolicy:
           *data = '\0';
           break;
       case SerialPort::StopReceivingPolicy:
           break;
       default:;
       }
   }
   return qint64(readBytes);
}
 

т.е. вот так оно работает сейчас в винде.
Это просто к сведению, для тебя, (т.к. ты скорее всего не особо разбирался с виндой - а все ближе с nix),
вдруг - предложишь что-нить получше, или свою nix-овую реализацию под это подгонишь (или я к никсовой подгоню) :)

В общем, тут нужно придти к общему мнению - как оно должно работать и как это реализовать для всех ОС.

Цитировать
Я так подумал, на свойства действительно можно забить... Кому они нужны?
Согласен, закоментировал, потом можно избавиться от них.

Цитировать
Нахрена? В отличие от сокета, порт открывается в синхронном режиме. А на случай закрытия у QIODevice уже есть сигнал.
Ну, хотя бы сигнал error реализовать (как в сокетах), для того, чтобы можно было по нему построить подробный последовательный лог ошибок.
Если это, конечно, не загрузит Event Loop.

Цитировать
Так в чем дело? Буферизируй с учетом ошибок (т.е. вместо одного байта - два).
Ни в чем, посто нужно было определиться с поведением при политиках, придти к общему мнению.
А реализовать это, думаю не проблема.

Цитировать
Не вижу противоречий со сказанным мной. То что я говорил - это уровень пользователя, а не внутренней реализации. Так как он первичен, и реализация должна под него подстраиваться.
Не, я не спорю, просто я на всякий случай уточнил особенности работы с буферизацией и без.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 04, 2012, 21:03
Цитировать
Так для чего это "набело"/"начерно" нужно то? Не пойму, что это дает?
Чтобы ты мог за один раз поставить комментарии к нескольким файлам. А не создавать review для каждого коммента.

Что я предлагаю для решения проблемы с UB следующие варианты:
1. Ввести еще одну константу типа OpenMode, которая будет означать, что порт открывается без настройки. Если она не указана, то порт открывается с начальными настройками. Рекомендую: 9600n8, один стоп.
2. Сделать еще один метод открытия порта - openUnconfigured. Или типа того. В этом случае, метод open всегда открывает задавая некие настройки.
3. Сделать свойство, которое влияет на начальное конфигурирование при открытии: configureOnOpen. По умолчанию, true. В этом случае, задаются текущие настройки порта (которые сделаны ДО открытия).
4. Сделать метод setup(...) для настройки всего в один вызов.

Мне наиболее нравится 3-й вариант.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 04, 2012, 22:04
Упс, китайцы нас обошли http://qt-project.org/wiki/Category:Add-ons::QextSerialPort

 :-[

Пиар у них эффективнее.

Мож и нам на вики запостить что-нить, для пиара? А то чую сольем...  :-\

Самое интересное, что этот самый dbzhang800 знает о существовании аддона QtSerialPort (даже он мне на список рассылки ответил) - но упорно продолжает проталкивать QextSerialPort как аддон..

Не пойму я этих китайцев...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 05, 2012, 07:59
В любом случае, QtSerialPort уже в playground, а QextSerialPort нет. Хотя, wiki нужно бы написать. Для начала, на русском. А потом коряво перевести и попросить кого-нибудь подретушировать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 05, 2012, 09:53
Почитал про ВиКи на qt-project.org, и в хелпе написано, что желательно использовать
песочницу для экспериментов http://qt-project.org/wiki/Playground

Я так понимаю, что сначала нужно нарисовать в песочнице об QtSerialPort,
примерно прикинуть о чем писать и т.п., а потом, когда получится нормально - то
создать нормальную ВиКи страницу.

Но непонятен момент с песочницей: в песочнице сказано "Use this page for your wiki markup experiments."
Вопрос: это означает, что я тупо могу жмакнуть в Wiki Menu (справа в колонке) "Edit" и редактировать её,
или же мне нужно жмакнуть "Create new page" и редактировать?

Я что-то не понял.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 05, 2012, 11:36
делай в корне и на русском.
думаю, в вики стоит написать кратное описание, фичи, особенности и простейший туториал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 05, 2012, 22:09
В принципе набросал ВиКи.

Тут (https://qt-project.org/wiki/QtSerialPort_Russian) русский вариант, для остальных языков пустые страницы.

Просьба ко всем дополнить, исправить, подставить ссылочки и т.п если нужно.
У меня что-то мыслей нет о чем писать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 05, 2012, 23:11
Немного подкорректировал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 06, 2012, 09:49
Спасибо. :)

Есть еще пара вопросов:
1. Есть ли возможность в ВиКи делать примечания? Я что-то не нашел.
Я б хотел написать про симбиан в примечании
(*)- типа что скорее всего поддержка симбиана будет удалена (или не будет развиваться).
Или убрать эти примечания (*) ?
2. Нужно как-то получше написать про Сборку и установку, а то какая то белиберда получилась.
3. Нужно ли как-то где-то указать, что QtSerialPort разрабатывается предназначен для Qt5?
4. Нужно ли в фичах для SerialPort перечислить его возможности типа: установка скорости, .... отслеживание ошибок паритета/фрейма, обработка политик и т.п.? Или это будет лишнее...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 06, 2012, 10:22
думаю, писать про стандартные фишки смысла нет. Только про особенности.
Цитировать
3. Нужно ли как-то где-то указать, что QtSerialPort разрабатывается предназначен для Qt5?
На мой взгляд, надо его еще позиционировать и для Qt 4.8. Так как Qt 5 еще даже в бранч не выделен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 06, 2012, 22:43
Ну, вроде дописал Вики.
Осталось что придумать написать в "Новости" и "Возможные проблемы"

В "Новости" можно ничего не писать - оставить пустыми
В "Возможные проблемы" я бы написал про то, что если кто-то находит баг - то куда его постить.
Но я не знаю, т.к. нет для QtSerialPort баг-трекера.

В общем, подправьте кто нить.

Вопрос: Кто возьмется перевести эту Вики страничку на английский после её ревизии и утверждения?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 09, 2012, 22:03
Я через гугл транслит накалякал английскую ВиКи. Просьба - подредактировать.

http://qt-project.org/wiki/QtSerialPort


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 10, 2012, 10:59
заменил "инструментарий" на "библиотеку" в кратком описании.
Я вот думаю, может добавить краткое описание интерфейса класса, а так же какой-нибудь простейший пример использования.
Кстати, ты лицензионные соглашения в хидеры уже напихал? Может все-таки какую-нибудь BSD или MIT использовать, для повышения популярности?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 10, 2012, 12:46
Цитировать
Я вот думаю, может добавить краткое описание интерфейса класса, а так же какой-нибудь простейший пример использования.
А зачем? Для этого документация имеется с примерами и т.п.

Можно просто сгенерить html документацию, разместиьт ее на qt-project.org (правда, хз, можно ли это), а потом в ВиКи вставить ссылки на документацию.

Цитировать
Кстати, ты лицензионные соглашения в хидеры уже напихал?
нет еще.

Цитировать
Может все-таки какую-нибудь BSD или MIT использовать, для повышения популярности?
Врядли. Мариус говорил что лицензия будет такая-же как и для Qt.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 10, 2012, 13:54
Никто не мешает BSD сменить на LGPL. А вот обратно уже нельзя.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 14, 2012, 15:37
Может быть, все-таки, в SerialPortInfo добавить поддержку VID/PID ?
т.к. это тоже важная информация!

Некоторым пользователям необходимы эти ID-ы в разработке приложений.
Меня уже часто спрашивают: "А на# я убрал это из библиотеки?"

А я и сам не знаю зачем (повелся), ИМХО, они не мешали.

 :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 15, 2012, 07:31
Ты для всех платформ их сможешь поддержать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 15, 2012, 09:42
Для Win NTx, Gnu/Lin (с использованием libudev), MacOSX - вполне реально.

Для всех иных (включая Symbian, FreeBSD, WinCE) даже description, manufacturer невозможно определить,
но description и manufacturer присутствуют в классе.

Хотя, для FreeBSD, начиная с 9 (вроде) это можно сделать для USB/PCI устройств используя ядрёное АПИ (или типа того),
но связать информацию, полученную от АПИ с каким-то у-вом в /dev не получится.
Я уже спрашивал об этом на винграде  (http://forum.vingrad.ru/forum/topic-342408/kw-free-bsd-serial-ports-info.html)и на девелоперском BSD-шном форуме  (http://forums.freebsd.org/showthread.php?t=27893)

Так, что в любом случае, во всех ОС, отличных от трех самых распростаненных выйдет засада со всеми параметрами.

На крайняк, не поддерживаемые параметры просто будут возвращать "Unknown".

Кстати, а что лучше возвращать при невозможности получения того или иного параметра?
Пустую строку, "Unknown", "Undefined", "Not exist" , свой вариант...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 15, 2012, 15:58
0 для целых и QString() для строк


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 15, 2012, 16:25
Ну так ты согласен насчет добавки VID/PID?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 15, 2012, 16:30
ну если народ так просит...
Кстати, а vid и pid 16-ти разрядные? Если да, то в качестве ошибки можно возвращать -1.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 15, 2012, 16:37
Эмм... вообще-то предполагалось, что они будут в строковом виде, т.к. нативно они извлекаются в виде строк.

Пусть уж будут в виде строки, а если не найдена - то возвращать QString(), Ок?

ЗЫ: Там от тебя еще нужен code review насчет установки Custom Baud Rate. Я добавил решение из мержа на гиториусе,
но не знаю, корректно или нет упростил его. Нужет твой наметаный глаз. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 16, 2012, 14:12
Эмм... вообще-то предполагалось, что они будут в строковом виде, т.к. нативно они извлекаются в виде строк.
Если они содержат числовые значения, то зачем оставлять в виде строк? Числа намного проще использовать потом.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 16, 2012, 19:06
1.
Цитировать
Если они содержат числовые значения, то зачем оставлять в виде строк? Числа намного проще использовать потом.
Дык все-равно придется преобразовывать из строки в число..
А если кому-то нужно в виде строки - то получится цепочка "строка-число-строка"
Зачем многократные преобразования? Кому надо - сам в число перегонит. ИМХО.

2.
Еще предложение: может быть, лучше отказаться от использования превиксов m_ для членов класса?
А то мозолят глаза

3.
И кстати, что ты написал про reference в Gerrit? Что ты имел ввиду?
Упс, понял - надо & подставить..

И почему заполнять хеш нужно именно в standardRatesMachTable()?
Упс, тоже понял...

И что означает твой комментарий "So please do not squash unrelated changes." ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 17, 2012, 10:14
1. на мой взгляд, число должно быть числом.
2. ну так откажись. это твоя фишка. В моем стиле атрибуты имеют только подчеркивание в конце (value_).

squash unrelated changes - не объединяй несвязанные изменения. У тебя в одном месте изменения с таблицей скоростей, а в другом исправление ошибки. надо разделить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 17, 2012, 12:12
Цитировать
1. на мой взгляд, число должно быть числом.
Да, если бы оно в системе хранилось в виде числа - то я полностью согласен.
В данном же случае это не так.

Цитировать
2. ну так откажись. это твоя фишка. В моем стиле атрибуты имеют только подчеркивание в конце (value_).
Значит уберу префикс m_ и сделаю аналогично тому, как в в основном сделано в большинстве подмодулей /qtbase.

И еще: что тебе не понравилось с хешем на Gerrit? Объясни.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 17, 2012, 19:31
сейчас сделано более или менее нормально. Вот только не уверен, что QHash это нормальный выбор. Может лучше просто статический массив вообще, а искать через qLowerBound (скорости же в порядке возрастания).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 17, 2012, 21:40
Цитировать
Может лучше просто статический массив вообще, а искать через qLowerBound (скорости же в порядке возрастания).

Я думал об этом.. но:

В одну сторону поиска (от значения 9600 к коду B9600) - да, тут 9600 и т.п по возрастанию идет.
Но необходим также поиск и в другую сторону (от B9600 к 9600) - тут я не уверен, что константы Bxyz тоже идут по возрастанию,
да и не факт вообще, т.к. в разных *nix они могут иметь какое угодно значение.

Поэтому я и выбрал QHash как золотую середину.

Значит мне мержить? Или как?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 18, 2012, 09:15
А как hash позволяет искать в обратную сторону? Кстати, в обратную сторону искать надо исключительно 1 раз при определении текущих настроек при открытии порта. Думаю, что в этом случае тупой перебор всех элементов массива будет достаточен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 18, 2012, 10:24
Цитировать
А как hash позволяет искать в обратную сторону?
В смысле?

Код
C++ (Qt)
QHash<int, int> h;
 
h[9600] = B9600;
h[115200] = B115200;
 
int rate = h.key(B115200);

Цитировать
Думаю, что в этом случае тупой перебор всех элементов массива будет достаточен.
Зачем? Зачем загромождать код еще и перебором? Зачем что-то городить?

Я считаю, что QHash самое оно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 18, 2012, 22:57
имхо, цена, которую ты платишь за QHash (как и другой контейнер) выше, чем ты получаешь выигрыш в данном случае. Так как элементов у тебя не тысячи, и поэтому, выигрыша по сравнению с QMap может вообще и не быть. Особенно, если участь частоту обращения к этому хэшу. А вот память в куче выделяться будет. Для каждого ключа будет считаться хэш при каждом обращении. Имхо, оно того не стоит...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 19, 2012, 10:14
Цитировать
Для каждого ключа будет считаться хэш при каждом обращении. Имхо, оно того не стоит...
Предлагаешь заменить на QMap ? Чисто из-за экономии памяти или из-за чего?

ЗЫ: В описании на QHash сказано что он быстрее чем QMap...

Я просмотрел исходники Qt на предмет юзания QHash - так там он используется повсеместно. А вот бинарного поиска по статическому массиву я вообще нигде не нашел.

Ок, давай я пока переправлю имена приватных членов класса,добавив обратно префикс m_ (хотя, в самих исходниках Qt не везде они ставят этот префикс для приватных членов),
а потом ты предолжишь что-то более лучшее чем контейнеры QHash и QMap для поиска по "двумерному" статическому массиву ко каждому "измерению".

Идет? :)

--

Я подправил имена приватных членов...
Глянь, плз, на что там бот ругается, а то я не пойму..
Как обойти этот санити бот? обошел :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 20, 2012, 22:35
2 b-s-a

Касаемо твоего предложения в gerrit по поводу дополнительного класса:

1. как я понял, ты предлагаешь добавить приватный класс SerialPortEnginePrivate, который
будет тупо предоставлять только список стандартных baud rate и их конвертацию из одного вида в другой?

2. этот класс в твоих мыслях должен быть кросс-платформенным или быть заточенным только для *nix?

Если кросс-платформенным - то непонятно как в нем объединить эти все платформы.
Например, для симбиана, *nix нативные константы скорости задефайнены по-разному.

Как в твоем понимании должны выглядель к примеру метод

symbian
Код
C++ (Qt)
quint32 settingsFromRate(TBps rate)
 
где rate - это enum (если не изменяет память, сейчас не имею установленного QtSDK)

*nix
Код
C++ (Qt)
quint32 settingsFromRate(quint32 rate)
 
где rate - это константа вида Bxyz

для разных ОС, объединенный в одном классе SerialPortEnginePrivate.

Приведи код :)

3. Как ты предполагаешь выполнить реализацию SerialPortEnginePrivate, в части хранения таблицы скоростей,
в виде QHash или статического "двумерного" массива?

И если в виде массива - то приведи код каждого (из трех тобой предложенных) метода,
а то я на QHash быстренько налабаю и будешь опять "ругаться" :)





Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 20, 2012, 23:05
Я не предлагаю добавлять новый класс. Я предлагаю использовать существующий. Для каждой платформы уже есть такой. Вот в него и надо добавить эти три статических публичных метода.
что ж ты так любишь плодить классы? То класс опций, теперь чуть было стандартных скоростей не сделал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 21, 2012, 10:01
Цитировать
Я не предлагаю добавлять новый класс. Я предлагаю использовать существующий. Для каждой платформы уже есть такой. Вот в него и надо добавить эти три статических публичных метода.

1. Так существующий - это SerialPorEngine, а не SerialPorEnginePrivate
2. SerialPorEngine - чисто абстрактный класс, который неимеет нигде своей реализации (т.е. нету файлов serialportengine.cpp и т.п.),
поэтому появляется вопрос: а куда собственно втыкать реализацию этих трех методов?

Например, можно втыкнуть эти статические методы не в базовый SerialPorEngine - а в наследуемые WinSerialPorEngine, UnixSerialPorEngine.
И тогда в соответствующем платформо-зависимом SerialPorInfo_mac/linux/win сделать инклуды соответствующих WinSerialPorEngine, UnixSerialPorEngine и т.п.

т.е.

serialportengine_unix_p.h
Код
C++ (Qt)
class UnixSerialPortEngine : public QObject, public SerialPortEngine
{
...
public:
   static qint32 settingsFromRate(qint32 rate);
   static qint32 rateFromSettings(qint32 rate);
   static QList<qint32> standardRates();
...
}
 

serialportengine_win_p.h
Код
C++ (Qt)
class WinSerialPortEngine : public QWinEventNotifier, public SerialPortEngine
{
...
public:
   // Но тут для Windows вообще не понятно, нужны ли эти преобразования вообще?
   // т.к. rate имеет реальное числовое значение и нет необходимости его преобразовывать.
   static qint32 settingsFromRate(qint32 rate);
   static qint32 rateFromSettings(qint32 rate);
   static QList<qint32> standardRates();
...
}
 

serialportengine_symbian_p.h
Код
C++ (Qt)
class SymbianSerialPortEngine : public QObject, public SerialPortEngine
{
...
public:
   static qint32 settingsFromRate(IBps rate);
   static TBps rateFromSettings(qint32 rate);
   static QList<qint32> standardRates();
...
}
 

далее, в

serialportinfo_unix.cpp
Код
C++ (Qt)
...
#include "serialportengine_unix_p.h"
...
...
qint32 rate = UnixSerialPortEngine::settingsFromRate(B9600);
...
 

serialportinfo_mac.cpp
Код
C++ (Qt)
...
#include "serialportengine_unix_p.h"
...
...
qint32 rate = UnixSerialPortEngine::settingsFromRate(B9600);
...
 

serialportinfo_win.cpp
Код
C++ (Qt)
...
#include "serialportengine_win_p.h"
...
...
// Тут вообще под сомнением, нужно ли это.
qint32 rate = WinSerialPortEngine::settingsFromRate(9600);
...
 

serialportinfo_symbian.cpp
Код
C++ (Qt)
...
#include "serialportengine_symbian_p.h"
...
...
qint32 rate = SymbianSerialPortEngine::settingsFromRate(EBps9600);
...
 

Цитировать
что ж ты так любишь плодить классы?
ООП :)

3.
Цитировать
То класс опций, теперь чуть было стандартных скоростей не сделал.
Дык для опций - это логично, раз они одинаковые для всех платформ - то логичнее их разместить в одном месте,
тем более, в этом случае нет необходимости придумывать им новые имена.
Т.к. из-за того, что я убрал для них префикс m_ , то для некоторых опций их имена стали такие-же как и имена методов этого класса, что
вызывало ошибки компиляции.

ИМХО, я не вижу проблем с использованием отдельного класса для опций.

4. Ты не ответил насчет реалзации хранения таблицы в виде QHash или статик аррай...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 21, 2012, 11:33
settingFromRate принимает 9600 и возвращает B9600, а вот rateFromSetting наоборот. Причем, первая может вернуть 0, а вот вторая нет.
тип настройки зависит от платформы.
Для Windows делать нужно только один метод standardRates().
Реализация поиска по статическому массиву уже имеется в реализации SerialPortInfo под unix. Там надо лишь заменить элементы массива на структуры: {rate, setting}. Сортировка должна быть по полю rate. Ну и нужно у этой структуры оператор меньше определить (сравнивать по rate), чтобы поиск работал. А так же сделай функтор для поиска rate по setting (равно/не равно). Этот поиск будет простым перебором.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 21, 2012, 15:55
Забацай ка примерчик, если не сложно :)

ЗЫ: ты предложил - "тебе и карты в руки" (с)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 21, 2012, 20:14
Код
C++ (Qt)
struct BaudRate
{
  int rate;
  int setting; //int можно заменить на подходящий тип для данной ОС
  bool operator<(const BaudRate &other) const { return rate < other.rate; }
  bool operator==(const BaudRate &other) const { return setting == other.setting; }
};
 
static const BaudRate baudRates[] =
{
//...
  {9600, B9600},
//...
};
 
static const BaudRate *baudRates_end = baudRates + sizeof(baudRates)/sizeof(*baudRates);
 
int UnixSerialPortEngine::rateFromSetting(int setting)
{
  const BaudRate br = {0, setting};
  const BaudRate *ret = qFind(baudRates, baudRates_end, br);
  return (ret != baudRates_end) ? ret->rate : 0;
}
 
int UnixSerialPortEngine::settingFromRate(int rate)
{
  const BaudRate br = {rate, 0};
  const BaudRate *ret = qBinaryFind(baudRates, baudRates_end, br);
  return (ret != baudRates_end) ? ret->rate : 0;
}
 
QList<int> UnixSerialPortEngine::standardRates()
{
  QList<int> ret;
  for(const BaudRate *it = baudRates; it != baudRates_end; ++it)
     ret.append(it->rate);
  return ret;
}


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 22, 2012, 09:44
2 b-s-a,

А тебя не настораживает тот факт, что ::standardRates() при каждом вызове будет заново заполняться?
Не проще ли все-таки использовать QHash ? :)

PS: Что по этому поводу думают другие участники форума?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 22, 2012, 14:25
Честно говоря, не настораживает. Функция редко используемая (т.е. не ежесекундно). Ну а тот, кто использует часто - ССЗБ.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 22, 2012, 16:27
OK, сделаю :)

Следующая задача:

я озадачился производительностью операций I/O и положение удручающее (по крайней мере в Windows).

Под виндой планирую перейти на полностью асинхронные операции, используя приватный класс из
Цитировать
src\corelib\io\qwinoverlappedionotifier_p.h
и процесс чтения выполнить аналогично реализации в
Цитировать
src\corelib\io\qwindowspipereader_p.h

Модификации подвергнутся нативные методы Engine::read/write, т.е.

Цитировать
вместо read() будут два метода startAsyncRead() и completeAsyncRead()
вместо write() будут два метода startAsyncWrite() и completeAsyncWrite()

в принципе, для операции write достаточно только startAsyncWrite().

т.е. цепочка при чтении предполагается примерно такая:

при евенте об приходе данных в UART:
WinSerialPortEngine::event() -> SerialPortPrivate::canReadNotification(true) ->WinSerialPortEngine::startAsyncRead(*data, len)

при уведомлении об завершении I/O
void WinSerialPortEngine::notify(int bytesTransferred, int error) -> SerialPortPrivate::canReadNotification(false) -> WinSerialPortEngine::completeAsyncRead()


serialportengine_win.cpp
Код
C++ (Qt)
bool WinSerialPortEngine::event(QEvent *e)
{
   bool ret = false;
   if (e->type() == QEvent::WinEventAct) {
...
...
       if (EV_RXCHAR & m_currentMask & m_desiredMask) {
           dptr->canReadNotification(true);
           ret = true;
       }
...
...
...
}
 
// слот, срабатывающий по завершению асинхронной I/O операции
void WinSerialPortEngine::notify(int bytesTransferred, int error)
{
   if (error)
       return;
...
   m_bytesTransferred = bytesTransferred;
...
   dptr->canReadNotification(false); // false - флаг того что данные прочитаны, необходимо завершить операцию
...
}
 
bool WinSerialPortEngine::startAsyncRead(*data, len)
{
   // тут данные будут считываться в область памяти по указателю data
   ::ReadFile(...)
   // но реальное кол-во прочитанных байт мы из ReadFile не получим,
   // т.к. это кол-во мы узнаем позднее после завершение Overlapped операции
   // поэтому сейчай возвратим или true или false
}
 
qint64 WinSerialPortEngine::completeAsyncRead()
{
   // тут возвращаем реальное кол-во прочитанных байт
   return m_bytesTransferred;
}
 
 
 

serialport.cpp
Код
C++ (Qt)
bool SerialPortPrivate::canReadNotification(bool starting)
{
   if (starting) { // Если старт аси
       // Разного рода проверки, отключение на время нотификации для чтения и т.п.
       ...
       // Выделение дополнительного размера для кольцевого буфера и
       // получение указателя на кусок *data в который можно записать len байт
       ...
 
       // старт асинхронной операции чтения
       engine->startAsyncRead(*data, len);
 
       readSequenceStarted = true;
       return true;
   }
 
   // Это место означает, что необходимо завершить операчию чтения
 
   // Разного рода проверки и т.п.
   ...
 
   //получаем реальное кол-во прочитанных байт
 
   bytesRead = engine->completeAsyncRead();
 
  // урезаем кольцевой буфер до реального значения,
  // т.к. прочитать могли меньше чем запросили в len
 
  // послать readyRead() и т.п.
}
 

как то так примерно это должно выглядеть.

Теперь вопрос к тебе, b-s-a:

можно ли что-то аналогичное провернуть и для *nix?

там же вроде тоже есть функции асинхронного I/O типа async_read/write!

---

UPD: Что думают по этому поводу другие участники? Может есть другие предложения?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: QuAzI от Март 22, 2012, 17:40
А как-то сделать и синхронный режим и не синхронный не получится? Т.е. два варианта. У меня например есть железки, ака фискальные регистраторы (на базе специфического трёхпозиционного принтера Epson TM-U950), так они очень нервные в этом плане. Часто отказываются даже с платами расширения COM-портов работать (есть таких в хозяйстве, в основном от VSCom) или на некоторых отдельных материнках. Хотя возможно там ещё и приколы с теперяшними драйверами (своя прослойка между ФР и рабочим софтом). Писали их пьяные студенты-растаманы в прошлом веке на заборе.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 22, 2012, 18:01
Цитировать
А как-то сделать и синхронный режим и не синхронный не получится?
Неа, только асинхронный.

Цитировать
У меня например есть железки, ака фискальные регистраторы...
А причем тут принтеры? Поподробнее, в чем заключается нервность?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: QuAzI от Март 22, 2012, 18:08
Это трёхпозиционные принтеры совмещённые с фискальной памятью - грубо говоря кассовые аппараты. Интерфейс подключения к ПК - RS232 (тобишь COM-порт). Нервность заключается в частом отказе ФР работать без видимых причин на некоторых конфигурациях железа, хотя переткнёшь на "встроенный" порт или на другую материнку - всё начинает работать как часы. Хотя на том же "проблемном" железе всяческие модемы, дата-кабели, считыватели пластиковых карточек работают так же без проблем. Т.е. вопрос где-то то ли в таймингах, то ли ещё в какой-то мелкой не стыковке. Железки не дешёвые и всё это тянется через налоговую и кучу другой бюрократии, заменить их грубо говоря не на что.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 22, 2012, 18:15
Ну, значит, принтеры в пролете, если такие жесткие требования к таймингам. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 23, 2012, 11:12
Цитировать
Теперь вопрос к тебе, b-s-a:

можно ли что-то аналогичное провернуть и для *nix?

там же вроде тоже есть функции асинхронного I/O типа async_read/write!
Полностью асинхронного я ничего не припомню. Обычно, делается это через select. Т.е. select выходит в тот момент, когда данные приходят (ну или что-то случается). Но это должно быть исключительно в отдельном потоке, так как select работает синхронно. Зато он принимает множество дескрипторов, поэтому в программе может быть всего один поток с select. Можешь это использовать через QSocketNotifier и QEventDispatcherUNIX.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 23, 2012, 11:16
А как-же функции типа aio_read/aio_write ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 23, 2012, 15:45
спасибо. не знал о них.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 23, 2012, 16:51
Цитировать
Цитата
спасибо. не знал о них.

Да пожалуйста. :)

Поможешь с ними разобраться?

Я в принципе не очень понимаю как их можно прикрутить в плане нотификации...
Там вроде все заточено под Unix сигналы и каллбеки.

т.е. как я понимаю, можно или поветить каллбек, который вызовется по окончании I/O,
или каким-то образом отловить Unix сигнал, который излучится.

Весь вопрос - что предпочесть?
Можно ли отловить Unix сигнал через QSocketNotifier и т.п.?
Или тупо каллбек повесить?

В общем, есть вопрос к размышлению :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: apple_rtk от Март 24, 2012, 16:52
Цитировать
Давно уже переписал свое приложение на WinAPI и забыл про эту проблему. Вчера коллеги бились о стену со своим приложением. Иногда обмен сбивается. Они в две головы решали эту проблему, багу в коде искали. Сегодня к обеду проблему решили )). Я поинтересовался - где была ошибка..... А они просто поменяли преобразователь. Ну я не удивился, когда выяснил чем они пользуются для связи с компортом - старая знакомая библиотека для компорта под Qt.  ;D
Причем я грешил на Prolific, но они поставили другой преобразователь, тоже на Prolific-е и всё работает. А глючило и у меня и у них на преобразователе TU-S9. Может преобразователь кривой..... однако с GSM-модемом (Novacom) я такой-же глюк наблюдал, а с этим "глючным" TU-S9 на WinAPI всё работает как часы, без сбоев.

ps давно не слежу за развитием этой библиотеки, т.к. не использую, но может уже эту багу всё таки обнаружил автор и пофиксил.

Аналогичный случай: http://kernel.pro/articles/progs/prolific_qserialdevice/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 25, 2012, 17:17
Я в принципе не очень понимаю как их можно прикрутить в плане нотификации...
Там вроде все заточено под Unix сигналы и каллбеки.
Я тоже не понимаю. Я даже не понимаю зачем это вообще нужно. Нотификация - это одно (делается на селекте), а вот асинхронное чтение/запись это совершенно другое. И я не уверен, что это реально кому-нибудь нужно. Если у него возникнет такая проблема, то он всегда может в отдельном потоке работать с портом.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 25, 2012, 17:49
Цитировать
Я тоже не понимаю. Я даже не понимаю зачем это вообще нужно.

Чтобы GUI не фризился в главном потоке.

Цитировать
Если у него возникнет такая проблема, то он всегда может в отдельном потоке работать с портом.
Это уже отговорки.  :)

Цитировать
И я не уверен, что это реально кому-нибудь нужно.
Это позволит решить проблему подтормаживания евент лупа и сделать полностью асинхронную работу с I/O.

Вот из-за того, что в Qt все сделано на селектах и "синхронном" I/O (в частности, сокеты) - никто не использует
Qt в ответственных приложениях.

Непонятно зачем вообще в таком случае они сделали модули network (и вообще, подсистему I/O), если она кривая.

Когда-то на гиториусе видел от одного человека патч для Qt5, который позволял ускорить евент диспетчер,
используя вместо кросплатформенного POSIX select-а и т.п. - конкретные отдельные реализации данной сущности (epoll и т.п.) под каждую ОС.

Не знаю, почему патч  так и не влили в Qt (если не ошибаюсь)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 25, 2012, 23:41
Чтобы GUI не фризился в главном потоке.
Интересно, что ты делаешь такое с портом, что GUI "фризится"? У меня все пашет, причем из-за гуя иногда слетает синхронизация.

Это позволит решить проблему подтормаживания евент лупа и сделать полностью асинхронную работу с I/O.

Вот из-за того, что в Qt все сделано на селектах и "синхронном" I/O (в частности, сокеты) - никто не использует
Qt в ответственных приложениях.
Потому что в ответственных приложения часто и гуя нет. Сидит себе демон/сервис и тихонечко работает. А завязываться на Qt, это повышать сложность приложения. А чем оно сложнее, тем больше ошибок. Ну и унификация дает о себе знать.

Непонятно зачем вообще в таком случае они сделали модули network (и вообще, подсистему I/O), если она кривая.
Потому что в бизнес-приложениях (для которых Qt в первую очередь и создан) эти компоненты нужны и там нет сильной нагрузки.

Когда-то на гиториусе видел от одного человека патч для Qt5, который позволял ускорить евент диспетчер,
используя вместо кросплатформенного POSIX select-а и т.п. - конкретные отдельные реализации данной сущности (epoll и т.п.) под каждую ОС.

Не знаю, почему патч  так и не влили в Qt (если не ошибаюсь)
Возможно, из-за сложностей с поддержкой. Лично меня все устраивает, кроме проблем с таймером в Windows - невозможно сделать ожидание на время меньшее, чем 18 мс. Приходится использовать PerfomanceCounters и циклы ожидания.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 26, 2012, 10:07
Цитировать
Интересно, что ты делаешь такое с портом, что GUI "фризится"? У меня все пашет, причем из-за гуя иногда слетает синхронизация.
Суть в том, что в винде при использовании overlapped операций приходится дожидаться их завершения, чтобы узнать сколько реально байт передалось/принялось

Например код при записи в порт:

Код
C++ (Qt)
qint64 WinSerialPortEngine::write(const char *data, qint64 len)
{
...
   DWORD writeBytes = 0;
   bool sucessResult = false;
 
   if (::WriteFile(m_descriptor, data, len, &writeBytes, &m_ovWrite))
       sucessResult = true;
   else {
       if (::GetLastError() == ERROR_IO_PENDING) {
           if (::GetOverlappedResult(m_descriptor, &m_ovWrite, &writeBytes, true))
               sucessResult = true;
       }
   }
...
...
   return quint64(writeBytes);
}
 

Вызывает тормоза на GetOverlappedResult() и тем они сильнее,
чем больший поток байт len мы передаем (проверено экспериментально).

Положительный момент этого метода в том, что после этого мы можем получить
реальное кол-во отправленых байт writeBytes.

В принципе, для операции записи я могу победить это - не дожидаясь
пока все байты отправятся и пока я получу writeBytes, т.е.
могу тупо сразу возвращать не writeBytes, а len.

Т.е. метод WinSerialPortEngine::write возвратит сразу такое кол-во
байт, которое было в него задано, т.е. "фейк" :)

В принципе, я щитаю, что это выход для метода write.

Теперь рассмотрим метод read(), в котором используется таже
конструкция:

Код
C++ (Qt)
qint64 WinSerialPortEngine::read(char *data, qint64 len)
{
...
   DWORD readBytes = 0;
   bool sucessResult = false;
 
   if (::ReadFile(m_descriptor, data, len, &readBytes, &m_ovRead))
       sucessResult = true;
   else {
       if (::GetLastError() == ERROR_IO_PENDING) {
           if (::GetOverlappedResult(m_descriptor, &m_ovRead, &readBytes, true))
               sucessResult = true;
       }
   }
...
   return qint64(readBytes);
}
 

Но тут надо уточнить, что читаем мы данные, которые уже доступны для чтения в UART-е,
поэтому, теоретически ReadFile должен сразу их вернуть, т.е. не должно быть
состояния ERROR_IO_PENDING. Но, я не уверен что его не будет,
подозреваю, что все-таки иногда будет выполняться ветка GetOverlappedResult(),
что будет приводить к тормозам. В принципе, это можно попробовать проверить
экспериментально, сунуть сюда отладочный вывод..


Сейчас основные тормоза в Windows из-за операции write() с ожиданием,
т.е. как показано в коде в самом верху.

Так вот вопрос: а в *nix операции write/read сразу возвращают управление или нет?
(даже если дескриптор сконфигурен как неблокирующий и таймауты везде стоят по-нулям).

Если сразу - то я не буду заморачиваться с асинхронным I/O, и просто немного
подкорректирую Windows часть, в части операции write().

Как-то так...

Мож у кого есть что получше предложить? Прокомментировать?  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 26, 2012, 10:50
Подозреваю, что в *unix запись не всегда происходит моментально. А только до тех пор, пока есть место в буфере.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 26, 2012, 11:29
Цитировать
Подозреваю, что в *unix запись не всегда происходит моментально. А только до тех пор, пока есть место в буфере.

Т.е., передав в функцию сразу много данных:
Код
C++ (Qt)
::write(fd, data, 4096); //где 4096 - это много данных
 
возможно, что она сразу не передаст управлеие?

Или она выделит где-то в драйвере порта место под 4096 байта, скопирует их туда, вернет сразу 4096,
а с теми данными, которые появились в буфере драйвера - драйвер уже по тихонечку будет их отсылать в UART
в контексте ядреного потока (или чего там)?

И если, к примеру, драйвер успел отправить только 96 байт (осталось в буфере драйвера 4000),
и потом мы опять вызовем write(4096) - то буфер драйвера пополнеет до 4000+4096 байт,
а функция write() снова вернет 4096 мгновенно?

Т.е. как вообще оно будет? Будет ли write() ожидать отправку?

От этого многое зависит в реализации алгоритма для QtSerialPort


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 26, 2012, 13:54
блокирующий вариант write будет ждать. неблокирующий не будет (запишет только то, на что есть место в буфере). Таким образом, при использовании неблокирующего режима можно писать частями. Информацию о том, что данные записаны можно получить через тот же notifier (использующий select)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 26, 2012, 14:07
Цитировать
неблокирующий не будет (запишет только то, на что есть место в буфере).
Вот это поясни: про какой буфер речь и что за место? Я ничего не понял.

Цитировать
Информацию о том, что данные записаны можно получить через тот же notifier (использующий select)
Оно так и работает сейчас.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 26, 2012, 17:32
Цитировать
неблокирующий не будет (запишет только то, на что есть место в буфере).
Вот это поясни: про какой буфер речь и что за место? Я ничего не понял.
речь идет про ядерно-аппаратный буфер (читай аппаратный). допустим, размер буфера порта 128 байт. Ты отправляешь 256 байт: sz = write(fd, data, 256). В этом случае sz будет равен 128. Через некоторое время в буфере останется 20 байт, ты повторяешь операцию и результат будет sz = 108.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 26, 2012, 17:39
А, ок. С *nix примерно ясно.

UPD:
Просто такое в впечатление, что винде этот "аппаратный" буфер просто неимоверных размеров.  :)
За раз может отправлять до 8192 байта (больше просто не проверял).
Хотя, размер его можно задавать, но по умолчанию он 4096 байт (если не ошибаюсь).

Да и логика работы у него (драйвера) по-ходу иная нежели в никсах.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 29, 2012, 09:56
Кто-то выложил ролик на ютуб (http://www.google.ru/url?sa=t&rct=j&q=qserialdevice&source=web&cd=3&ved=0CEcQtwIwAg&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_77fWaOtV08&ctbs=qdr%3Aw&ei=iQR0T7DrJO7Y4QTg8_ipDg&usg=AFQjCNGHj1uFu8UUaIFge8j-ZFk3uDTwEQ&cad=rja) где тестирует QSerialDevice 2.0 на WinCE

:)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: LisandreL от Март 29, 2012, 10:32
где тестирует QSerialDevice 2.0 на WinCE
Правда пишет qserialdewice ;D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 29, 2012, 10:54
И что?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 29, 2012, 11:08
Кстати, принимаю пожелания на examples, какие бы вы хотели видеть в аддоне.

Пока что предполагается две штуки:

1. Терминал - простое GUI приложение, аналогичное гипертерминалу (только гораздо проще).
Уже есть реализация.

2. Взять что-ли еще и тест /guiapp от предыдущей QSerialDevice 2.0 , подрихтовать и переименовать его (ХЗ во что переименовать)
и добавить в примеры.

Хватит ли этого кол-ва?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 29, 2012, 15:47
для начала точно хватит


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Апрель 05, 2012, 13:22
Интересуюсь, библиотека уже доступна для работы? Или пока находится в "тестировании".

Если доступна, то где.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: iroln от Апрель 05, 2012, 14:15
Мне тоже интересно, как там дела со стабильностью и документацией, в продакшене уже можно использовать?
Хотелось бы больше документации и простых примеров.

И ещё вопрос: Возможно сделать биндинг к Python для PySide и PyQt4? Она же у вас, как я понимаю, асинхронная, сигналы, Qt-way и т.д. Хотелось бы использовать её в своих рабочих проектах на PySide вместо PySerial (лицензия, надеюсь, совпадает с Qt-шной).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 05, 2012, 14:35
Цитата: Bepec
Интересуюсь, библиотека уже доступна для работы? Или пока находится в "тестировании".
Еще только в тестировании.

Цитата: Bepec
Если доступна, то где.
Читай тут http://qt-project.org/wiki/QtSerialPort_Russian

Цитата: iroln
Мне тоже интересно, как там дела со стабильностью и документацией, в продакшене уже можно использовать?
Пока что никаких кардинальных изменений в структуру внесено не было,
стабильность где-то на уровне QSerialDevice 2.0.

Пробуй :)

Цитата: iroln
Хотелось бы больше документации и простых примеров.
Пока общая документация особо не разделена по разделам и т.п.,
я не знаю что писать :) .
Классы и все методы задокументированы ИМХО, в полном объеме,
желательно только проверить на ошибки в английском и т.п.

Из примеров имеется только Terminal и Enumerator.
Думаю добавить еще BlockingTerminal и всё!

Кто хочет еще примеров - пусть пишет и оформляет сам.

Цитата: iroln
И ещё вопрос: Возможно сделать биндинг к Python для PySide и PyQt4? Она же у вас, как я понимаю, асинхронная, сигналы, Qt-way и т.д. Хотелось бы использовать её в своих рабочих проектах на PySide вместо PySerial (лицензия, надеюсь, совпадает с Qt-шной).
Наверное возможно делать биндинг, но я этого делать не буду.
Лицензия совпадает с Qt-шной

UPD: сейчас идет процесс адаптации аддона для Qt4 (т.к. изначально планировался только для Qt5).
Т.е., если все получится - то можно будет использовать аддон и в Qt4 и в Qt5.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: iroln от Апрель 05, 2012, 14:45
...
Пока общая документация особо не разделена по разделам и т.п.,
я не знаю что писать :) .
Классы и все методы задокументированы ИМХО, в полном объеме,
желательно только проверить на ошибки в английском и т.п.
...
Так, главное, чтобы API был описан подробно. Документация в стиле Qt, созданная генератором доки вполне сгодится, если для каждого класса/метода будет подробное описание в коде.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Апрель 06, 2012, 11:16
Цитировать
Так, главное, чтобы API был описан подробно.
К счастью, API полностью интуитивно понятный. Единственное, на что хотелось бы обратить внимание - после открытия порта необходимо выставить ВСЕ настройки (а не только необходимые). Так как еще не пришли к единому мнению о том, надо ли выставлять настройки по дефолту или, как сейчас, оставлять текущие.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Апрель 16, 2012, 10:42
kuzulis, смотри. Стоило выложить в playground, как куча народа набежала. Вот уже и ошибки в документации фиксят. :-)
Так не долго и из библиотеки конфетка выйдет.  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Апрель 16, 2012, 11:04
 :) надеюсь на это

но все-равно медленно как-то


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 12:46
:) надеюсь на это

но все-равно медленно как-то

kuzulis, взял с git последнюю версию и попытался собрать в командной строке под qt4.8.1 - нифига не собралось.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 16:24
Цитировать
kuzulis, взял с git последнюю версию и попытался собрать в командной строке под qt4.8.1 - нифига не собралось.

gpepsi , взял с git последнюю версию и попытался собрать в командной строке под qt4.8.0 - ВСЕ собралось.

ЧЯДНТ?

ЗЫ: телепаты все уехали


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 16:34
Цитировать
kuzulis, взял с git последнюю версию и попытался собрать в командной строке под qt4.8.1 - нифига не собралось.

gpepsi , взял с git последнюю версию и попытался собрать в командной строке под qt4.8.0 - ВСЕ собралось.

ЧЯДНТ?

ЗЫ: телепаты все уехали

это выводит qmake
WARNING: d:\3RDPARTY\qt\qtserialport\.qmake.cache:1: Unmatched quotes are deprecated.
WARNING: d:\3RDPARTY\qt\qtserialport\.qmake.cache:1: Unmatched quotes are deprecated.

а это лог nmake
Код:
	cd src\ && d:\3RDPARTY\qt\4.8.1\bin\qmake.exe d:\3RDPARTY\qt\qtserialport\src\src.pro -o Makefile
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
cd src\ && "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile
"C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile.Debug
D:\3RDPARTY\qt\4.8.1\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"." -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 serialport.h -o debug\moc_serialport.cpp
D:\3RDPARTY\qt\4.8.1\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"." -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 serialportengine_win_p.h -o debug\moc_serialportengine_win_p.cpp
rc -D_DEBUG -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -fo debug\SerialPortd_resource.res SerialPortd_resource.rc
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
Copyright (C) Microsoft Corporation.  All rights reserved.

cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"." -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\836D~1\AppData\Local\Temp\nm80EB.tmp
serialport.cpp
serialportinfo.cpp
serialportengine_win.cpp
serialportinfo_win.cpp
Generating Code...
link /LIBPATH:"d:\3RDPARTY\qt\4.8.1\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /DLL /MANIFEST /MANIFESTFILE:"debug\SerialPortd.intermediate.manifest" /VERSION:1.00 /OUT:debug\SerialPortd1.dll @C:\Users\836D~1\AppData\Local\Temp\nm994C.tmp
   Creating library debug\SerialPortd1.lib and object debug\SerialPortd1.exp
mt.exe -nologo -manifest "debug\SerialPortd.intermediate.manifest" -outputresource:debug\SerialPortd1.dll;2
cd examples\ && d:\3RDPARTY\qt\4.8.1\bin\qmake.exe d:\3RDPARTY\qt\qtserialport\examples\examples.pro -o Makefile
cd examples\ && "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile
cd terminal\ && d:\3RDPARTY\qt\4.8.1\bin\qmake.exe d:\3RDPARTY\qt\qtserialport\examples\terminal\terminal.pro -o Makefile
cd terminal\ && "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile
"C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile.Debug
d:\3RDPARTY\qt\4.8.1\bin\uic.exe mainwindow.ui -o ui_mainwindow.h
d:\3RDPARTY\qt\4.8.1\bin\uic.exe settingsdialog.ui -o ui_settingsdialog.h
D:\3RDPARTY\qt\4.8.1\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"d:\3RDPARTY\qt\4.8.1\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 mainwindow.h -o debug\moc_mainwindow.cpp
D:\3RDPARTY\qt\4.8.1\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"d:\3RDPARTY\qt\4.8.1\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 settingsdialog.h -o debug\moc_settingsdialog.cpp
D:\3RDPARTY\qt\4.8.1\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"d:\3RDPARTY\qt\4.8.1\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 console.h -o debug\moc_console.cpp
d:\3RDPARTY\qt\4.8.1\bin\rcc.exe -name terminal terminal.qrc -o debug\qrc_terminal.cpp
cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"d:\3RDPARTY\qt\4.8.1\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\836D~1\AppData\Local\Temp\nmAC6D.tmp
main.cpp
mainwindow.cpp
settingsdialog.cpp
console.cpp
Generating Code...
cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.1\include\QtCore" -I"d:\3RDPARTY\qt\4.8.1\include\QtGui" -I"d:\3RDPARTY\qt\4.8.1\include" -I"d:\3RDPARTY\qt\4.8.1\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.1\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.1\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\836D~1\AppData\Local\Temp\nmC471.tmp
moc_mainwindow.cpp
moc_settingsdialog.cpp
moc_console.cpp
qrc_terminal.cpp
Generating Code...
link /LIBPATH:"d:\3RDPARTY\qt\4.8.1\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /MANIFEST /MANIFESTFILE:"debug\terminal.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\terminal.exe @C:\Users\836D~1\AppData\Local\Temp\nmD12E.tmp
LINK : fatal error LNK1104: cannot open file 'SerialPortd.lib'


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: JaguaR от Июнь 13, 2012, 17:36
kuzulis, подскажи пожалуйста как подключить к проекту библиотеку под линуксом (Qt 4.8.1)? Библиотеку собрал, подключить к проекту не удается. Инструкция (http://qt-project.org/wiki/QtSerialPort_Russian#591e172256460e9690b5d25e140840ad) только для винды. Заранее благодарю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 19:37
2 gpepsi,

у меня все прекрасно собирается как в теневую так и без:

Цитировать
qmake serialport.pro
nmake

Qt4.8.0, Windows SDK 7.1


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 20:04
kuzulis, подскажи пожалуйста как подключить к проекту библиотеку под линуксом (Qt 4.8.1)? Библиотеку собрал, подключить к проекту не удается. Инструкция (http://qt-project.org/wiki/QtSerialPort_Russian#591e172256460e9690b5d25e140840ad) только для винды. Заранее благодарю.

Та инструкция не только для винды, НО только для Qt5. Для Qt4 нужно несколько иначе делать.

Лучше собрать пакет QtSerialPort под свой дистр (rpm, dpkg, txz и т.п.) и установить его (если у тебя ArchLinux, то в AUR кто-то уже сделал PKGBUILD пакета для QtSerialPort).

На крайняк можно собрать и после сборки сделать make install, а далее в своем проекте подключать
библу через  CONFIG += serialport , но заработает или нет - хз, попробуй и отпишись :)

Если через CONFIG  не удастся подключить, то можно через LIBS += подключить в не зависимости от того,
делал ли ты make install или нет.

В принципе, вариантов как это сделать - уйма, это еще не все...  ;)

ЗЫ: поищи в гугле или по форуму ( тут много чего было сказано об особенностях рабрты с шаред библиотеками в Linux)
т.к. твой вопрос касается более всего именно этого.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 20:37
2 gpepsi,

у меня все прекрасно собирается как в теневую так и без:

Цитировать
qmake serialport.pro
nmake

Qt4.8.0, Windows SDK 7.1


блин - ну чудес-то не бывает :)
попробовал под qt 4.8.2
Код:
	cd src\ && d:\3RDPARTY\qt\4.8.2\bin\qmake.exe d:\3RDPARTY\qt\qtserialport\src\src.pro -o Makefile
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
cd src\ && "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile
"C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile.Debug
D:\3RDPARTY\qt\4.8.2\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"." -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 serialport.h -o debug\moc_serialport.cpp
D:\3RDPARTY\qt\4.8.2\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"." -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 serialportengine_win_p.h -o debug\moc_serialportengine_win_p.cpp
rc -D_DEBUG -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -fo debug\SerialPortd_resource.res SerialPortd_resource.rc
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
Copyright (C) Microsoft Corporation.  All rights reserved.

cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_ADDON_SERIALPORT_LIB -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"." -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\D899~1\AppData\Local\Temp\nmEBE6.tmp
serialport.cpp
serialportinfo.cpp
serialportengine_win.cpp
serialportinfo_win.cpp
Создание кода...
link /LIBPATH:"d:\3RDPARTY\qt\4.8.2\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /DLL /MANIFEST /MANIFESTFILE:"debug\SerialPortd.intermediate.manifest" /VERSION:1.00 /OUT:debug\SerialPortd1.dll @C:\Users\D899~1\AppData\Local\Temp\nm1F7.tmp
   Создается библиотека debug\SerialPortd1.lib и объект debug\SerialPortd1.exp
mt.exe -nologo -manifest "debug\SerialPortd.intermediate.manifest" -outputresource:debug\SerialPortd1.dll;2
cd examples\ && d:\3RDPARTY\qt\4.8.2\bin\qmake.exe d:\3RDPARTY\qt\qtserialport\examples\examples.pro -o Makefile
cd examples\ && "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile
cd terminal\ && d:\3RDPARTY\qt\4.8.2\bin\qmake.exe d:\3RDPARTY\qt\qtserialport\examples\terminal\terminal.pro -o Makefile
cd terminal\ && "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile
"C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" -f Makefile.Debug
d:\3RDPARTY\qt\4.8.2\bin\uic.exe mainwindow.ui -o ui_mainwindow.h
d:\3RDPARTY\qt\4.8.2\bin\uic.exe settingsdialog.ui -o ui_settingsdialog.h
D:\3RDPARTY\qt\4.8.2\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"d:\3RDPARTY\qt\4.8.2\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 mainwindow.h -o debug\moc_mainwindow.cpp
D:\3RDPARTY\qt\4.8.2\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"d:\3RDPARTY\qt\4.8.2\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 settingsdialog.h -o debug\moc_settingsdialog.cpp
D:\3RDPARTY\qt\4.8.2\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"d:\3RDPARTY\qt\4.8.2\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -D_MSC_VER=1600 -DWIN32 console.h -o debug\moc_console.cpp
d:\3RDPARTY\qt\4.8.2\bin\rcc.exe -name terminal terminal.qrc -o debug\qrc_terminal.cpp
cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"d:\3RDPARTY\qt\4.8.2\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\D899~1\AppData\Local\Temp\nmE35.tmp
main.cpp
mainwindow.cpp
settingsdialog.cpp
console.cpp
Создание кода...
cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"d:\3RDPARTY\qt\4.8.2\include\QtCore" -I"d:\3RDPARTY\qt\4.8.2\include\QtGui" -I"d:\3RDPARTY\qt\4.8.2\include" -I"d:\3RDPARTY\qt\4.8.2\include\QtAddOnSerialPort" -I"d:\3RDPARTY\qt\4.8.2\include\ActiveQt" -I"debug" -I"." -I"d:\3RDPARTY\qt\4.8.2\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\D899~1\AppData\Local\Temp\nm230E.tmp
moc_mainwindow.cpp
moc_settingsdialog.cpp
moc_console.cpp
qrc_terminal.cpp
Создание кода...
link /LIBPATH:"d:\3RDPARTY\qt\4.8.2\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /MANIFEST /MANIFESTFILE:"debug\terminal.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\terminal.exe @C:\Users\D899~1\AppData\Local\Temp\nm2FBB.tmp
LINK : fatal error LNK1104: не удается открыть файл "SerialPortd.lib"

Та же фигня...
З.Ы, Может какие идеи из лога ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 20:51
Цитировать
З.Ы, Может какие идеи из лога ?

Ну посмотри, есть ли реально SerialPortd.lib


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 20:55
Цитировать
З.Ы, Может какие идеи из лога ?

Ну посмотри, есть ли реально SerialPortd.lib

в release нет вообще ничего. Но это может быть потому, что сборка вылетела с ошибкой.
в debug есть SerialPortd1.dll и SerialPortd1.lib (ну и всякие там *.pdb с суффиксом *1.*)

Но линковщик ищет SerialPortd.lib
Цитировать
LINK : fatal error LNK1104: не удается открыть файл "SerialPortd.lib"

а ее нет :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 21:03
Цитировать
в release нет вообще ничего.
и не будет, я тебе на crossplatform.ru написал как сделать, чтобы было
Цитировать
qmake serialport.pro CONFIG+=release
nmake

Цитировать
в debug есть SerialPortd1.dll и SerialPortd1.lib
это хорошо, так и должно быть

Цитировать
Но линковщик ищет SerialPortd.lib
Это тоже самое что и SerialPortd1.lib.

Q:
1. Делаешь именно qmake serialport.pro ?
2. Собираешь тупо в директории с исходниками, или теневая сборка?
3. Если теневая, то где находится директория сборки относительно директории с исходниками?
4. Посмотри, правильно ли закешировались в .qmqke.cache переменные SERIALPORT_PROJECT_ROOT и SERIALPORT_BUILD_ROOT


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 21:08
и не будет, я тебе на crossplatform.ru написал как сделать, чтобы было
qmake serialport.pro CONFIG+=release
nmake

понятно. просто тутт время реацкии меньше оказалось

Цитировать
в debug есть SerialPortd1.dll и SerialPortd1.lib
это хорошо, так и должно быть
Цитировать
Но линковщик ищет SerialPortd.lib
Это тоже самое что и SerialPortd1.lib.
странно.. ну да ладно

Q:
1. Делаешь именно qmake serialport.pro ?
да

2. Собираешь тупо в директории с исходниками, или теневая сборка?
не совсем понял что такое теневая. Я так понимаю директория не QT

3. Если теневая, то где находится директория сборки относительно директории с исходниками?
qt - D:\3RDPARTY\qt\4.8.2
qtserialport - D:\3RDPARTY\qt\qtserialport

собираю в директории qtserialport (потом просто планировал nmake install)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 21:11
Посмотри, правильно ли закешировались в .qmake.cache переменные SERIALPORT_PROJECT_ROOT и SERIALPORT_BUILD_ROOT

И сделай полную очистку проекта, т.к. хрень какая-то.

Цитировать
не совсем понял что такое теневая. Я так понимаю директория не QT
Это когда исходники QtSerialPort тут:
Цитировать
D:\3RDPARTY\qt\qtserialport
а собираешь тут:
Цитировать
D:\3RDPARTY\qt\qtserialport-build

так:
Цитировать
mkdir D:\3RDPARTY\qt\qtserialport-build
cd /d D:\3RDPARTY\qt\qtserialport-build
qmake ..\qtserialport\serialport.pro
nmake


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 21:12
Посмотри, правильно ли закешировались в .qmqke.cache переменные SERIALPORT_PROJECT_ROOT и SERIALPORT_BUILD_ROOT

Да вроде правильно
Код:
"SERIALPORT_PROJECT_ROOT = D:/3RDPARTY/qt/qtserialport" 
"SERIALPORT_BUILD_ROOT = D:/3RDPARTY/qt/qtserialport"

кстати CONFIG+=release теперь не собирает debug (и тоже вылетает)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 21:26
Посмотри, правильно ли закешировались в .qmake.cache переменные SERIALPORT_PROJECT_ROOT и SERIALPORT_BUILD_ROOT

И сделай полную очистку проекта, т.к. хрень какая-то.

Цитировать
не совсем понял что такое теневая. Я так понимаю директория не QT
Это когда исходники QtSerialPort тут:
Цитировать
D:\3RDPARTY\qt\qtserialport
а собираешь тут:
Цитировать
D:\3RDPARTY\qt\qtserialport-build

так:
Цитировать
mkdir D:\3RDPARTY\qt\qtserialport-build
cd /d D:\3RDPARTY\qt\qtserialport-build
qmake ..\qtserialport\serialport.pro
nmake


я твой проект при каждой сборке перезаливаю на всякий случай.
А директории как и заливал с git
D:\3RDPARTY\qt\qtserialpor - это корень
а внутри /src
но собираю из корня


З.Ы. Попробовал икак ты посоветовал - та же ошибка. Ну мне кажется в этом и есть проблема - линковщик не может найти SeriadPortd.lib т.к. его и нет. есть SeriadPortd1.lib


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 21:34
Цитировать
кстати CONFIG+=release теперь не собирает debug (и тоже вылетает)
Ну да, это только релиз.

Цитировать
З.Ы. Попробовал икак ты посоветовал - та же ошибка. Ну мне кажется в этом и есть проблема - линковщик не может найти SeriadPortd.lib т.к. его и нет. есть SeriadPortd1.lib

Нет, не в этом проблема, т.к. у меня все хорошо и также имею SeriadPortd1.lib! :)

мож какая-то хрень со студией.., мож какие-то переменные окружения левые лезут.

Попробуй открыть студийную Command Promt, установить пути к Qt и собрать:
Цитировать
1. Запускаешь студийную консоль (Command promt)
2. set path=d:\3RDPARTY\qt\4.8.2\bin;%path%
3. mkdir D:\3RDPARTY\qt\qtserialport-build
4. cd /d D:\3RDPARTY\qt\qtserialport-build
5. qmake ..\qtserialport\serialport.pro
6. nmake

Если не получится, то забей, в serialport.pro закомментируй:
Цитировать
SUBDIRS = src #examples #tests
и наслаждайся, я хз в чем проблема :)




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 13, 2012, 21:47
Цитировать
кстати CONFIG+=release теперь не собирает debug (и тоже вылетает)
Ну да, это только релиз.

Цитировать
З.Ы. Попробовал икак ты посоветовал - та же ошибка. Ну мне кажется в этом и есть проблема - линковщик не может найти SeriadPortd.lib т.к. его и нет. есть SeriadPortd1.lib

Нет, не в этом проблема, т.к. у меня все хорошо и также имею SeriadPortd1.lib! :)

мож какая-то хрень со студией.., мож какие-то переменные окружения левые лезут.

Попробуй открыть студийную Command Promt, установить пути к Qt и собрать:
Цитировать
1. Запускаешь студийную консоль (Command promt)
2. set path=d:\3RDPARTY\qt\4.8.2\bin;%path%
3. mkdir D:\3RDPARTY\qt\qtserialport-build
4. cd /d D:\3RDPARTY\qt\qtserialport-build
5. qmake ..\qtserialport\serialport.pro
6. nmake

Если не получится, то забей, в serialport.pro закомментируй:
Цитировать
SUBDIRS = src #examples #tests
и наслаждайся, я хз в чем проблема :)




ну я так и делаю
cd d:\3RDPARTY\qt\4.8.2\bin
qtvar.bat
qmake ...
nmake

ну да ладно. хотя жаль что не все собирается. Причем пробовал собранную либу переименовать руками - тоже не находит.

З.Ы. Этот код бы да в сборку qt - странно что у них его нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 13, 2012, 21:53
Цитировать
ну я так и делаю
,
нет, ты сделай именно так, как я сказал (п. 1-6 в предыдушем посте).

после этого заскриньшоть сюда получившееся полное дерево каталогов внутри qtserialport-build
(например из тотал-командера просмотр в виде дерева) + приведи содержимое .qmake.cache

Все-таки неверный путь линкеру подставляется вкорее всего...

В общем, давай, сделай точ в точ как я сказал чтобы проблему найти


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 14, 2012, 06:11
Цитировать
ну я так и делаю
,
нет, ты сделай именно так, как я сказал (п. 1-6 в предыдушем посте).

после этого заскриньшоть сюда получившееся полное дерево каталогов внутри qtserialport-build
(например из тотал-командера просмотр в виде дерева) + приведи содержимое .qmake.cache

Все-таки неверный путь линкеру подставляется вкорее всего...

В общем, давай, сделай точ в точ как я сказал чтобы проблему найти

1. кэш
"SERIALPORT_PROJECT_ROOT = D:/3RDPARTY/qt/qtserialport"
"SERIALPORT_BUILD_ROOT = D:/3RDPARTY/qt/qtserialport-build"

2. дерево каталогов (что-то изображение не смог вставить)
examples
include
src
.qmake.cache
Makefile

P.S. make install копирует у тебя заголовочные файлы. А копирует ли lib-ы ? Что-то не нашел.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: DmitryM от Июнь 14, 2012, 07:26
З.Ы. Этот код бы да в сборку qt - странно что у них его нет.
А зачем? Когда поддержка последовательного порта есть в boost.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 14, 2012, 09:29
2 gpepsi,

Цитировать
P.S. make install копирует у тебя заголовочные файлы. А копирует ли lib-ы ? Что-то не нашел.
Понятия не имею. Ни разу не пробовал. Поддержку Qt4 добавлял не я :)


Цитировать
2. дерево каталогов (что-то изображение не смог вставить)
examples
include
src
.qmake.cache
Makefile
1. Ну а /src какие каталоги содержит?
2. Имена каталогов все с маленькой буквы?






Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 14, 2012, 09:38
2 gpepsi,

Цитировать
P.S. make install копирует у тебя заголовочные файлы. А копирует ли lib-ы ? Что-то не нашел.
Понятия не имею. Ни разу не пробовал. Поддержку Qt4 добавлял не я :)


Цитировать
2. дерево каталогов (что-то изображение не смог вставить)
examples
include
src
.qmake.cache
Makefile
1. Ну а /src какие каталоги содержит?
2. Имена каталогов все с маленькой буквы?





сейчас еще раз попробовал сварить под 4.8.1 - все сварилось.
Причем сварилось из каталога с исходниками. Не понятно в чем была проблема.

З.Ы. Хотелось бы добавить сборку debug+release. И при make install инсталяцию в директорию Qt либ. Бвло бы очень удобно. Сварил из любого места и поставил в настроенные директории.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 14, 2012, 09:39
Цитата: DmitryM
А зачем? Когда поддержка последовательного порта есть в boost.
Не надо только флудить. Тут обсуждаем не Boost.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 14, 2012, 09:42
Цитата: gpepsi
З.Ы. Хотелось бы добавить сборку debug+release.
Пока по отдельности собирай
Цитировать
qmake serialport.pro CONFIG+=release
nmake
...
qmake serialport.pro CONFIG+=debug
nmake

Цитата: gpepsi
И при make install инсталяцию в директорию Qt либ. Бвло бы очень удобно. Сварил из любого места и поставил в настроенные директории.
Я что-то думал, что оно копирует либы.. Ок. будем разбираться.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gpepsi от Июнь 14, 2012, 09:49
Цитата: gpepsi
З.Ы. Хотелось бы добавить сборку debug+release.
Пока по отдельности собирай
Цитировать
qmake serialport.pro CONFIG+=release
nmake
...
qmake serialport.pro CONFIG+=debug
nmake

Цитата: gpepsi
И при make install инсталяцию в директорию Qt либ. Бвло бы очень удобно. Сварил из любого места и поставил в настроенные директории.

по отдельности приходится чистить каталог. Release после debug не собирается. А если почистить, то все нормально.
А на счет инсталляции - будет не плохо, если сделаете.
Я что-то думал, что оно копирует либы.. Ок. будем разбираться.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Июнь 18, 2012, 11:35
А зачем? Когда поддержка последовательного порта есть в boost.
Она ущербна - только базовые возможности. Четности Space и Mark там нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июнь 26, 2012, 12:39
Кхм. Маленький вопрос - Используя последнюю версию вашей милой библиотечки, я заметил престранную вещь - виртуальные ком порты не видятся в avialiblePorts().

Уточню - при использовании MOXA NPort 5430I в системе создаются 4 виртуальных ком порта. Вот их, avialiblePorts в упор не видит.
А так в serialPort с ними спокойно работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 26, 2012, 14:38
Цитировать
Уточню - при использовании MOXA NPort 5430I в системе создаются 4 виртуальных ком порта. Вот их, avialiblePorts в упор не видит. 
Винда или linux?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июнь 26, 2012, 14:40
Windows 7 x64 sp 1


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 26, 2012, 14:45
Тгда наводящие:

1. В диспетчере устройств они есть?
2. Если да - то какой Class GUID отображается в свойствах этого устройства?

Device Manager -> NPort -> Properties -> Details -> Device Class Guid (выбрать в комбобоксе)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июнь 26, 2012, 14:53
В диспетчере устройств их нет :) Совсем нет. Нет ни моксы, ни портов.

Имеются в реестре записи о них, аля
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

Код:
Npdrv13  COM13
Npdrv14  COM14
Npdrv15  COM15
Npdrv16  COM16

Видит только устройство с драйверами(usb модем, обозначается так)
Код:
\Device\QCUSB_COM20_3 COM20





Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 26, 2012, 14:54
Ну, значит ничего нельзя сделать. Ищи новые драйвера для NPort.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июнь 26, 2012, 14:57
Эм... То есть вы официально признаёте, что ваша библиотека с моксами работать не будет? Оо

Порты генерируются прилагающейся программой NPortAdmin.

PS неужели вы тягаете список портов из диспетчера устройств??? Мб стоило из реестра брать значения?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 26, 2012, 15:01
Цитировать
Эм... То есть вы официально признаёте, что ваша библиотека с моксами работать не будет? Оо

Не тролли плз... :)

Она работает с моксами. По крайней мере с однопортовыми преобразователями.

Цитировать
Порты генерируются прилагающейся программой NPortAdmin.

Значит у тебя на диске устаревшая версия. Скачай на сайте MOXA последние дрова/программу для
своего преобразователя.

Цитировать
PS неужели вы тягаете список портом из диспетчера устройств???

Ничо подобного. Если в диспетчере устройств устройства нет - значит его нет для системы и его невозможно
найти через SetupAPI. Вина тому "кривая" программка/драйвера NPortAdmin.

Цитировать
Мб стоило из реестра брать значения?

Они и из реестра берутся, но в случае, если устройство существует.

ЗЫ: эту тему уже мусолили стопицот раз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июнь 26, 2012, 15:08
kuzulis, оно в реестре есть, спокойно работает и не шевелится(если данные брать из реестра.)

То, что его в диспетчере нет - вполне логично. Драйвера то на него и не ставятся. Всем занимается программа. (И это последняя версия, последняя прошивка и моксы пришли 3 дня назад).

С однопортовыми спокойно работает. По долгу службы и то и то есть.

М. Т.е. если в диспетчере устройств нет описания устройства, то данные из реестра библиотечка не берёт?
Вам кажется это правильным?

PS т.е. если я напишу свой драйвер, ваша библиотека его не увидит? (конечно в диспетчере его не будет ;) спрячу)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 26, 2012, 15:15
Скачай уже наконец последнее ПО с их сайта и не парь мне моск всякой хренью,
о которой не имеешь представления.

На тебе ссылочку ( почему это я за тебя должен ее искать ? ):

http://www.moxa.com/support/download.aspx?type=support&id=937

упс, отставить, эта ссылка наверное лучше будет:

http://www.moxa.com/support/download.aspx?type=support&id=974

Если и после этого не заработает - то сорри, юзай так как есть.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июнь 27, 2012, 06:56
Последняя версия не пашет :D

А вот с 1.15 порты обнаружены были. Спасибо за быстрый ответ и..

PS всё же как вы порты тама находите, в 2 словах? :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 27, 2012, 09:28
Цитировать
А вот с 1.15 порты обнаружены были.

Да, именно с "NPort Windows Driver Manager (WHQL certified)"
и у меня работало, т.к. оно предоставляет нормальные драйвера.

И это совершенно другая вещь нежели "NPort Administration Suite",
поэтому понятие о версиях неуместно.

Цитировать
всё же как вы порты тама находите, в 2 словах?

См. исходники, тут не нужно слов :)


Название: Нужна помощь в тестировании!!!
Отправлено: kuzulis от Июль 25, 2012, 10:03
Парни, нужна помощь для тестирования библиотеки в части бага, который проявляется с использованием USB/Serial адаптеров в Windows.
Баг заключается в том, что при использовании некоторых конвертеров при чтении данных увеличивается нагрузка на CPU до 100%.

Как тестировать:

1. Скачать текущую версию аддона как написано в ВиКи (http://qt-project.org/wiki/QtSerialPort_Russian)
2. Подправить исходный код как сказано в багтрекере (https://bugreports.qt-project.org/browse/QTPLAYGROUND-2)
3. Собрать и установить библиотеку как сказано в Вики, собирать достаточно без Release.
4. Взять тестовый проект  TestSerial.zip (https://bugreports.qt-project.org/secure/attachment/28890/TestSerial.zip) из багтрекера
5. Собрать его, подправив имя порта и т.п..
6. Запустить тестовый проект, а затем из любого внешего приложения (хоть с терминала, хоть еще с чего)
начать передавать в TestSerial данные. Т.е. TestSerial должен тупо все принимать и выводить в консоль.
7. Запустить виндовый таск менеджер и посмотреть как будет меняться загрузка CPU.

О полученных результатах плз. отпишитесь:

1. Какую версию Qt использовали.
2. Под какую платформу она собрана 32 или 64 бит
3. Какая версия винды стоит
4. Какой USB/Serial конвертер использовался
5. Какая версия драйверов этого конвертера использовалась.
6. Какая максимальная загрузка CPU была до исправления и после исправления кода



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июль 25, 2012, 12:04
1. Qt 4.7.2
2. x32
3. W7 Максимальная SP1  x64
4. UPort 1130I MOXA
5.
Цитировать
Поставщик драйвера: Moxa Inc.
Дата разработки: 08.06.2009
Версия драйвера: 1.6.0.0
Цифровая подпись: Microsoft Windows Hardware Compatibility Publisher
6. 0-6% одного ядра(i5).

PS после запуска 2-6%(5-7 минут), потом установилось в 0-1%.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 25, 2012, 12:55
2 Bepec,

а до исправления исходного кода какая была нагрузка на CPU?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июль 25, 2012, 12:59
Посмотрел.

Нагрузка так же 0-1, разве что не было скачка до 6% в начале. Мб посодействовало то, что я ещё пару проектов перед обедом отлаживал, хз хз :)

PS разницы не заметил особой.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 25, 2012, 13:38
2 Верес, спасибо за участие.

Похоже, проблема так и осталась, см тут (http://qt-project.org/forums/viewreply/92688/) и тут (https://bugreports.qt-project.org/browse/QTPLAYGROUND-2?focusedCommentId=181352#comment-181352), по крайней мере для конвертеров типа:

- USB-SERIAL CH340 wch.cn
- Arduino MEGA 2560 boards (Arduino driver)
- PL2303

Такое впечатление, что там говно-драйвера используются, хотя, может это баг QWinEventNotifier...

PS: А может и мои "кривые"руки :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Июль 25, 2012, 13:43
Мб проблема в их буферах?

У меня вон тоже была проблема с usb конвертером - его встроенный FIFO задерживал и рвал данные с линии. После его отключения, положение выправилось.

PS тот же uport с этими дровами, при интенсивной передаче/приёме БСОД вызывает. Устраивали тут спарринги - посылали друга на друга данные, у кого первого БСОД - тот проиграл :D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 25, 2012, 13:58
Да ХЗ в чем проблема.

А ты каким образом FIFO вырубал?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 25, 2012, 20:44
2 Верес, спасибо за участие.

Похоже, проблема так и осталась, см тут (http://qt-project.org/forums/viewreply/92688/) и тут (https://bugreports.qt-project.org/browse/QTPLAYGROUND-2?focusedCommentId=181352#comment-181352), по крайней мере для конвертеров типа:

- USB-SERIAL CH340 wch.cn
- Arduino MEGA 2560 boards (Arduino driver)
- PL2303

Такое впечатление, что там говно-драйвера используются, хотя, может это баг QWinEventNotifier...

PS: А может и мои "кривые"руки :(

Кстати, для PL2303 проблема вроде бы решилась установкой нового драйвера  (http://www.prolific.com.tw/admin/Technology/GetFile.ashx?fileID=237)от Prolific,
логин Guest пароль Guest для доступа на их сайт.

Кто нить, у кого есть этот чип (или любой чип) от Prolific, может протестировать у себя?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: klon4uk от Июль 31, 2012, 13:54
помогите, скачал qtserial, а как щас его в систему установить не знаю, пробовал собирать , дак ругаеться...
есть у кого нить инструкция ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 31, 2012, 14:21
http://qt-project.org/wiki/QtSerialPort_Russian


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: klon4uk от Август 01, 2012, 11:03
читал make не делаеться , что надо с qmake сделать не понял :-\


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Август 01, 2012, 11:45
нужно выполнить с теми параметрами, что указаны в статье


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 01, 2012, 14:49
читал make не делаеться , что надо с qmake сделать не понял :-\

Откройв креаторе и собери, раз непонятно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 05, 2012, 07:08
Здравствуйте. Использую последнюю версию QtSerialPort, загруженную с git, и у меня возникает проблема. Упрощенно код выглядит так:
Код:
serialPort.write(buff);
serialPort.waitForBytesWritten(50);
if (serialPort.waitForReadyRead(100)) buff2 = serialPort.readAll();

Через некоторое время (от нескольких минут, до нескольких часов) работы программа выдает segfault. Ошибка появляется только в Linux (в windows не появляется). Вывод отладчика в моент segfault:
Цитировать
0   raise   /lib64/libc.so.6   0   0x7ffff5ac3b05   
1   abort   /lib64/libc.so.6   0   0x7ffff5ac4f86   
2   __libc_message   /lib64/libc.so.6   0   0x7ffff5afe9f7   
3   malloc_printerr   /lib64/libc.so.6   0   0x7ffff5b03ec6   
4   free   /lib64/libc.so.6   0   0x7ffff5b08d4c   
5   QtAddOn::SerialPort::UnixSerialPortEngine::setWriteNotificationEnabled   serialportengine_unix.cpp   878   0x7ffff7bd324d   
6   QtAddOn::SerialPort::SerialPortPrivate::flush   serialport.cpp   140   0x7ffff7bcc164   
7   QtAddOn::SerialPort::SerialPortPrivate::canWriteNotification   serialport.cpp   290   0x7ffff7bcc653   
8   QtAddOn::SerialPort::SerialPort::waitForBytesWritten   serialport.cpp   1306   0x7ffff7bcdb37   
...
т.е. ошибка появляется при вызове waitForBytesWritten->canWriteNotification->flush->setWriteNotificationEnabled->"m_writeNotifier->setEnabled(enable)"
Переменная m_writeNotifier - это QSocketNotifier. Получается что ошибка в Qt или в libc?

Когда я использовал QSerialDevice 2.0, вместо serialPort.waitForBytesWritten(50) было msleep(7), но с QtSerialPort через некоторое время работы это приводит к 100% загрузке одного ядра процессора (и в linux и в windows).
Посоветуйте в каком направлении копать.

Моя конфигурация:
- последовательный порт на материнской плате;
- дистрибутив Calculate 12 (Gentoo)
- ядро linux 3.4.5
- Qt 4.8.2
- glibc 2.14.1-r3


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 05, 2012, 14:32
Цитировать
Получается что ошибка в Qt или в libc?
вполне возможно

Цитировать
Посоветуйте в каком направлении копать.
Попытаться не использовать методы waitForXXX, они необходимы только если у вас в отдельном потоке крутится I/O и вы не используете сигналы\слоты.

UPD: а вообще, текущая архитектура библиотеки еще несколько кривовата.., планирую в скором времени представить на рассмотрение в Gerrit несколько иную, где не должно быть загрузок CPU и т.п.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 05, 2012, 15:12
Цитировать
Попытаться не использовать методы waitForXXX, они необходимы только если у вас в отдельном потоке крутится I/O и вы не используете сигналы\слоты.
У меня в отдельном потоке. Сигналы/слоты удобно использовать когда устройство само шлет данные, или когда обмен идет между двумя программами. В моем случае запрос/ответ, и ответ может сильно запаздывать (и приходить кусками). Еще я думаю что сигналы/слоты будут медленнее чем работа в потоке, возможна я ошибаюсь. Подумаю, может действительно сделаю на сигналах/слотах, но какое преимущество?

Цитировать
планирую в скором времени представить на рассмотрение в Gerrit несколько иную, где не должно быть загрузок CPU и т.п.
Когда одно ядро нагружается на 100%, то программа перестает получать данные. Я думаю что где-то что-то зацикливается, но найти не могу т.к. программа не вылетает и отладчик не выдает место сбоя. Когда все работает нормально, то нагрузка 0%...1%. А чем новая архитектура будет принципиально отличаться? Просто интересно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 05, 2012, 20:43
Сделал на сигнала/слотах и появилась другая неприятность. Как только в GUI прокручиваю мышкой большую таблицу - сразу падает скорость обмена с устройством. Решил оставить версию программы с потоком.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 05, 2012, 20:43
Цитировать
Подумаю, может действительно сделаю на сигналах/слотах, но какое преимущество?
Такое, что загрузка CPU может снизиться и креши перестать появляться :)

Цитировать
А чем новая архитектура будет принципиально отличаться? Просто интересно.
Внутри приватная имплементация изменилась:
- выкинут слой Engine
- выкинут WinCE
- выкинут Symbian
- под *nix переписана подсистема нотификации аналогично тому как они в сокетах написаны, практически 1:1
(но все-равно при использования "нативного" порта на материнской плате при передаче данных загрузка CPU
растет до 10%, если передавать по 256 байт каждые 100 мс)
- под Windows также переписана подсисиема нотификации, теперь она уж точно полностью асинхронная, даже
для ReadFile/WriteFile, теперь вообще 0 ресурсов тратится на I/O (по крайней мере у меня)

Цитировать
Решил оставить версию программы с потоком.
ну ты можешь оставить поток, но использовать сигналы/слоты


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 00:33
У меня появилось предположение почему сегфолтится. Я перечитал документацию по потокам Qt, и понял что потоку принадлежат только те объекты, которые созданы в функции run. Объекты созданные в любом другом месте в классе, унаследованном от QThread принадлежат главному потоку. В моем случае получается, что в функции run вызывается объект, созданный в другом потоке, отсюда и проблемы. QObject и все его подклассы не потокобезопасны.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 06:30
Цитировать
ну ты можешь оставить поток, но использовать сигналы/слоты
Сделал, не помогло. Делал так:
1. В функции run создаю объект класса SerialPort, открываю порт.
2. Соединяю сигнал readyRead этого объекта со слотом readData потока.
3. В функции run запускаю цикл обработки событий exec().
Скорость обмена так же падает в момент прокрутки большой таблицы. Не пойму почему. Нагрузка на процессор при этом 10% (эту нагрузку создает таблица, а не порт). Прога работала всю ночь и не упала.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 06, 2012, 10:06
Хорошо, попробуй тогда (если есть время), проверить реализацию с новой концепцией отсюда:

https://codereview.qt-project.org/#change,32186

т.к. грядет полная переделка внутренней структуры.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Август 06, 2012, 13:03
Сделал, не помогло.
Ты пробовал делать moveToThread для порта?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 13:23
Цитировать
Хорошо, попробуй тогда (если есть время), проверить реализацию с новой концепцией отсюда:
Вечером попробую.

Цитировать
Ты пробовал делать moveToThread для порта?
Для версии waitFor* пробовал. Всеравно падает. Еще в этой версии моей программы в потоке нет цикла обработки событий, но данные приходят. Такое ощущение, что события порта всегда обрабатываются главным потоком (даже если объект порта работает не в главном потоке). Или они все же обрабатываются в waitFor* хз.
Проверял даже вызовом thread() к какому потоку какой объект принадлежит. Проверял это для версии с  waitFor* и с сигналами/слотами.

Как я уже писал выше, в QSerialDevice 2.0 я вместо waitForBytesWritten применял msleep и работало. Что-то серьезное менялось при переходе от QSerialDevice  к QtSerialPort? Еще возможно что я ОС обновил, но не обратил внимание когда сегфолты начались. Но ОС работает стабильно, иногда несколько суток не выключаю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 06, 2012, 15:07
Цитировать
Что-то серьезное менялось при переходе от QSerialDevice  к QtSerialPort?

нет


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 21:05
С новой библиотекой поток+waitFor* работает и не глючит. Проверял час, думаю на ночь оставить. Но при запуске выдает:
Код:
Warning: QObject: Cannot create children for a parent that is in a different thread.
(Parent is SerialPort(0x7fff19085ab8), parent's thread is QThread(0x22d3f00), current thread is port(0x7fff19085aa0)
Warning: QObject: Cannot create children for a parent that is in a different thread.
(Parent is SerialPort(0x7fff19085ab8), parent's thread is QThread(0x22d3f00), current thread is port(0x7fff19085aa0)
Видимо нужно SerialPort переместить в мой поток, сейчас он в главном потоке.
А вот с сигналами что-то не работает. Не генерируется сигнал readyRead(). Еще не разобрался.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Август 06, 2012, 21:10
Помоему тут налицо просто неумение работы с потоками :) Но да пусть. Набирайся опыта.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 21:31
Это потому что спросить не у кого. Нет знакомых программистов. Для меня это хобби.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 06, 2012, 22:22
Цитировать
А вот с сигналами что-то не работает. Не генерируется сигнал readyRead(). Еще не разобрался.
Да, это возможно, т.к. waitForXXX еще вообще не обкатывалось. Упор делался на использование сигналов.
Сейчас там в Gerrit страсти устаканятся и начнем обкатывать и внедрять эту новую внутреннюю структуру.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 22:27
kuzulis, ты меня не понял, у меня waitForXXX работает, а сигналы нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 06, 2012, 22:33
Я тебя понял, но Не может такого быть. Вполне возможно что они не работают потому, что ты их используешь совместно с waitForXXX.

Если использовать чисто сигналы - то оно работает. Я ж проверял.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 06, 2012, 22:50
У меня три варианта программы:
1. поток +  waitForXXX
2. сигналы/слоты
3. поток + сигналы/слоты
Первый работает, а остальные нет. Со вчерашнего дня я их не менял. Просто либу пересобрал. Возможно я где-то накосячил, сейчас разбираюь. Забыл сказать что у меня Linux х86-64. Может это тоже имеет значение.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Август 07, 2012, 06:08
Первый вариант работал 6 часов и не повис.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: navrocky от Август 17, 2012, 22:01
Господа, а можно ли как-то приладить эту либу для чтения из пайпа (stdin)? Или может какая-нибудь внутренность подойдет?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 17, 2012, 23:08
Для пайпов возьми из Qt5 QPipeReader/Writer


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: navrocky от Август 18, 2012, 21:13
Для пайпов возьми из Qt5 QPipeReader/Writer
Что за зверь, почему гуголь о нём не знает? )

Впрочем, я уже обошёлся включением O_NONBLOCK на дескрипторе и использованием QSocketNotifier... Только под винду это работать не будет, но сейчас для меня это не критично.

Подожду релиза Qt5 тогда поубираю свои костыли.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gogi от Август 20, 2012, 16:54
Сегодня в репозиторий прилетело обновление, похоже ещё никто не заметил:
Цитировать
serialport/src/serialportinfo_unix.cpp: In member function ‘bool QtAddOn::SerialPort::SerialPortInfo::isValid() const’:
serialport/src/serialportinfo_unix.cpp:258:5: error: ‘QFile’ was not declared in this scope
serialport/src/serialportinfo_unix.cpp:258:11: error: expected ‘;’ before ‘f’
serialport/src/serialportinfo_unix.cpp:259:12: error: ‘f’ was not declared in this scope
serialport/src/serialportinfo_unix.cpp:260:1: warning: control reaches end of non-void function [-Wreturn-type]

Цитировать
$ git show
commit 5c88b44995502677144a1fa622c4ddc3863011ff
Author: Denis Shienkov <scapig@yandex.ru>
Date:   Mon Aug 6 17:29:49 2012 +0400


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Август 20, 2012, 18:52
><
Бывает такое. Мб просто мысль не до конца оформилась? А чем вы собирать пробовали?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gogi от Август 20, 2012, 19:24
><
Бывает такое. Мб просто мысль не до конца оформилась? А чем вы собирать пробовали?
gcc обычный под текущим тестингом дебиана.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 20, 2012, 20:55
Пока не стоит качать обновления с последними коммитами.. Там сейчас идет аццкая переделка (это же транк, да и еще в придачу песочница), может не собираться и вообще не работать. Лучше брать предыдущие коммиты где собирается без ошибок. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gogi от Август 21, 2012, 09:20
Пока не стоит качать обновления с последними коммитами.. Там сейчас идет аццкая переделка (это же транк, да и еще в придачу песочница), может не собираться и вообще не работать. Лучше брать предыдущие коммиты где собирается без ошибок. :)
Да вы бы сделали стабильную ветку. А то кто его знает, сколько это предыдущих коммитов - 3, 5 или 10.
Будет всё как у людей  8)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: pethead от Август 24, 2012, 09:12
делаю
cd build
qmake ../serialport.pro
nmake
nmake install

собирается
\build\src\debug\SerialPortd1.dll
\build\src\debug\SerialPortd1.lib

в release пусто.

пишу проект, использую QtSerialPort. в дебаге все ок.
но для сборки релиза требуется SerialPort.lib и SerialPort.dll

и где они?
что делаю не так?

qmake ../serialport.pro CONFIG+=release
помогло!!!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 24, 2012, 09:54
Алгоритм сборки библиотеки для Release + Debug
(предварительно надо удалить все ранее установленные длл-ки,
заголовки, фичи от QtSerialPort из Qt, в общем, подчистить это дело):

Цитировать
$mkdir build-debug
$cd build-debug
$qmake ../serialport.pro
$nmake

$mkdir build-release
$cd build-release
qmake ../serialport.pro CONFIG+=release
$nmake

$cd build-debug
$nmake install

$cd build-release
$nmake install


Пока так.., в будущем может быть пофиксим.


Название: ПОМОГИТЕ: Просьба к маководам!
Отправлено: kuzulis от Сентябрь 09, 2012, 22:47
Парни, у кого есть Мак, плз, пофиксите баг со сборкой либы

https://bugreports.qt-project.org/browse/QTPLAYGROUND-4

Блин, е..сь уже три дня, но так и не могу установить хакинтош (10.6.2) в VirtualBox
на AMD так, чтобы работали утилиты moc, rcc и т.п. из установленных Qt 4.8.2 либ.

Когда пытался установить SDK - оно меня послало, что у меня не поддерживаемый
тип CPU!  >:(

Ок, хрен с тобой думаю, поставил прекомпиленый образ с Qt-шными либами - но
оно опять меня посылает при попытке что-нить Qt-шное собрать, типа moc, rcc
и т.п. не под тот проц собраны.

Хотя, по факту оно и не должно работать, т.к. хакинтошные AMD-шные ядра все
32-х битные вроде, а нужно 64 бит как я понял, и консоль выводит:
Цитировать
#uname -m
i386


попытка грузить мак принудительно с
Цитировать
-v arch=x86_64
не помогает.

Задолбался в конец!  >:( >:( >:(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Сентябрь 10, 2012, 07:38
Вечером сего дня попытаю тоже на виртуалке. О результате отпишусь.
Не смог к сожалению.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: ddrtn от Сентябрь 19, 2012, 13:51
Здравствуйте.
Я может чего где не доглядел, но где в новой версии
Код:
    void setCharIntervalTimeout(int usecs = 0);	
    int charIntervalTimeout() const;
    void setTotalReadConstantTimeout(int msecs = 0);
    int totalReadConstantTimeout() const;
и будет ли этот функционал вообще?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 19, 2012, 14:22
Не будет


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 01, 2012, 23:30
Пытаюсь разобраться с Mac OS X. Библиотеку QtSerialPort собрал и установил без проблем. При сборке любого примера из папки examples, qt-creator выдает:
Цитировать
ошибка: symbol(s) not found for architecture x86_64
ошибка: collect2: ld returned 1 exit status
Как с этим бороться?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 02, 2012, 00:22
Кажется разобрался. Не настроены переменные окружения и из за этого не работает должным образом serialport.prf. Временно добавил в файл.pro такую строку LIBS += /Library/Frameworks/libSerialPort.1.dylib и все заработало.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 02, 2012, 10:22
Здравствуйте.
Я может чего где не доглядел, но где в новой версии
Код:
    void setCharIntervalTimeout(int usecs = 0);	
    int charIntervalTimeout() const;
    void setTotalReadConstantTimeout(int msecs = 0);
    int totalReadConstantTimeout() const;
и будет ли этот функционал вообще?

Вопрос - а почему?

PS программно что-ли вычитывать время приёма/отправки? А я так надеялся :/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 02, 2012, 15:51
Кажется разобрался. Не настроены переменные окружения и из за этого не работает должным образом serialport.prf. Временно добавил в файл.pro такую строку LIBS += /Library/Frameworks/libSerialPort.1.dylib и все заработало.

Я с маком мало работал (только на виртуалках старые версии). Но теперь вообще нет возможности этого делать.
Так что если будут баги - то обязательно сообщай.

ЗЫ: Сейчас они снова могут появиться (под маком, баги при сборке), т.к. я переделал структуру project-tree и
процедуры сборки. И если парни на Gerrit одобрят ее - то вполне возможно отгрести еще какие-нить баги,
ничо страшного :)




Цитата: Bepec
Вопрос - а почему?
А потому, что это фризит Qt event loop + нельзя сделать эти функции одинаковыми на всех платформах, т.к.
разные реализации.

А то что ранее было setCharIntervalTimeout(), setTotalReadConstantTimeout() - это порнография :)

Теперь I/O стримовый и полностью асинхронный, без задержек и т.п.

Цитата: Bepec
PS программно что-ли вычитывать время приёма/отправки? А я так надеялся :/
А разве проблема воткнуть QTimer и считать время?

ЗЫ: Такова жизнь: чем-то приходится жертвовать ради приобретения "вкусняшек" :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 02, 2012, 16:50
Просто программно высчитывать длину кадров получаемых и отправляемых для довольно обширных систем команд, это немного трудновато.

Эх, придётся опять доставать свой полусырой класс и гусарить работу с таймаутами :)

Кстати, вопрос для общего развития - вроде бы точность системных таймеров в W, не позволяет высчитывать точные отрезки времени. Так же у них как бэ погрешность заявленная в 15 мс :/
Так что на высоком уровне работать с таймерами нереально.

Это так осталось или нет?



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 02, 2012, 17:05
Нет смысла вообще использовать интервалы времени в десятки мс, есть смысл начиная с сотен.
Например, интервалы можно использовать только при ожидании таймаута пакета при приеме,
поэтому QTimer в самый раз.

Послали пакет, запустили QTimer с неким интервалом ожидания ответного пакета.
Если сработал readyRead() - проверяем сколько байт принято bytesAvailable().
Если принято столько сколько ожидали, то останавливаем QTimer и обрабатываем
принятый пакет. Если принято меньше чем нужно, то ничего не делаем и ждем следующего
readyRead(). Если же сработал QTimer - значит пакет не пришел или пришел не весь,
обрабатываем эту ситуацию. Все предельно просто.

В ином случае я даже не соображу зачем оно (интервалы) нужно.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 02, 2012, 17:47
Таки до 255 устройств на линии :D В цикле обходить надо всех. Время ожидания ответа - 16 мс.

Посчитать насколько будет увеличиваться время опроса на каждую дополнительную мс ответа может каждый :D

Лучший - 4-5 секунд.  Т.е. максимальное время не выдерживается.
А берём плохой результат +15 мс погрешности - 7095.

Добавляем время ответа к обоим результатам.

Итог: Цикл крутиться постоянно, в результате получаем такой нехилый бонус в виде тормозов и снижения частоты опроса... :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 02, 2012, 20:47
Цитировать
Посчитать насколько будет увеличиваться время опроса на каждую дополнительную мс ответа может каждый
А никто в здравом уме не вешает на шину/линию 255 у-в, обычно 8-10,
в ином случае нужно бить проектировщикам по рукам. :)

Если полудуплекс (RS485-2W), то тут ничего не поделаешь - тормоза это нормально.

Если же полный дуплекс (RS485-4W) - то запросы можно слать сразу всем девайсам,
но тут многое зависит от протокола обмена и т.п.

Но в любом случае, в QtSerialPort не будет read/write таймаутов.
Максимум о чем можно подумать - это возвращение дескриптора порта
для платформо-зависимых "тонких" настроек.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 02, 2012, 21:05
Это было бы превосходно :)

PS когда на шине лежат средства охраны периметра, 100-150 это нормально :) 255 - это крайность, взятая для примера :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 02, 2012, 21:52
Просто программно высчитывать длину кадров получаемых и отправляемых для довольно обширных систем команд, это немного трудновато.

Эх, придётся опять доставать свой полусырой класс и гусарить работу с таймаутами :)

Кстати, вопрос для общего развития - вроде бы точность системных таймеров в W, не позволяет высчитывать точные отрезки времени. Так же у них как бэ погрешность заявленная в 15 мс :/
Так что на высоком уровне работать с таймерами нереально.

Это так осталось или нет?
Можно это обойти. Для этого необходимо заюзать Perfomance Counters. В Qt 4.8 они поддержаны через QElapsedTimer. Чтобы сделать точную задержку необходимо:
1. Запустить таймер
2. Выполнить стандартное системное ожидание на время, превышающее 20 мс.
3. Крутиться в цикле, вызывая Sleep(0) до тех пор, пока не истечет время. Есть мнение, что Sleep(0) в этом случае вызывать вредно. Не уверен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 02, 2012, 21:53
Цитировать
Максимум о чем можно подумать - это возвращение дескриптора порта
для платформо-зависимых "тонких" настроек.
Упс, отставить. Это тоже не поможет, т.к. read/write происходит автоматически
в/из внутренних кольцевых буферов класса некими постоянными порциями.

Например, при приходе в драйвер реально 100 байт, автоматом вызовется
ф-я ReadFile(ReadChunkSize)  (или read(ReadChunkSize)).

Где ReadChunkSize - некая константа (по умолчанию сейчас она 512 байт).

И если даже "тонко" настроить таймауты порта через дескриптор, то получится хрень.

Хотя, в принципе, все-таки дескриптор можно возвращать наверное.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 02, 2012, 21:54
Сначала, думаю, стоит придумать зачем. А уже потом возвращать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 02, 2012, 21:56
Цитата: b-s-a
Сначала, думаю, стоит придумать зачем. А уже потом возвращать.
Это да, согласен.

Но раз уж ты появился - плюсани в Gerrit что-ли и я патч закоммичу.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 02, 2012, 21:59
В принципе ладно, библиотечка то хорошая, негоже её портить :)

b-s-a насколько я помню, все (абсолютно) таймеры в системе W работают, основываясь на паре таймеров. И у этих таймеров именно погрешность в 15 мс имеется. Причём совершенно непредсказуемая задержка на разных компьютерах.

К тому же я не совсем понял логики вашего способа.
Запуск таймера, затем стандартный таймер (который  реализуется QTimer) и крутиться в Sleep(0) до истечения времени?

Тут слабое место на мой взгляд - Sleep и стандартный таймер имеют эту же погрешность в 15 мс ^_^ К тому же насколько я помню, время спячки потока опять таки имеет погрешность в зависимости от загрузки системы и приоритета процесса.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 02, 2012, 22:13
PS когда на шине лежат средства охраны периметра, 100-150 это нормально :) 255 - это крайность, взятая для примера :)

В этом случае не отвечающему устройству понижают приоритет скорости опроса (т.е реже его опрашивают или вообще выводят
из опроса на определенное время) с установкой аларма типа: "Связь с у-вом потеряна".

ЗЫ: Это конечно, если речь идет к примеру про пожарку в АСУТП.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 02, 2012, 22:50
К сожалению не пожарка, а именно средства охраны периметра  ;) И не ответ устройства хотя бы в 2 циклах расценивается как тревога - прорыв периметра/неисправность устройства/саботаж  :o

И сразу пиу пиу выбегают солдатики и бегут разбираться, какой подлец их любимое устройство тыкнул(не опросил). А потом, уходя на гражданку, возьмут с собой запись с камеры, как нарушителя/саботажника/разработчика ( :'( ) распинают на плацу :D



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 03, 2012, 19:27
У меня mac тоже в виртуалке. Программы собрались, а открывать порт не хотят. В linux такое тоже было пока пользователя не добавил в нужную группу, а в маке не могу найти где это. Кстати, сначала программа выдает ошибку с кодом 10, а при повторной попытке подключиться - с кодом 2.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 03, 2012, 20:04
Посмотрел права на файл порта /dev/cu.serial1: crw-rw-rw. Должно работать, но не работает. Заметил в /dev еще один похожий файл: tty.serial1. Может не правильно определяется файл устройства?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 03, 2012, 20:49
Цитата: Phoenix
В linux такое тоже было пока пользователя не добавил в нужную группу, а в маке не могу найти где это.
Фиг его знает как там в маке, но попробуй через su (или sudo) запустить Terminal.

Цитата: Phoenix
Кстати, сначала программа выдает ошибку с кодом 10, а при повторной попытке подключиться - с кодом 2.
Если честно, то не подскажу в чем дело. Код 2 это PermissionDeniedError.
Возможно ты неправильно ассоциировал порт в виртуалке (или вообще не настраивал его),
и что за виртуалка? Если честно, то я не проверял работу с built-in портами в Маке (или проверял - не помню).
Но точно проверял с USB/Serial шнурками - вроде работает.

Попробуй подключи в свой проект (или в пример Terminal) библиотеку напрямую через src-lib.pri и в отладчике
посмотри в файле serialport_unix.cpp как там в методе open() происходит открытие порта, на каком этапе фэйлится
и выведи номер ошибки errno.

Цитата: Phoenix
Заметил в /dev еще один похожий файл: tty.serial1. Может не правильно определяется файл устройства?
Ну попробуй открыть tty.serial1, хотя правильнее все-таки cu.serial1.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 03, 2012, 21:02
VirtualBox 4.1.22, MAC OS X 10.8.2. В виртуалке порт настроен, гостевая винда  с портом работает (хоть и медленнее чем на реальном железе). Попробую разобраться в чем дело. Думал может есть легкое решение :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 03, 2012, 21:30
Возможно какая-то хрень с пробросом built-in порта в гостевом Маке в Виртуалбоксе.
Я что-то смутное такое припоминаю, вроде и у меня тот же касяк был, поэтому я
использовал USB/Serial напрямую из Мака, а может мне мерещится все :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 03, 2012, 22:03
Фейлится при вызове:
Код:
descriptor = ::open(systemLocation.toLocal8Bit().constData(), flags);
Код ошибки portError = 10. В переменной  systemLocation почему-то такая хрень: "/dev/cu./dev/ttys0"

Код errno = 2

Задал systemLocation = "/dev/cu.serial1", теперь фейлится на
Код:
if (!updateTermios()) return false;
Код errno = 13 (здесь я перепутал, это до вызова updateTermios())


До вызова
Код:
TtyLocker::lock(ptr);
errno = 2, после вызова errno = 13 (выяснил что это нормально, т.к. там идет поиск каталога с доступом rw).

Еще выдается такое:
Цитировать
QSocketNotifier::Exception is not supported on Mac OS X
Это если закомментировать вызов updateTermios().


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 04, 2012, 06:35
Насчет хрени в systemLocation я сам виноват, в самом начале программы экспериментировал с разными портами :)

Ошибка возникает в
Код:
if (!updateTermios()) return false;
errno = 22
portError = 10
Что это значит?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 04, 2012, 15:06
Цитата: Phoenix
Ошибка возникает в
Код:
if (!updateTermios()) return false;
errno = 22
Что это значит?
Это значит EINVAL - Invalid argument.
В общем, надо разбираться.

Придется мне как-то установить в виртуалку Mac + скомпилить Qt из исходников,
т.к. бинарные сборки не устанавливаются.

Попробуй убрать вообще это:
Код
C++ (Qt)
   currentTermios.c_cc[VTIME] = 0;
   currentTermios.c_cc[VMIN] = 0;
 
ХЗ, поможет или нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 04, 2012, 16:41
Не помогло.

Qt не нужно устанавливать из исходников, и так все работает. Последовательность установки Qt:
1. Установить компилятор, для этого, зарегистрироваться на https://developer.apple.com/downloads/index.action и скачать "command line tools". Регистрация бесплатная и не требует наличия мака. Но для разных версий мака разные версии этой штуки (если что, могу скачать и выложить).
2. Скачать и установить Qt libraries 4.8.3 for Mac (183 MB)
3. Скачать и установить Qt Creator 2.5.2 for Mac (Intel 32/64bit) (93 MB)
Все.

Кстати, QtSerialPort по моему устанавливается не в те каталоги. Я их вручную потом переместил.
заголовочные устанавливаются в /include, а надо в /usr/include
библиотеки устанавливаются в /library, а надо в /usr/lib

Как запустить mac в виртуалке написать? Там есть нюансы, я дня 2 долбался.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 04, 2012, 17:20
Цитата: Phoenix
Не помогло.
Ну тогда ХЗ, нужно разбираться подробнее.

Цитата: Phoenix
Qt не нужно устанавливать из исходников, и так все работает.
Нет, на AMD процессорах сборки Qt привязаны к Intel-овским CPU-ID. Не устанавливается ни SDK
ни Libraries (не запускаются qmake и т.п.).

Поэтому собираю из исходников  >:(

Цитата: Phoenix
Кстати, QtSerialPort по моему устанавливается не в те каталоги. Я их вручную потом переместил.
Ок, это надо проверить.

Цитировать
Как запустить mac в виртуалке написать? Там есть нюансы, я дня 2 долбался.
Не, не надо. Я использую леопарда 10.6.8. с рутрекера :)





Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 05, 2012, 16:36
2Phoenix,

Я вроде исправил ошибку, попробуй патч:

https://codereview.qt-project.org/#change,38868

И пожалуйста обязательно отпишись (можешь даже на Gerrit).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 05, 2012, 18:01
Порт открывает, но данные не идут. Может действительно проблема в виртуалке. Я в командировку завтра еду, приеду поразбираюсь еще.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 05, 2012, 19:06
Цитата: Phoenix
Порт открывает, но данные не идут. Может действительно проблема в виртуалке.
Да, скорее всего проблема именно в ней (с пробрасываемым портом).

При попытке передачи 1 байта из МасOSX через этот порт, приемная сторона принимает 3 байта!!!  :o
Если же пытаться в MacOSX принимать данные через этот порт (не важно, cu.serial1 или tty.serial1),
то не срабатывает QSocketNotifier и данные не принимаются.

Отлично работает только из виртуалки, если использовать USB/Serial шнурок (предварительно установив в гостевую
MacOSX драйвер этого шнурка). Для этого нужно в ВМ для гостевой MacOSX выбрать USB девайс (в моем случае это Prolific 2303),
тогда в MacOSX появится порт /dev/tty.usbserial + /dev/cu.usbserial. Вот любой из этих портов и нужно использовать (желательно cu.*).
В этом случае этот порт не является "прокидываемым" и работает как надо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 05, 2012, 20:09
Кстати, выскакивает:
Цитировать
QSocketNotifier::Exception is not supported on Mac OS X

В virtualbox я выбрал не порт а файл, в итоге данные проходят из гостя в хост без искажения.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 05, 2012, 21:24
Цитировать
QSocketNotifier::Exception is not supported on Mac OS X
Это фиг с ним, не критично. Потом исправлю.

Цитировать
В virtualbox я выбрал не порт а файл, в итоге данные проходят из гостя в хост без искажения.
т.е. патч работает?




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 05, 2012, 21:46
т.е. патч работает?
Да, но данные не приходят от устройства. Сейчас нет возможности протестировать более полно. Данные проходят из Mac OS X(гость) в файл (а не порт) Linux (хост).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 05, 2012, 22:07
Ок. Значит это касяк VBox.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 09, 2012, 22:13
QtSerialPort в маке на VirtualBox работает, но при необычных обстоятельствах.
Соединил com-порты двух компьютеров перекрестным кабелем. На первом компьютере linux x86-64, на втором - linux x86. Запустил на обоих компьютерах программу "terminal", убедился что данные передаются в обе стороны.  На первом компьютере закрыл программу "terminal" и запустил VirtualBox + Mac OS X. В Mac OS X запустил программу "terminal" - данные не передаются. Далее, не закрывая Mac, на первом компьютере запустил программу "terminal" и открыл порт. И данные между маком и вторым компьютером начали передаваться в обе стороны без искажений, а на первом компьютере просто запущена программа "terminal" и открыт порт, но ничего не передается.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 09, 2012, 23:20
Цитировать
QtSerialPort в маке на VirtualBox работает, но при необычных обстоятельствах. ...

Что и требовалось доказать. Попробуй на VMWare если будет время и желание, т.к. VBox с маками плохо дружит еще по-ходу.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Ноябрь 11, 2012, 22:54
Я смотрел реализацию последовательного порта под VirtualBox. К сожалению, он много чего не поддерживает. В частности, четность Space/Mark. Короче, реализация там довольно ограниченная. Возможно, под Mac еще более куцая.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 27, 2012, 19:45
Доделал таки свою программу: http://arm-skif.narod.ru/
Кстати, последняя версия библиотеки стала быстрее работать в windows. Раньше было 135-136 обменов в секунду с устройством, сейчас 140-142. Это на скорости 19200.
Устройство с которым работаю: http://bolid.ru/production/devices/devices_63.html


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Пантер от Декабрь 20, 2012, 22:36
Надо заюзать сию либу - есть готовый Find*.cmake или свой писать придется?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 20, 2012, 23:12
http://lord-baskervil.livejournal.com/62738.html
http://code.google.com/p/foxpilot/source/browse/trunk/qgroundcontrol-0.9.0/CMakeModules/FindQSERIALPORT.cmake?r=54


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 24, 2012, 17:17
Приветствую. Такая проблема:
Исходные данные: есть устройство, работаю с ним через QtSerialPort, все хорошо, но если выключить и снова включить девайс при открытом порте со стороны компа, то одно ядро процессора начинает грузиться на 100, и сигналы того потока, где создан и работает QtSerialPort перестают обрабатываться. В смысле не только сигналы, которые относятся к QtSerialPort, но и все другие, например слоты привязанные к таймеру по сигналу timeout() не вызываются. Такое впечатление, что где то внутри библиотеки код зацикливается в бесконечный цикл. ОС: win7 x86, завтра проверю на ubuntu.
Опять же для справки: была такая же проблема с УСБ модемами, если их выткнуть из usb порта при открытом СОМ порте, к нему привязанному, точно такое же поведение было, решил затычкой в виде создания доп. потока, который проверяет наличие порта через SerialPortInfo::isValid(), и если порт пропадал, то он его из того же доп. потока убивал, после чего нагрузка на проц пропадала и все сигналы отрабатывались нормально. При чем это поведение было только под win машинами, в ubuntu таких проблем не наблюдалось.
Для справки 2: в QSerialDevice такого поведения не наблюдается.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 24, 2012, 18:31
Цитировать
но если выключить и снова включить девайс при открытом порте со стороны компа,
Что за девайс и как подключен к компу?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 24, 2012, 18:50
Цитировать
но если выключить и снова включить девайс при открытом порте со стороны компа,
Что за девайс и как подключен к компу?
Девайс самодельный, подключен к компу через железный ком порт по 3-м проводам, rx, tx и gnd, параметры порта зашиты железно, 9600/noparity/noflow/8bit/1stopbit, ну и внутри софтовая реализация rs232-го интерфейса.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Декабрь 24, 2012, 20:01
У меня тоже иногда возникает такая проблема, но я устройство не выключаю. Проблема иногда возникает если запустить мою программу сразу после загрузки win7 x86-64. Программа загружает одно ядро на 100% и съедает всю доступную память. Это появилось когда я начал использовать компилятор от MS вместо MinGW, но при этом я обновил библиотеку QtSerialPort (я подумал на компилятор). У меня проблема возникла пару месяцев назад.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 24, 2012, 20:12
Девайс самодельный, подключен к компу через железный ком порт по 3-м проводам, rx, tx и gnd, параметры порта зашиты железно, 9600/noparity/noflow/8bit/1stopbit, ну и внутри софтовая реализация rs232-го интерфейса.

Если к железному, то включение/отключение девайса не имеет никакого значения, давай пример который воспроизводит проблему.

У меня тоже иногда возникает такая проблема, но я устройство не выключаю. Проблема иногда возникает если запустить мою программу сразу после загрузки win7 x86-64. Программа загружает одно ядро на 100% и съедает всю доступную память. Это появилось когда я начал использовать компилятор от MS вместо MinGW, но при этом я обновил библиотеку QtSerialPort (я подумал на компилятор). У меня проблема возникла пару месяцев назад.


Аналогично, давай минимальный компилябельный пример, который воспроизводит проблему.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Декабрь 24, 2012, 20:17
Я ее сам воспроизвести не могу. Она возникает редко и в самое неподходящее для разбора полетов время. Дома нет винды не на виртуалке, поэкспериментирую на работе.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 24, 2012, 20:17
Девайс самодельный, подключен к компу через железный ком порт по 3-м проводам, rx, tx и gnd, параметры порта зашиты железно, 9600/noparity/noflow/8bit/1stopbit, ну и внутри софтовая реализация rs232-го интерфейса.

Если к железному, то включение/отключение девайса не имеет никакого значения, давай пример который воспроизводит проблему.
пример, который воспроизводит проблему - терминал из стандартных экзамплов.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 24, 2012, 20:48
пример, который воспроизводит проблему - терминал из стандартных экзамплов.

У меня этой проблемы нет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 24, 2012, 20:51
У меня этой проблемы нет.
Завтра попробую поглубже поковыряться - о результатах отпишусь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 10:11
Проблема и в устройстве тоже. Оно по-ходу при включении дает какие-то левые импульсы на выходы rx и tx, и если под линуксом он эти импульсы трактует как байт 0х00, то под виндой - постоянно (кучу раз в микросекунду) вызывается CommOverlappedEventNotifier::processCompletionRoutine с флагом EV_ERR, что и приводит к загрузке одного ядра процессора. QSerialDevice 1.0 под виндой эти импульсы воспринимает как 0х00.
Update: заменил в serialport_win.cpp в процедуре bool SerialPortPrivate::open(QIODevice::OpenMode mode)
Код
C++ (Qt)
   DWORD originalEventMask = EV_ERR;
 
на
Код
C++ (Qt)
   DWORD originalEventMask = 0;
Вроде больше не виснет и проц не загружает. Но по-моему это костыль какой-то.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 25, 2012, 11:21
Цитировать
Вроде больше не виснет и проц не загружает. Но по-моему это костыль какой-то.
Да, это костыль.

Цитировать
вызывается CommOverlappedEventNotifier::processCompletionRoutine с флагом EV_ERR, что и приводит к загрузке одного ядра процессора.

Драйвер порта корректно отрабатывает ошибочную ситуацию.

Кстати, а какое ghb 'njv значение ошибки error d bool SerialPortPrivate::processIoErrors()?

UPD:
Догадываюсь, что это будет CE_BREAK. Т.е. твой девайс при отключении/включении сажает Rx линию на ноль.
Если так - то меняй прошивку девайса.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 11:49
Цитировать
Вроде больше не виснет и проц не загружает. Но по-моему это костыль какой-то.
Да, это костыль.

Цитировать
вызывается CommOverlappedEventNotifier::processCompletionRoutine с флагом EV_ERR, что и приводит к загрузке одного ядра процессора.

Драйвер порта корректно отрабатывает ошибочную ситуацию.

Кстати, а какое ghb 'njv значение ошибки error d bool SerialPortPrivate::processIoErrors()?

UPD:
Догадываюсь, что это будет CE_BREAK. Т.е. твой девайс при отключении/включении сажает Rx линию на ноль.
Если так - то меняй прошивку девайса.
Правильно догадываешься. Но проблема в том, что он один раз выдает этот код ошибки, а потом в бесконечный вызов этой процедуры (bool SerialPortPrivate::processIoErrors()) входит, не заходя в if (ret && error), т.е. clearCommError(...) возвращает false. Не должна же одна ошибка полностью твою библиотеку весить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 25, 2012, 12:04
Тогда попробуй в CommOverlappedEventNotifier::processCompletionRoutine() добавить вызов GetOverlappedResult(), т.е.
должно быть как-то так:

Код
C++ (Qt)
   virtual bool processCompletionRoutine() {
       DWORD numberOfBytesTransferred = 0; // это добавь
       ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE); // и это
       bool ret = false;
       if (EV_ERR & triggeredEventMask)
           ret = dptr->processIoErrors();
       if (EV_RXCHAR & triggeredEventMask)
           ret = dptr->startAsyncRead();
       return ret;
   }
 

Возможно, все-таки мой касяк :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 12:18
Тогда попробуй в CommOverlappedEventNotifier::processCompletionRoutine() добавить вызов GetOverlappedResult(), т.е.

Возможно, все-таки мой касяк :)
К сожалению поведение не изменилось :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 25, 2012, 12:38
Ок, тогда добавь еще это:
Код
C++ (Qt)
   CommOverlappedEventNotifier(SerialPortPrivate *d, DWORD eventMask, QObject *parent)
       : AbstractOverlappedEventNotifier(d, CommEvent, false /*Тут false вместо true поставь*/, parent)
 

UPD:
Цитировать
К сожалению поведение не изменилось
А оно по идее и не должно измениться, пока Rx замкнут на землю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 13:03
Ок, тогда добавь еще это:
Код
C++ (Qt)
   CommOverlappedEventNotifier(SerialPortPrivate *d, DWORD eventMask, QObject *parent)
       : AbstractOverlappedEventNotifier(d, CommEvent, false /*Тут false вместо true поставь*/, parent)
 

UPD:
Цитировать
К сожалению поведение не изменилось
А оно по идее и не должно измениться, пока Rx замкнут на землю.
Он же потом сразу размыкается. Добавил, зацикливание на processIoErrors() пропало, проц не грузится, но какие-либо данные после CE_BREAK не поступают.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 25, 2012, 13:35
Цитировать
Добавил, зацикливание на processIoErrors() пропало
Но а вообще, processIoErrors() вызывается при замкнутых ногах?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 13:45
Цитировать
Добавил, зацикливание на processIoErrors() пропало
Но а вообще, processIoErrors() вызывается при замкнутых ногах?
Один раз вызывается - и всё, больше ни на что не реагирует. Но зацикливания нет. Второй раз processIoErrors() не вызывается.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 25, 2012, 14:32
Ок, тогда все что было внесено ранее (с добавлением false) - оставь, а измени теперь только CommOverlappedEventNotifier::processCompletionRoutine() на:

Код
C++ (Qt)
 
   virtual bool processCompletionRoutine() {
       DWORD numberOfBytesTransferred = 0;
       ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE);
       if (EV_ERR & triggeredEventMask)
           dptr->processIoErrors();
       dptr->startAsyncRead();
       return true;
   }
 



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 14:40
Ок, тогда все что было внесено ранее (с добавлением false) - оставь, а измени теперь только CommOverlappedEventNotifier::processCompletionRoutine() на:

Код
C++ (Qt)
 
   virtual bool processCompletionRoutine() {
       DWORD numberOfBytesTransferred = 0;
       ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE);
       if (EV_ERR & triggeredEventMask)
           dptr->processIoErrors();
       dptr->startAsyncRead();
       return true;
   }
 
Работает!!! Спасибо :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 25, 2012, 14:42
Тогда этот фикс пойдет в патч. Но ты все-равно проверь загрузку CPU. Она должна быть около нуля.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Декабрь 25, 2012, 14:51
Тогда этот фикс пойдет в патч. Но ты все-равно проверь загрузку CPU. Она должна быть около нуля.
Так и есть. Если что - отпишусь. Еще раз спасибо. Уже второй раз оперативно помогаешь :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Декабрь 27, 2012, 13:38
kuzulis, когда фиксишь баг, найденный другим пользователем проси, чтобы он зарегистрировался на qt-project и поддерживал твой патч. А то ты меня просишь поддержать, а я не всегда в курсе (форум не каждый день читаю).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: qt_beginner от Февраль 07, 2013, 14:14
Почему нет возможности работать с устройствами /dev/pts/ ?
Раньше такая возможность была, а теперь с ними нельзя работать - скорость обмена не выставляется


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 07, 2013, 18:25
Не может быть.
Приведи здесь шаги как воспроизвести проблему от начала и до конца.


Название: Важная новость!
Отправлено: kuzulis от Февраль 26, 2013, 20:41
Важная новость!

Сегодня проект перемещен из песочницы в основную ветвь Qt5!

За подробностями - в Вики (http://qt-project.org/wiki/QtSerialPort_Russian)

Всех поздравляю с сим.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Февраль 26, 2013, 20:42
Тебя поздравлять надо :) Грац!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Авварон от Февраль 26, 2013, 21:49
Следил краем уха в рассылке. Поздравляю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Пантер от Февраль 27, 2013, 09:19
Поздравляю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Март 01, 2013, 12:33
Ура! Поздравляю!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 01, 2013, 14:17
Спс. Но поздравлений мало.

Нужна помощь маководов, даже без наличия реальных ком-портов.
Нужно проверить возвращаемое значение одной ф-ции в Маке.

А имено:

1. Открыть пример cenumerator (или enumerator)
2. Удалить в его *.pro файле это:
Цитировать
greaterThan(QT_MAJOR_VERSION, 4) {
    QT       += widgets serialport
} else {
    include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
}
3. Добавить это:
Цитировать
include(../../src/serialport/serialport-lib.pri)

4. В файле "qserialportinfo_mac.cpp" заменить кое что в:

Код
C++ (Qt)
...
   ::CFMutableDictionaryRef matching = ::IOServiceMatching(kIOSerialBSDServiceValue);
 
   ::CFDictionaryAddValue(matching,
                          CFSTR(kIOSerialBSDTypeKey),
                          CFSTR(kIOSerialBSDAllTypes));
 
   io_iterator_t iter = 0;
   kern_return_t kr = ::IOServiceGetMatchingServices(kIOMasterPortDefault,
                                                     matching,
                                                     &iter);
...
 

вместо kIOSerialBSDServiceValue написать какую нить хрень или пустую строку
(т.к. kIOSerialBSDServiceValue  - это просто C-строка)

2. поставить брекпойнт на:

::CFMutableDictionaryRef matching =

посмотреть, что вернется, NULL (или 0) или не нуль!

3. далее поставить брекпойнт на:

IOServiceGetMatchingServices() и посмотреть,
какой код она вернет, ошибку или нет.


Очень нужно, парни, выручайте!  :'(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 01, 2013, 15:32
Или дайте удаленный доступ к Маку с Qt кто нить через TeamViewer... Минут на 10-20


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 05, 2013, 23:01
Я извиняюсь, но где (как) его теперь скачать?
По переходу со страницы ВиКи  по ссылке http://qt.gitorious.org/qtplayground/qtserialport/archive-tarball/master
гиториус говорит: "Sorry, page not found".
Не отрицаю того, что я вероятно не в "теме" т.к. давненько не следил за этим...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Март 06, 2013, 12:43
voldem, проект вырос и покинул детскую площадку. Теперь он тут: http://qt.gitorious.org/qt/qtserialport


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 06, 2013, 15:16
Упс. да, я уже исправил русскую вики. Лучше хдить на английскую :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 06, 2013, 19:37
Понятно, спасибо!


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: voldem от Март 06, 2013, 21:54
А есть более достоверная инструкция(литература)? А то что на русском, что на англ. одни и те же несоответствия (устаревшая инфа в примерах).
И какая может быть причина того, что не собирается релиз? Дебаг норм. Это на MinGW4.8.4, а на 5.0.1 вообще никак...

На qmake ../serialport.pro CONFIG+=release не работает
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 07, 2013, 10:27
Цитировать
И какая может быть причина того, что не собирается релиз?
Эмм...

В Qt4 собирается релиз по умолчанию, не надо ничего указывать (указывать только для дебага надо).
В Qt5 автоматом собираются два таргета сразу, если мне не изменяет память.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 07, 2013, 15:47
Ну, этот ключ я указал, когда по-умолчанию не сработало. Я по ошибке написал MinGW 4.8.4, а на самом деле - Qt 4.8.4 и Qt Creator 2.6.2, а на Qt5 вообще не собирается (стоят вместе на  Win7x64Ultimate)...
Ну что же, буду опять экспериментировать на других машинах. Попробую так же пересобрать Qt... А вообще имеет значение, то что он пересобран на статическую сборку?!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 07, 2013, 17:12
Цитировать
а на Qt5 вообще не собирается (стоят вместе на  Win7x64Ultimate)...

Лог ошибок в студию.

Цитировать
Попробую так же пересобрать Qt... А вообще имеет значение, то что он пересобран на статическую сборку?!

Понятия не имею. Скорее всего - ДА.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: voldem от Март 08, 2013, 01:24
Не выдержал, снёс всё и переставил по-новой(ничего не пересобирал). Лог сборки и установки из командной строки в вложении.

На Qt4.8.4 собирается только Debug, примеры так же запускаются.
Релиз не собирается, пишет:
Код:
:-1: ошибка: cannot find -lQtSerialPort
:-1: ошибка: collect2: ld returned 1 exit status
Полный вывод во вложении.

На Qt5.0.1 собирается и в Дебаг и в Релизе, но примеры не запускаются(в обеих случаях), пишет:
Код:
Не удалось запустить программу. Путь или права недопустимы?
C:\qtserialport-build-Desktop_Qt_5_0_1_MinGW_32bit-______\examples\enumerator\release\enumerator.exe завершился с кодом -1
Запускается C:\qtserialport-build-Desktop_Qt_5_0_1_MinGW_32bit-______\examples\enumerator\release\enumerator.exe...
В соответствующих папках ехе-шки отсутствуют.

Пробовал так же и на другой машине, но с WinXPx86.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: kuzulis от Март 11, 2013, 10:36
Цитата: voldem
На Qt4.8.4 собирается только Debug, примеры так же запускаются.
Не должны запускаться, т.к. в PATH не должно быть пути к QtSerialPort.dll
после сборки.

Цитата: voldem
Релиз не собирается, пишет:
Код:
:-1: ошибка: cannot find -lQtSerialPort
:-1: ошибка: collect2: ld returned 1 exit status
Полный вывод во вложении.
Скорее всего ты не все снес и не почистил директорию с установленной Qt, т.к. скорее всего в неё уже
был когда-то установлен отладочный QtSerialPort. Почисти хорошенько.

Цитата: voldem
На Qt5.0.1 собирается и в Дебаг и в Релизе, но примеры не запускаются(в обеих случаях), пишет:
Код:
Не удалось запустить программу. Путь или права недопустимы?
C:\qtserialport-build-Desktop_Qt_5_0_1_MinGW_32bit-______\examples\enumerator\release\enumerator.exe завершился с кодом -1
Запускается C:\qtserialport-build-Desktop_Qt_5_0_1_MinGW_32bit-______\examples\enumerator\release\enumerator.exe...
В соответствующих папках ехе-шки отсутствуют.

Пробовал так же и на другой машине, но с WinXPx86.
Тут ХЗ, не проверял еще на Qt5. Вроде и не должны запускаться.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: voldem от Март 11, 2013, 11:48
Цитата: voldem
На Qt4.8.4 собирается только Debug, примеры так же запускаются.
Не должны запускаться, т.к. в PATH не должно быть пути к QtSerialPort.dll
после сборки.

Цитата: voldem
Релиз не собирается, пишет:
Код:
:-1: ошибка: cannot find -lQtSerialPort
:-1: ошибка: collect2: ld returned 1 exit status
Полный вывод во вложении.

Скорее всего ты не все снес и не почистил директорию с установленной Qt, т.к. скорее всего в неё уже
был когда-то установлен отладочный QtSerialPort. Почисти хорошенько.

Исключено! После удаления лично проверил папки касательно Qt и вручную удалил оставшиеся (так же из C:\Users\юсер\AppData\Roaming\ ), потом почистил реестр на всякий случай. Или есть еще какие хитрые места ?
А не текущий, установленный из комм.строки? Как раз отладочный только и собрался...

Цитата: voldem
На Qt5.0.1 собирается и в Дебаг и в Релизе, но примеры не запускаются(в обеих случаях), пишет:
Код:
Не удалось запустить программу. Путь или права недопустимы?
C:\qtserialport-build-Desktop_Qt_5_0_1_MinGW_32bit-______\examples\enumerator\release\enumerator.exe завершился с кодом -1
Запускается C:\qtserialport-build-Desktop_Qt_5_0_1_MinGW_32bit-______\examples\enumerator\release\enumerator.exe...
В соответствующих папках ехе-шки отсутствуют.

Пробовал так же и на другой машине, но с WinXPx86.
Тут ХЗ, не проверял еще на Qt5. Вроде и не должны запускаться.

Так зачем же они тогда, если не должны?!

С QSerialDevice проходит все норм.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2013, 11:57
Цитировать
Исключено! После удаления лично проверил папки касательно Qt и вручную удалил оставшиеся (так же из C:\Users\юсер\AppData\Roaming\ ), потом почистил реестр на всякий случай. Или есть еще какие хитрые места ?
А не текущий, установленный из комм.строки? Как раз отладочный только и собрался...

Чудес не бывает (с). Я только что проверил - у меня все собирается.
Попробуй подождать пока не примут этот патч:

https://codereview.qt-project.org/#change,50203

Обновись, возможно это также решит проблему на Qt4.

Цитировать
Так зачем же они тогда, если не должны?!

Эмм.. Примеры будут работать только если ты скомпилил и установил библиотеку,
а также если в твоей PATH прописаны пути к Qt-шным библиотекам.
Иначе не будут.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: voldem от Март 11, 2013, 12:49
Чудес не бывает (с). Я только что проверил - у меня все собирается.
Да, это точно. Но проблема на то похожа, пытаюсь выяснить  в чём дело. Попробую задействовать еще один ПК...
Версия MinGW критична (4.7 в д.случае)?!


Эмм.. Примеры будут работать только если ты скомпилил и установил библиотеку,
а также если в твоей PATH прописаны пути к Qt-шным библиотекам.
Иначе не будут.
А можно по-подробнее? Я проверил (то, что знал), но ничего подобного не нашел, т.е. либо там все ОК, либо я просто не понял о чем речь.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: kuzulis от Март 11, 2013, 13:13
Цитата: voldem
Версия MinGW критична (4.7 в д.случае)?!
А разве Qt4.8.4 поставляется с 4.7?  ;)
Значит критично.


Цитата: voldem
А можно по-подробнее? Я проверил (то, что знал), но ничего подобного не нашел, т.е. либо там все ОК, либо я просто не понял о чем речь.
А что подробного то?

Делаешь qmake && make && make install, потом берешь и запускаешь екзешку примера -
и он должен работать, если конечно в PATH прописаны пути до C:\Qt\bin (или как там у тебя)


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: voldem от Март 11, 2013, 13:25
А разве Qt4.8.4 поставляется с 4.7?  ;)
Значит критично.
Ну, я ставлю все по-отдельности:
-сначала MinGW;
-потом Qt4.8.4;
-потом креатор.
Что-то не видел чтобы Qt4.8.4 был как 5,0,1 или 4,8,1 (все и сразу).
А какая версия(MinGW) тогда должна быть?
Пробовал так же 4,4,0 и 4,4,1, но ничего не получилось...

А что подробного то?

Делаешь qmake && make && make install, потом берешь и запускаешь екзешку примера -
и он должен работать, если конечно в PATH прописаны пути до C:\Qt\bin (или как там у тебя)
Если речь об PATH в "Переменных средах", то там такого нет.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: kuzulis от Март 11, 2013, 13:34
Цитата: voldem
А какая версия(MinGW) тогда должна быть?
Пробовал так же 4,4,0 и 4,4,1, но ничего не получилось...

http://qt-project.org/downloads

Qt 4.8.4 - MinGW 4.4
Qt 5.0.1 - MinGW 4.7


Цитата: voldem
Если речь об PATH в "Переменных средах", то там такого нет.
Ну значит примеры и не должны заускаться.
Кинь в папочку с экзешником все требуемые dll-ки тогда пример заработает,
как и любое другое Qt-шное приложение.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: voldem от Март 11, 2013, 13:59
Цитата: voldem
А какая версия(MinGW) тогда должна быть?
Пробовал так же 4,4,0 и 4,4,1, но ничего не получилось...

http://qt-project.org/downloads

Qt 4.8.4 - MinGW 4.4
Qt 5.0.1 - MinGW 4.7

Странно. Именно эти и ставлю, но Qt 4.8.4 во время установки спрашивает где MinGW. Логично, что значит, что его там нет, по -этому даю ему, то что хочет.

Цитата: voldem
Если речь об PATH в "Переменных средах", то там такого нет.
Ну значит примеры и не должны заускаться.
Кинь в папочку с экзешником все требуемые dll-ки тогда пример заработает,
как и любое другое Qt-шное приложение.

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


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2013, 14:28
Цитировать
Основная проблема не в том, что они не запускаются (я так уже пробовал там, где они появлялись), а в том, что они не появляются и библиотека не компилируется.
Ищи проблемы на своей стороне.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 11, 2013, 17:00
Учитывая все вышеизложенное, еще раз перепроверил и переустановил и вот что из этого получилось.
Т.к. найти и скачать MinGW 4.4 мне не удалось (вернее нашел и скачал, но с ним вообще ничего не работало), то он был скопирован из QtSDK1.2.1 (последний из нокии). В итоге все откомпилировалось и запускалось как сказано выше, но немного по-другому...
Если собирать из комм.строки Qt4.8.4, то по прежнему собирается только Debug, если через креатор, то все собирается. В итоге установил по-отдельности Release и Debug. Теперь запускаются и примеры (это на 4,8,4).
На Qt5.0.1 собирается и Release и Debug, кроме примеров. После установки (вышеуказанным способом) собираются и примеры ...
Попробую пересобрать Qt для статической сборки и попробовать с ним.
Как я понял это нормальное явление? Если да, то не плохо бы задокументировать эти нюансы...
В любом случае благодарен за помощь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2013, 18:30
Цитата: voldem
Если собирать из комм.строки Qt4.8.4, то по прежнему собирается только Debug

Да не может быть...

Цитировать
e:\git\ng\build>set PATH=c:\MinGW\mingw\bin;c:\Qt\4.8.3\bin
e:\git\ng\build>qmake ..\123\qtserialport\qtserialport.pro
e:\git\ng\build>mingw32-make
...
...


В итоге имеем релизную: QtSerialPort.dll ~119KB (хотя использую Qt 4.8.3 а не 4.8.4, но думаю - без разницы)

Цитата: voldem
В итоге установил по-отдельности Release и Debug. Теперь запускаются и примеры (это на 4,8,4)

Для Qt 4.8.x как бы так и планировалось, что пользователь сам знает, какую цель ему собирать.
Хотя ранее, по умолчанию собирались сразу и Release и Debug, но от этого решено было отказаться.
И да, текущая реализация qmake-шных сборочных скриптов для Qt4.8.х желает чтобы ее исправили, но некому :)

Цитата: voldem
На Qt5.0.1 собирается и Release и Debug, кроме примеров. После установки (вышеуказанным способом) собираются и примеры ...

Как я понял, это не проблема QtSerialPort - это проблема самих билд скриптов Qt5 (syncqt - или как там.),
т.е. это поведение распространяется на все модули Qt5.

Хотя по идее, по умолчанию должны собираться только релизные примеры, хотя сама библиотека должна собираться
в двух вариантах.

Цитата: voldem
Как я понял это нормальное явление? Если да, то не плохо бы задокументировать эти нюансы...

Ну так Вики доступна для редактирования - возьми и задокументируй. Но сначала обязательно убедись,
что это воспроизводится не только у тебя.  :)









Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 11, 2013, 19:31

Да не может быть...

Цитировать
e:\git\ng\build>set PATH=c:\MinGW\mingw\bin;c:\Qt\4.8.3\bin
e:\git\ng\build>qmake ..\123\qtserialport\qtserialport.pro
e:\git\ng\build>mingw32-make
...
...


В итоге имеем релизную: QtSerialPort.dll ~119KB (хотя использую Qt 4.8.3 а не 4.8.4, но думаю - без разницы)


У меня там (в папке \serialport-build\src\serialport\release\) после сборки (через комм.строку) только один файл ~570byte QtSerialPort.prl.
В \serialport-build\src\serialport\debug\ есть QtSerialPortd.dll и др.
Вот по-этому и говорю...

Ну так Вики доступна для редактирования - возьми и задокументируй. Но сначала обязательно убедись,
что это воспроизводится не только у тебя.  :)
Вот по-этому и спрашиваю, а то мало ли... Может по неосведомленности что-то делаю не то (или наоборот, лишнее делаю), рановато еще...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 14, 2013, 17:26
2 voldem , упс, да, подтверждаю.

На Qt4.8.4 по умолчанию билдится дебаг версия (по крайней мере в Windows) - как это побороть пока неизвестно.

Поэтому для сборки лучше принудительно указывать таргет:
Цитировать
$$qmake <path/to/project/*.pro> CONFIG+=release


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Март 20, 2013, 10:42
Кхм. А как собрать на него документацию?

Ранее как то само собиралось, теперь же после скачивания и сборки нигде нет проекта для документации :)

PS и что, убраны все методы с QByteArray? хмм...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 20, 2013, 11:05
Цитата: Bepec
Кхм. А как собрать на него документацию?

Ранее как то само собиралось, теперь же после скачивания и сборки нигде нет проекта для документации :)
Не, не собиралось. Надо было плясать с бубном чтобы собрать.
Теперь для Qt4.8.x не будет документации вообще.

Планируется (по крайней мере ранее планировалось), что документация будет доступна только для Qt5 и
выложена типа "оффициально" на http://qt-project.org.

Цитата: Bepec
PS и что, убраны все методы с QByteArray? хмм...

В смысле?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Март 20, 2013, 12:04
OMG, извиняюсь по поводу методов. Это я сглупил перед обедом.

Жалко что нет документации. Ладненько. Благодарю за быструю реакцию на вопрос.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 20, 2013, 15:52
Цитата: Bepec
Кхм. А как собрать на него документацию?

Ранее как то само собиралось, теперь же после скачивания и сборки нигде нет проекта для документации :)
Не, не собиралось. Надо было плясать с бубном чтобы собрать.
Теперь для Qt4.8.x не будет документации вообще.

Планируется (по крайней мере ранее планировалось), что документация будет доступна только для Qt5 и
выложена типа "оффициально" на http://qt-project.org.


А как же теперь быть с документацией?!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Март 20, 2013, 16:40
Я через доксиген прогнал. Конечно не Assistant, но и так неплохо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 20, 2013, 17:25
Цитировать
А как же теперь быть с документацией?!

Под Qt5 должна собираться, но никто не пробовал это делать после кучи выполненных изменений. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 20, 2013, 17:47
Я через доксиген прогнал. Конечно не Assistant, но и так неплохо.
Я извиняюсь, но не могли бы Вы немного просветить как это сделать, а то ранее с доксигеном не работал и что-то не получается?

Цитировать
А как же теперь быть с документацией?!

Под Qt5 должна собираться, но никто не пробовал это делать после кучи выполненных изменений. :)

Ну сегодня вечером могу попробовать. На что мне стоит обратить внимание или какие рекомендации можете дать по этому поводу?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Март 20, 2013, 18:00
запихиваешь ашники в доксиген. На выходе получаешь красивые html-вские  списки методов.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 20, 2013, 18:27
Не, не надо доксигена, для Qt5 документация собирается как надо, только надо кое-что подправить.

Ниже инфо как собрать документацию из QtCreator, просто собрав библиотеку.

1. Естественно, скачать и установить Qt 5.0.1 (она текущая доступная)
2. Настроить Kits в QtCreator на использование Qt 5.0.1
3. Скачать сорцы QtSerialPort.
4. Открыть в QtCreator файл qtserialport.pro, выбрать Qt5 Kit.
6. В свойствах проекта добавить дополнительный Build Step и в аргументы написать цель docs (см. скриншот.)
7. Заменить в сорцах QtSerialPort содержимое файла qtserialport.qdocconf (см. ссылку на Pastebin).
8. Жмакнуть в QtCreator "Rebuild/Пересобрать", подождать, и вуа-ля., готово :)

Правда при генерации документации будет много варнингов, т.к. не все ссылки и неправильно указаны в документации.

(http://s3.postimage.org/5vthajv6n/doc.jpg) (http://postimage.org/image/5vthajv6n/)

Нужное содержимое файла qtserialport.qdocconf (http://pastebin.com/1nzKPhd6)





Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Март 20, 2013, 19:20
У меня 4.7.2 к сожалению. Потому - доксиген :D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: voldem от Март 20, 2013, 23:15


Спасибо! Всё получилось (95 варнингов)!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 27, 2013, 11:03
Люди,

может кто-нить проверить этот патч для MacOSX?

https://codereview.qt-project.org/#change,52264

Этот патч должен возвращать не пустое description() для Bluetooth serial ports.

В принципе, наличие отдельных USB блютус свистков не обязательно (но желательно).

Если нет свистков - не беда, в Mac по умолчанию почему-то доступны Bluetooth-Modem + InfraRed Port
(по крайней мере у меня на виртуалке).

А если есть свистки - то можно сделать спаривание по SPP с каким-то девайсом. Например,
я "спариваюсь" с android Samsumg смартфоном на котором предварительно установлена
программка "GetBlue Demo".


Надо просто накатить этот патч, пересобрать библиотеку, запустить пример /enumerator,
и посмотреть, что будет отображаться в Description для данного устройства.

Может кто помочь?


PS: Я у себя в виртуалке проверил на барсике с ядром 10.6.8, но желательно иметь инфу и
в львенке с 10.7.х-10.8.х.


Название: Re: QtSerialPort, Android. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 01, 2013, 16:45
В списке рассылки началось обсуждение (по крайней мере поднялась тема) портирования на Android.

Если кому интересно или кто может помочь  - присоединяйтесь.  :)

Вот тут: https://bugreports.qt-project.org/browse/QTBUG-32672 можно следить за процессом.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Сентябрь 25, 2013, 15:34
Я порылся по ссылкам старым, желая найти исходники QtSerialPort под Qt4, но нашёл только под Qt 5.1.
Может быть я слеп, или не замечаю ссылки, но всё что я могу скачать вызывает у моего Qt 4.7.2 припадки.

PS Git'ом не пользовался раньше, но вроде там все её версии начинаются с 5.01.

PPS извиняюсь заранее, если ответ на вопрос очевиден.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 25, 2013, 17:16
Ну как бы исходники они там одновременно и для Qt4 и Qt5. Скачать можно или Git-ом,
или прямо на гиториусе: https://qt.gitorious.org/qt/qtserialport/source/cae0bb18e4fdb5fedb8bec0054ae1acfa101d22b:

Минимальная Qt4 должна быть 4.8.0. Если ниже - то будут ошибки, связанные с QElapsedTimer или как-то так. Ты можешь просто заменить QElapsedTimer на QTimer, плюс, пофиксить другие сопустствующие..
И в принципе, оно должно заработать. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 21, 2013, 14:29
Очередной вопрос по библиотеке - позволяет ли она использование порта (QSerialPort) из разных потоков?

В смысле передавать указатель на него в потоки. Один читает, второй пишет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 21, 2013, 14:32
Не. Он не thread-safe, как и все QIODevice классы из Qt (если не ошибаюсь).

А зачем оно надо то?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Ноябрь 21, 2013, 14:50
Да тут красивая плагинная архитектура у программы. Читает один плагин, пишет другой, может писать третий.
Т.е. самый простой выход - написать свой менеджер? Чтение то вынести можно, оно сигнальное, а вот писанину...

PS извиняюсь если отвлекаю.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 21, 2013, 15:10
> написать свой менеджер?

скорее всего


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 24, 2013, 23:46
Скачал последнюю версию библиотеки, что-то не захотела собираться для qt4, пришлось немного поправить:
Код:
qserialport_unix_p.h
-#include <QtCore/qlockfile.h>
+#include "qt4support/include/QtCore/qlockfile.h"
+#ifndef QStringLiteral
+#define QStringLiteral(str) QString::fromUtf8(str)
+#endif

qserialportinfo_unix.cpp
-#include <QtCore/qlockfile.h>
+#include "qt4support/include/QtCore/qlockfile.h"

qt4support/src/qlockfile.cpp
-#include "qlockfile.h"
-#include "qlockfile_p.h"
+#include "../include/QtCore/qlockfile.h"
+#include "../include/private/qlockfile_p.h"

qt4support/include/private/qlockfile_p.h
-#include <QtCore/qlockfile.h>
+#include "../QtCore/qlockfile.h"

qt4support/src/qlockfile_unix.cpp
-#include "private/qlockfile_p.h"
+#include "../include/private/qlockfile_p.h"

qserialport_win_p.h
+#ifndef QStringLiteral
+#define QStringLiteral(str) QString::fromUtf8(str)
+#endif

qserialport_win.cpp
-#include <QtCore/qwineventnotifier.h>
+#include "qt4support/include/QtCore/qwineventnotifier.h"

Или нужно было собирать как-то по другому?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 25, 2013, 14:03
А как собирал то? Какая ОС?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 25, 2013, 14:10
Собирал в Qt-creator. Linux x86-64, WindowsXP x86. После правки все собралось и работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 25, 2013, 14:14
Что-то не так делаешь.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Ноябрь 25, 2013, 14:27
Ага, точно. Запускал файл .pro не в корневой папке, а в src/serialport/serialport.pro Нужно было собрать только библиотеки а не весь проект. Теперь буду знать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Декабрь 07, 2013, 09:23
Докину мелкую проблемку.

Имеется такая прога - Virtual Null Modem (www.aggsoft....ru/virtual-null-modem.htm).
Создаёт связанные порты. Очень удобно.

Но... Библиотека не видит портов его ;) Хотя если указывать вручную, открывает и работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 07, 2013, 15:18
Это косяк самого этого софта (ИМХО), этот баг уже есть в трекере: https://bugreports.qt-project.org/browse/QTBUG-32774

Эта софтина не устанавливает в реестре ключ типа "PortName", а имеет только ключ "PortNumber" (или как-то так), что некорректно и не соответствует рекомендациям от MS. Поэтому QSerialPortInfo игнорит это устройство, т.к. не находит его имени.

Возможно имеется и другой способ как получить имя порта для virtual-null-modem софта. Но пока я не в курсе как.. Нужно покопаться в этом.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Декабрь 07, 2013, 15:25
Просто я уже второй раз на этот "косяк" с портами попадаю. Мб стоит всё же искать в реестре ключи?

По адресу "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM" лежат все порты.

PPS а вы откуда берёте данные? (в исходниках копаться не предлагайте. Не хотите отвечать - лучше так и ответьте :) )


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 07, 2013, 15:42
> По адресу "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM" лежат все порты.

Не все.

1. Никто не мешает мне написать драйвер так, чтобы там этого не было. Но конечно, это будет изврат и так никто не делает. :)
2. Кроме того из "DEVICEMAP\SERIALCOMM" ты можешь узнать только имя порта и больше ничего.

> PPS а вы откуда берёте данные?

В винде для получения любой инфы об устройстве принято использовать SetupClassGUID и/или DeviceInterfaceClassGuid. Т.е. каждое у-во принадлежит к какому-то предопределенному классу и можно с помощью SetupAPI проэнумеровать все доступные устройства относящиеся к определенному классу.
Для последовательных портов/модемов MS резервирует набор предопределенных классов, которые должны использовать разработчики драйверов у-в, а также дает рекомендации по содержимому веток реестра для этого:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff546990%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff546972%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff546963%28v=vs.85%29.aspx

Но если какая-то компания-разработчик драйверов кладет болт на эти рекомендации - то это их проблемы.  :)

UPD: Ты можешь использовать свободный проект типа com0com  (http://sourceforge.net/projects/com0com/) или проприетарный от Eltima Software (неплохой софт у них) вместо проприетарного Virtual Null Modem - благо выбор огромен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Январь 20, 2014, 10:22
Опять я вылезаю из подземелья.

В очередной раз попытался собрать вашу библиотеку под VS2008/Qt 4.7.2. В коде встречаются инструкции типа find_If (насколько я понимаю это новый стандарт).

Собственно сам кусок в QSerialPortInfo_win.cpp : 210
Код:
if (std::find_if(serialPortInfoList.begin(), serialPortInfoList.end(),
 SerialPortNameEqualFunctor(s)) != serialPortInfoList.end()
){
                continue;
            }

Не могли бы вы пояснить что делает этот код ? Видимо какая то проверка, но вот на что...

PS в идеале конечно бы добавить там инструкции типа #if QT_VERSION >= 0x040100. Но это уже на ваше рассмотрение.
PPS библиотеку то собрал.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Январь 20, 2014, 10:25
В коде встречаются инструкции типа find_If (насколько я понимаю это новый стандарт).
Это стандартный с++ (точнее stl), довольно древний. Ни какой это не новый стандарт. :)
http://www.cplusplus.com/reference/algorithm/find_if/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 20, 2014, 10:33
Код:
Видимо какая то проверка, но вот на что...

На наличие в списке уже такого же имени порта как и текущего найденного. Если это имя уже есть - то пропускаем т.к. уже ранее обработали данный порт.
Т.е там могут несколько раз попадаться те-же порты, поэтому нужно отсеить лишнее.

А в чем собственно проблема? Ошибки сборки в 2008?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Январь 20, 2014, 11:51
Да заколдованная библиотека в общем. Каждый раз при сборке ошибки всякие.

Кхм. Действительно есть в стандарте. Почему то VS в упор не видит. Разберусь.

PS спасибо за быстрый ответ.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 20, 2014, 12:59
Цитировать
Каждый раз при сборке ошибки всякие.

Не может быть :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Январь 20, 2014, 13:19
Ну собираю когда систему переставляю, либо ЧП какое нить. Каждый раз нормально не собирается. Поднимается вопрос о прямоте рук, но я его игнорирую :D


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Figaro от Январь 21, 2014, 13:09
Руки а главное мозг надо тренировать... еще десяток раз переставите - запомните:-)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 21, 2014, 23:59
Я попробовал библиотеку (от 06.01.2014) на одноплатном компьютере Raspberry PI. Работает. Дистрибутив linux собран при помощи BuildRoot 2013.11. Порт встроенный, ttyAMA0. Согласование уровней через микросхему MAX232CPE. Загрузка процессора 4%.

Не знаю, нужна ли вам информация о тестировании на ARMe. Может кто-то уже проверил работу библиотеки на ARMe.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 22, 2014, 10:23
@Phoenix,

да, спасибо за статистику.

И да, загрузка на 4% это очень много. Я уже встречал много упоминаний об большой загрузке CPU на Linux.
Вот тут https://codereview.qt-project.org/#change,75708 человек также упоминает от этом.

Пока сошлись на мнении что это баг QSocketNotifier и/или кривая реализация Qt event-loop (хотя я сомневаюсь в этом).
Но пока нет сравнительных тестов - не имеет смысла о чем-то разговаривать, возможно что нужно что-то в QtSerialPort подкрутить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 22, 2014, 10:57
Пожалуйста.
Добавлю. Я не пользуюсь сигналами, а создаю отдельный поток с waitForReadyRead. Обмен с устройством идет на скорости 19200, ~122 обменов в секунду (запрос/ответ).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 24, 2014, 21:54
На raspberry pi преобразователь usb-rs232 (FTDI FT232RL) тоже работает, но загрузка процессора 10%. На скорости 19200 - 130 обменов в секунду с устройством.
Преобразователь: http://bolid.ru/production/orion/interface-converter/usb-rs232.html


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 26, 2014, 23:14
Возможно действительно такая нагрузка из-за особенностей событий Qt. Я подключил raspberry к устройству по erhernet (не задействуя библиотеку QtSerialport), передача по UDP (QUdpSocket). При скорости 70 обменов в секунду - нагрузка на процессор 6%.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Февраль 03, 2014, 18:37
Собственно собрал ещё раз библиотечку под VS2008.

1) алгоритмы в файле qserialportinfo_p.h не включены. 
2) не добавлена папка в additional Include ".\GeneratedFiles\$(ConfigurationName)", куда при конвертации проекта сыпятся moc_*.cpp. Потому ругается сильно.
это уже специфика VS2008 + QtAddin я думаю, но вдруг кому полезно будет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Февраль 07, 2014, 15:44
Что такое "Протекает наложенное событие ввода/вывода."? Эта ошибка появляется в логе программы от QtSerilaPort, если программа запускается во время загрузки windows. Не мешает, но интересно почему появляется.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2014, 13:51
Цитировать
"Протекает наложенное событие ввода/вывода."

Это наверно ERROR_IO_PENDING. При асинхронном I/O это обычная штука.

Цитировать
Возможно действительно такая нагрузка из-за особенностей событий Qt.

Я тут набросал некоторую статистику загрузки CPU от типа ОС, скорости, типа устройства и т.п. (из того что смог найти под рукой):
https://bugreports.qt-project.org/browse/QTBUG-36684

Результаты удручающие (если не сказать фейловые). Загрузка CPU просто ошеломляет, особенно под Linux (до 90% при использовании socat). Под Windows ситуация немного лучше (там до 40% при использовании com0com без эмуляции скорости). Но это, товарищи, никуда не годится, потому что в идеале она должна быть около ~0% т.к. все операции асинхронные и неблокирующие.

Кого здесь винить - я не знаю, или I/O подсистема в Qt вообще никакая, или у нас (меня) кривые руки, или драйвера хреновенькие, или tty подсистема в Linux - это шлак или что-то еще. В любом случае надо сравнить с загрузкой чисто Си-шных решений без всякого там Qt и прочего..

Мда, вот такие дела.  :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Февраль 08, 2014, 16:17
>>при использовании com0com
надо без него пробовать, а с реальным нульмодемным шнурком. Этот com0com помнится мне чудил периодически поэтому я от него отказался.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Февраль 08, 2014, 16:31
com0com гадость. Пробовали, знаем. Много раз при рандомных условиях начинал "тухнуть", не пропускать кадры, отмирать до перезагрузки компа.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2014, 17:37
Цитата:  lit-uriy
надо без него пробовать, а с реальным нульмодемным шнурком. Этот com0com помнится мне чудил периодически поэтому я от него отказался.
Юр, ну бы хоть посмотрел на ссылку что я дал. Там и шнурок реальный тоже был.. И тоже загрузка CPU нехилая до ~8% на 115200 (в винде). :)

Цитата:  Bepec
com0com гадость. Пробовали, знаем. Много раз при рандомных условиях начинал "тухнуть", не пропускать кадры, отмирать до перезагрузки компа.

Не было такого замечено ни-разу . :)

И зря вы, парни, хаите com0com - он показывает ~0% при включенной "baud rate emulation" (даже при 1.000.000 бодах), что вполне допустимо. Но без эмуляции (когда скорость - по максимуму 38 мегабайт в секунду) - тут уже 40% набегает. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 08, 2014, 17:40
В linux версии используются QSocketNotifier?
Под профайлером не пытались запускать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2014, 17:43
Цитата: Old
В linux версии используются QSocketNotifier?

Ага.

Цитата: Old
Под профайлером не пытались запускать?

Думаю толку не будет в профайлере, т.к. нужно и само Qt core тоже с ним (с опциями профилировки) пересобирать. Или я не прав?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Февраль 08, 2014, 17:54
>>Юр, ну бы хоть посмотрел на ссылку что я дал
Я посмотрел, но честно говоря не сильно понял. "baud rate emulation" это что за зверь такой?

>>Но без эмуляции (когда скорость - по максимуму 38 мегабайт в секунду) - тут уже 40% набегает.
вот меня в  этом com0com напрягало какое-то  непонятное изобретение чего-то.
Есть COM-порт у него есть скорость, как её эмулировать можно? Типа едя я на запарожце под 40 км/час по городу и эмулирую буд-то еду под 40 км/час.
Ерунда какая-то.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 08, 2014, 17:58
Не могу скачать тестовую программку. Что там, просто асинхронное чтение из порта?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2014, 18:37
Цитата: lit-uriy
Я посмотрел, но честно говоря не сильно понял. "baud rate emulation" это что за зверь такой?

com0com в своем конфигураторе имеет галочку "эмулировать боды". Если она включена по com0com будет передавать данные между своими устройствами на скоростях, с которыми конфигурируются последовательные порты при открытии. Если было 9600 - то на 9600 и т.д Но если галочка снята то скорость игнорится и все данные передаются на максимально возможной которая поддерживается драйвером, это около 38 магабайт/сек.

Цитата: lit-uriy
Есть COM-порт у него есть скорость, как её эмулировать можно?

Ну дык это же виртуальное устройство, не привязано ни к какой хардвари, ни к каким клокам. Тут скорость любую можно задать.  :)

Цитата:  Old
Не могу скачать тестовую программку. Что там, просто асинхронное чтение из порта?

Приаттачил тут, на всякий случай. Там две программки: читатель и писатель. Простые и банальные. Вся работа через сигналы/слоты.
Запускать так: <имя программки> <имя порта> <скорость в бодах>, например: stressreader.exe COM1 9600. Читатель также подсчитывает среднюю фактическую скорость приема: кол-во принятых байт за 10 секунд делит на 10.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 08, 2014, 18:57
Интересно еще смотреть на средний размер получаемого пакета данных. Т.е. сколько в среднем читается на один сигнал readyRead. Тогда будет понятно сколько раз срабатывает select в главном цикле.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 08, 2014, 19:12
где-то так: http://www.qtcentre.org/threads/57633-QSerialPort-read-delay?p=257542#post257542

Там и ниже еще есть дополнение (т.е. и для com0com и для реальных шнурков). Там приведено кол-во читаемых байт при каждом readyRead(). Но там результаты виндовые, но и для Linux результаты примерно те-же. Т.е. около 8~20 байт за раз, зависит от скорости, драйвера устройства, и прочих факторов.

UPD: Я думал уже о том, что нужно по-идее как-то размазать срабатывание событий во времени, т.е. с некоторой задержкой. Например, при первом событии RX_CHAR ничего не читать, а запускать таймер, например на 1-10 мсек, и только после срабатывания таймера читать все из устройства. Это должно разгрузить event-loop, но имеет и побочный эффект: если нужно прочитать всего один байт (или небольшое их кол-во), то он/они прочитаются с задержкой, что может быть в некоторых случаях неприемлемым.

Хотя я попробовал уже реализовать что-то подобное (ради эксперимента) и использовал QTimer, но нагрузка выросла до 90% при 9600 бод..  Наверно где-то накосячил. :)



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 09, 2014, 09:26
Набросал стресс-тестер на boost::asio.
Код
C++ (Qt)
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/program_options.hpp>
 
namespace ba = boost::asio;
namespace bs = boost::system;
namespace po = boost::program_options;
 
static const int timeInterval = 10;
 
// ====================================================================================
class reader
{
public:
reader( ba::io_service &srv, ba::serial_port &port ) :
m_srv( srv ),
m_port( port ),
m_timer( srv ),
m_buf( 1024 ),
m_total( 0 )
{
m_port.async_read_some( ba::buffer( m_buf ), boost::bind( &reader::on_readed, this, ba::placeholders::error, ba::placeholders::bytes_transferred ) );
 
m_timer.expires_from_now( boost::posix_time::seconds( timeInterval ) );
m_timer.async_wait( boost::bind( &reader::on_timeout, this, ba::placeholders::error ) );
}
 
protected:
void on_readed( const bs::error_code &error, size_t bytes_transferred )
{
if( error )
{
if( error == ba::error::operation_aborted )
return;
 
std::cerr << "Error: " << error.message() << std::endl;
}
else
{
m_total += bytes_transferred;
m_port.async_read_some( ba::buffer( m_buf ), boost::bind( &reader::on_readed, this, ba::placeholders::error, ba::placeholders::bytes_transferred ) );
}
}
 
void on_timeout( const bs::error_code &error )
{
if( error == ba::error::operation_aborted )
return;
 
std::cout << "Speed: " << double( m_total ) / timeInterval << std::endl;
m_total = 0;
 
m_timer.expires_from_now( boost::posix_time::seconds( timeInterval ) );
m_timer.async_wait( boost::bind( &reader::on_timeout, this, ba::placeholders::error ) );
}
 
ba::io_service &m_srv;
ba::serial_port &m_port;
ba::deadline_timer m_timer;
std::vector<char> m_buf;
int m_total;
};
 
// ====================================================================================
class writer
{
public:
writer( ba::io_service &srv, ba::serial_port &port ) :
m_srv( srv ),
m_port( port ),
m_buf( "Test string\n\r" )
{
ba::async_write( m_port, ba::buffer( m_buf ), boost::bind( &writer::on_writed, this, ba::placeholders::error ) );
}
 
protected:
void on_writed( const bs::error_code &error )
{
if( error )
{
if( error == ba::error::operation_aborted )
return;
 
std::cerr << "Error: " << error.message() << std::endl;
}
else
{
std::cout << "Writed data: " << m_buf.size() << " byte(s)." << std::endl;
ba::async_write( m_port, ba::buffer( m_buf ), boost::bind( &writer::on_writed, this, ba::placeholders::error ) );
}
}
 
ba::io_service &m_srv;
ba::serial_port &m_port;
std::string m_buf;
};
 
// ====================================================================================
int main( int argc, char *argv[] )
{
std::cout << "Serial port tester" << std::endl;
 
std::string mode;
std::string portname;
int speed;
 
po::options_description desc( "Options" );
desc.add_options()
( "help,h", "produce help message" )
( "speed,s", po::value<int>( &speed )->default_value( 9600 ), "port speed" )
( "mode", po::value<std::string>( &mode )->required(), "Mode: r | w" )
( "portname", po::value<std::string>( &portname )->required(), "port name" )
;
 
po::positional_options_description pos_options;
pos_options.add( "mode", 1 );
pos_options.add( "portname", 1 );
 
try
{
po::variables_map vm;
 
po::store( po::command_line_parser( argc, argv ).options( desc ).positional( pos_options ).run(), vm );
 
if( vm.count( "help" ) )
{
std::cout << desc << std::endl;
return 1;
}
 
po::notify( vm );
}
catch( po::error &e )
{
std::cout << e.what() << std::endl;
std::cout << desc << std::endl;
return 10;
}
 
std::cout << "Mode: " << mode << std::endl
 << "Port: " << portname << std::endl
 << "Speed: " << speed << std::endl;
 
try
{
ba::io_service io;
ba::serial_port port( io );
 
port.open( portname );
if( !port.is_open() )
{
std::cerr << "Error open serial port: " << portname << std::endl;
return 2;
}
 
port.set_option( ba::serial_port_base::baud_rate( speed ) );
 
if( mode[ 0 ] == 'w' || mode[ 0 ] == 'W' )
{
writer worker( io, port );
io.run();
}
else
{
reader worker( io, port );
io.run();
}
}
catch( std::exception &e )
{
std::cerr << e.what() << std::endl;
return 3;
}
 
return 0;
}
 

Сборка:
g++ main.cpp -lboost_system -lboost_program_options

Запуск:
main r /dev/ttyS0 --speed 9600     (читатель)
main w /dev/ttyS1 --speed 9600    (писатель)

Погонять смог только на socat, процессор жрет сильно. Интересно как будет работать на реальном железе.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 09, 2014, 17:53
Огромное спасибо за буст! :)

Я немного переделал твой пример: разбил на два приложения (читатель/писатель), сделал из него qmake проект (в *.pro файл добавил чтобы удобнее было компилить), и увеличил размер передаваемого блока данных до 1024 байт (чтобы было также как и в Qt-шных тестах с QtSerialPort).

Проверил под Linux и результаты буста где-то в два раза лучше.. см. сводные таблички тут: https://bugreports.qt-project.org/browse/QTBUG-36684
также туда я приаттачил и бустовые тестовые проектики.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 09, 2014, 18:53
Проверил под Linux и результаты буста где-то в два раза лучше..
boost для linux использует epoll.
Можно попробовать написать свой QSocketNotifier использующий epoll, потому что сильно ускорить select вряд ли получится. Что бы разгрузить процессор понадобиться как-то сократить количество вызовов select, например, что бы он вызывался не каждую итерацию mainloop.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Февраль 10, 2014, 10:46
Я думал уже о том, что нужно по-идее как-то размазать срабатывание событий во времени, т.е. с некоторой задержкой. Например, при первом событии RX_CHAR ничего не читать, а запускать таймер, например на 1-10 мсек, и только после срабатывания таймера читать все из устройства. Это должно разгрузить event-loop, но имеет и побочный эффект: если нужно прочитать всего один байт (или небольшое их кол-во), то он/они прочитаются с задержкой, что может быть в некоторых случаях неприемлемым.

Может быть задержку сделать настраиваемой? Для одной программы нужны отдельные байты, для другой нужны пакеты данных. Например в Moxa nport есть параметр, который задает паузу между пакетами данных. Если данные не приходят определенное время, то считается что это конец пакета и данные из буфера nport передаются драйверу nport. Если бы обмен данными по LAN между устройством nport и драйвером nport был по одному байту, то скорость была бы очень низкой.

Если продолжить аналогию с Moxa nport, то можно еще добавить критерии определения момента отправки данных получателю. Например отправлять данные если выполнено одно из трех условий:
1. данные не приходят определенной время;
2. в буфере уже есть определенное количество данных (например 5 байт);
3. встретилась определенная последовательность данных (это не всегда требуется, т.к. конец пакета иногда заканчивается CRC, а не конкретными данными).
Все критерии сделать настраиваемыми.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 10, 2014, 11:32
@Phoenix ,

ох, это уж слишком.

На крайний случай можно добавить некоторое апи get/set, которое может устанавливать задержку readyRead(), типа:

setReadyReadDeferred(int msec) / isReadyReadDeferred() const

хотя, хз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Февраль 10, 2014, 11:53
Отложенная (Deferred) отправка данных может не всегда сработать как нужно. Да и количество событий может не уменьшиться из за добавления событий таймера. Имхо нужно определять временной интервал именно между байтами.

Например так:
1. приняли байт, запустили таймер;
2. если таймер сработал, то отправляем данные;
3. если таймер не сработал, а мы приняли еще байт, то убиваем таймер и запускаем заново.
4. если таймер не сработал, а в буфере уже определенное количество данных, то убиваем таймер и отправляем данные.

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


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 10, 2014, 15:19
@Phoenix ,

ох, это уж слишком.

На крайний случай можно добавить некоторое апи get/set, которое может устанавливать задержку readyRead(), типа:

setReadyReadDeferred(int msec) / isReadyReadDeferred() const

хотя, хз.
Можно добавить базовый класс Стратегии отправки/получения,  от него отнаследовать несколько предопределенный стратегий и дать возможность пользователю описывать свои.
Тогда пользователь сможет детально описывать поведение, а кому не надо - оставит стратегию по умолчанию.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 10, 2014, 16:41
Не прокатит. Слишком сложно, да и не пропустят, по крайней мере до Qt 5.3 или Qt 6


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Февраль 10, 2014, 16:46
Не прокатит. Слишком сложно, да и не пропустят, по крайней мере до Qt 5.3 или Qt 6
Ну это были больше мысли в слух, ну может в далекую перспективу... :)
А вот попробовать организовать свой нотификатор вполне реально.
И по хорошему, Qt пора переводить с select на epoll и сразу вынести эту обработку в отдельную сущность, что бы в будущем легко можно было менять/расширять.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: b-s-a от Февраль 11, 2014, 16:33
задержка должна зависеть от скорости порта. Например: тебе известно, что за 1 секунду может максимум придти 1000 байт. Предыдущий эвент сработал 0.3 секунды назад. Если сейчас пришло ~300 байт, то передача скорее всего не окончена, поэтому можно "пропустить". Если пришло меньше этого количества, то передача скорее всего закончена (или прерывалась) и нужно уведомить пользователя.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: chagovets от Март 17, 2014, 16:57
Столкнулся с такой проблемой: при использовании библиотеки в приложении, запускаемом через удалённый рабочий стол (RDP), срабатывание сигнала readyRead происходит всего один раз. После этого ни какой реакции com-порта. После перезапуска приложения ситуация повторяется.
При локальном запуске приложения подобная ситуация не наблюдается - всё работает как надо.
Сервер Windows Server 2008 R2 Enterprise SP1 x64.
Клиент Windows 7 (64 bit, 32 bit).
Qt 4.8.5
Кто-нибудь сталкивался с подобным?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Май 01, 2014, 18:57
Столкнулся с проблемой с библиотекой, скачанной 27.04.2014.
В WinXP данные отправляются, но не принимаются. Если заменить эту библиотеку на ранее скачанную (кажется 29.03.2014), то все работает.
Еще не пойму почему вызов waitForBytesWritten выдает false, errorString выдает "Протекает наложенное событие ввода/вывода".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Alex_K от Май 12, 2014, 11:22
Аналогично, скачал недавно 5.3RC, перестала работать отправка данных. Первый пакет отправляется, а дальше - Протекает наложенное событие ввода/вывода. При этом слоты не подключены, только 2 раза write и waitForBytesWritten.
Если подкинуть этот исполняемый файл к либам 5.2.0, то работает. Прога, скомпилированная под комплектом 5.2.0, соответственно тоже работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 12, 2014, 12:01
Пробуйте патч: https://codereview.qt-project.org/#change,78274

1. Устанавливаем Git отсюда: http://git-scm.com/
2. Делаем правый клик мышкой и в контекстном меню выбираем "Git bash here"
3. Из гитовой консоли делаем:
Цитировать
git clone git://gitorious.org/qt/qtserialport.git
cd qtserialport
git fetch https://codereview.qt-project.org/p/qt/qtserialport refs/changes/74/78274/3 && git checkout FETCH_HEAD

3. Смотрим, что изменения появились
4. Пересобираем и устанавливаем QtSerialPort как написано тут: https://qt-project.org/wiki/QtSerialPort#e290b0f84383a96ecdf7f6b720b72092
5. проверяем работу waitForBytesWritten()


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Alex_K от Май 12, 2014, 14:27
Почти чудо - заработало сразу после сборки и установки библиотеки с патчем.
В 5.2 имелись еще проблемы такого рода: данные отправлялись, но ответ приходил только после следующего пакета. Это поведение не могу воспроизвести у себя, отпишусь, исправилось ли это в 5.3 с патчем на тех машинах, где было.
В 5.3 заработал вывод приложения под Андроидом, так что более эффективно продолжу эксперименты с подключением к устройству по последовательному порту через блютус.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 12, 2014, 15:16
Цитировать
Почти чудо - заработало сразу после сборки и установки библиотеки с патчем.

Тогда, если waitForBytesWritten() заработал, то отпишись плиз здесь: https://bugreports.qt-project.org/browse/QTBUG-36758

Тогда в релиз 5.3.0 можно успеть с этим патчем.. Иначе только в 5.3.1..


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Alex_K от Май 12, 2014, 15:45
Отписался, что патч работает, в комментах (больше не нашел, где).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 12, 2014, 16:34
Ага, спасибо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 16, 2014, 11:46
Цитировать
Тогда в релиз 5.3.0 можно успеть с этим патчем.. Иначе только в 5.3.1..

Баг закрыт, выйдет в следующей 5.3.1, т.к. в 5.3.0 уже не успеется.


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: Alex_K от Май 30, 2014, 13:03
kuzulis, опять прошу помочь разобраться с проблемой - то ли руки, то ли машины, то ли некая особенность:
пробовал и блокирующий подход, и только сигналы-слоты, сейчас использую гибрид - вынес порт в отдельный поток и для обмена вида команда-ответ жду в первом потоке, когда отработает асинхронный обмен во втором.

Что интересно: при первом и последнем подходах у меня на 6 машинах (2 из них виртуальные, есть 32 и 64, от XP до 8) все отрабатывает на ура, но есть 2 машины не у меня, на которых ответ приходит только после посылки второго пакета данных - то есть вместо того, чтобы произвести запрос-ответ я посылаю запрос - пустая команда - и только тогда получаю ответ, сколько ни жди после первой команды. Менял драйвера (FT232), менял версии библиотеки - все то же. А у меня стабильно работает, как на машине с Qt, так и на всех других просто запускается из папки с нужным набором библиотек.

Сегодня выяснил, что на одной из неработающих машинах стояли Касперский (согласно Хабру использующий Qt) и еще программа на Qt, все снес, но результата нет. Система примерно та же, что у меня - Core i3. Вот в упор не вижу отличий и корня проблемы.

Поискал файлы Qt на компьютере - вроде после удаления тех программ файлов нет. Однако файлы от Касперского я так и не нашел, где-то прячет.

Вопрос - может, ты сталкивался с таким поведением? Что можно предпринять?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 30, 2014, 15:17
Эмм.. если используются waitForReadyRead()/waitForBytesWritten() (windows), то они некорректно работают, вплоть до qt5.3.0.
Их работа пофикшена (вроде как) в текущем "stable" бранче Git-а (который готовится для qt 5.3.1).

Но последний патч (https://codereview.qt-project.org/#change,86319), фиксирующий waitForReadyRead() (т.к.  waitForReadyRead снова отвалился :) ) еще не принят.
Поэтому можете самостоятельно пересобрать QtSerialPort с этим патчем и проверить работу:

Код:
$ git clone git://gitorious.org/qt/qtserialport.git
$ cd qtseriaport
$ git fetch https://codereview.qt-project.org/p/qt/qtserialport refs/changes/19/86319/2 && git checkout FETCH_HEAD


Название: Re: Создаю библиотеку для работы с последова&
Отправлено: Alex_K от Май 30, 2014, 16:43
Да тут вот дело в том, что оно не то, что бы совсем не работает, а работает с особенностью - ответ на первый запрос приходит после второго запроса, на второй - после первого и т.д.
Главное - что эта особенность стабильная, т.е. и только с WaitFor..., и с только сигналами/слотами без WaitFor.., и с объектом порта в GUI и не в GUI потоке она соблюдается. Какая-то, вероятно, не зависящая от QSerialPort ошибка, вопрос только в том, что это может быть.
Может ли быть, что где-то зашито срабатывание приема, если таймаута почему-то нет, по следующему пакету?
Ставил буфер чтения в 1 байт, пробовал разные режимы контроля потока (Hard|Soft|No) - без результата.
Не пробовал только вручную ставить RTS/CTS перед отправкой пакета.

UPD почитал описание патча - попробую его, отпишусь.




Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Alex_K от Июнь 02, 2014, 10:01
Попробовал патч - результат тот же. Первый ответ от устройства приходит после посылки 2 команды. На 7 машинах в моем доступе все ок, а на 2 вне - такая ерунда.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 02, 2014, 11:15
Ну, тут ничем помочь не могу, т.к. любые предположения - это пальцем в небо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Alex_K от Июнь 06, 2014, 12:06
В общем, Qt и QSerialPort работают везде отлично. Вопрос был в прошивке прибора.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Июнь 21, 2014, 21:48
kuzulis, наткнулся на такую вещь: https://github.com/connectedtable/qeventdispatcher_epoll
Не пробовали тестировать работу QSerialPort через epoll?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 29, 2014, 19:10
2 Old,

Хм, интересненькая штукенция. Но нет, не пробовал, нет пока времени.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 11, 2014, 06:00
Я так и пользуюсь библиотекой от 29.03.2014. Пару дней назад захотел обновить библиотеку в своем проекте. Обновил, работает, но как-то медленно.
Начал разбираться, выяснил что в принимаемых данных содержатся посторонние данные.
Соединил два компьютера перекрестным com кабелем (на одном компьютере linux, на другом windows), запустил blockingmaster, blockingslave, получил на windows посторонние символы в сообщении.
Менял местами blockingmaster и blockingslave, результат тот-же. Проблема в библиотеке именно на windows и только в принимаемых данных.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 11, 2014, 10:24
Не, нет никаких "левых" данных, просто нужно увеичить таймаут в коде BlockingSlave для waitForReadyRead():
Код
C++ (Qt)
//! [7] //! [8]
           // read request
           QByteArray requestData = serial.readAll();
           while (serial.waitForReadyRead(10))
               requestData += serial.readAll();
//! [8] //! [10]
 

где вместо 10 мсек, нарисовать например 50 мсек.

Просто виндовый шедулер некорректно справляется с обработкой событий, т.е. вместо этих 10 мсек он в реальности может возвратить управление через 1 мсек и пр.
Нужно время побольше установить, т.к. реальное разрешение таймера в винде +/- 20-50 мсек. Поэтому делать таймауты менее 50 msec смысле нет вообще.
Конечно, все зависит от многих факторов, не все так просто. :)

UPD: Упс, хм.. странно.. все-таки надо проверить.

UPD2: Только что проверил на com0com - все нормально. Скорее всего проблема в маленьком таймауте как написано выше.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 11, 2014, 13:59
В моей программе так:
Код:
while (!time.hasExpired(200))
{
   if ( serialPort->waitForReadyRead(30) )
   {
      QByteArray tempbuff = serialPort->readAll();
      ...
      buff.append(tempbuff);
      ...
      //  проверка CRC
      // если все данные получены, то выход из цикла
   }  
}

Данные от устройства библиотека дробит на 2-3 куска, поэтому так сделано. Раньше все работало, а теперь иногда приходят данные с мусором.

Добавлю: в данных от устройства две контрольные суммы CRC, мусор иногда появляется в середине данных. Если мусор в начале, то программа легко от него избавляется, а вот если в середине, то можно только отбросить пакет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 11, 2014, 14:05
Не может там быть никакого мусора. Неоткуда ему взяться. Проверяйте у себя откуда они берутся и пр..


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 11, 2014, 14:09
Хорошо, попробую еще поразбираться. Но простая замена библиотеки кардинально меняет работу программы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 11, 2014, 15:47
Попробуй представить какой-нибудь простой проект который воспроизводит проблему, или какой-нибудь тест.

Например, по этой проблеме я набросал быстрый тест  (https://codereview.qt-project.org/#/c/89696/)который проверяет корректность переданых и принятых данных.
Можешь попытаться проверить с ним. Или модифицировать его под свои нужды.

Иначе мы не найдем проблему.

UPD: Можно дополнить этот тест тестом производительности. Например, за основу взять тест  (https://qt.gitorious.org/qt/qtbase/source/5c92d21cce18eef9b57f42323b464b6670124c3a:tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp) от QTcpServer. И замерить производительность и прочее.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 12, 2014, 05:53
kuzulis, а как этот тест запустить в linux? Делаю так:
Код:
export QTEST_SERIALPORT_RECEIVER=ttyS0 
export QTEST_SERIALPORT_SENDER=ttyS0
./tst_qserialport
Выдает такое:
Код:
********* Start testing of tst_QSerialPort *********
Config: Using QTest library 4.8.5, Qt 4.8.5
PASS   : tst_QSerialPort::initTestCase()
FAIL!  : tst_QSerialPort::synchronousLoopbackDataVerificationTest() 'receiverPort.open(QSerialPort::ReadOnly)' returned FALSE. ()
   Loc: [../../../../qt-qtserialport/tests/benchmarks/qserialport/tst_qserialport.cpp(127)]
PASS   : tst_QSerialPort::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped
********* Finished testing of tst_QSerialPort *********

Кажется понял в чем проблема. Нужно использовать два разных порта?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 12, 2014, 11:09
Цитировать
Нужно использовать два разных порта?
Да.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 12, 2014, 11:49
Нет у меня два разных порта. Переделал этот тест для одного порта (во вложении), заодно и выяснил в чем у меня проблема.
Я делаю так: while ( serialPort.waitForReadyRead(50) ) {...}
А нужно так: while ( serialPort.bytesAvailable() || serialPort.waitForReadyRead(50) ) {...}

Я думал что если в буфере есть данные, то waitForReadyRead возвращает true, а он возвращает true, если данные пришли во время ожидания.

Добавлено:
Если обе программы (которые на разных компьютерах) одновременно отправляют данные, то тест не проходит. Я это учел в тесте, сделал задержку.
Получается какая-то коллизия. Так и должно быть? Может как-то доработать библиотеку, чтобы работало и в таком режиме?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 12, 2014, 12:25
Цитировать
Я думал что если в буфере есть данные, то waitForReadyRead возвращает true, а он возвращает true, если данные пришли во время ожидания.

waitForReadyRead() возвратит true только если пришли новые данные, иначе он возвратит false.

Так в документации сказано:
Цитировать
Blocks until new data is available for reading and the readyRead() signal has been emitted, or until msecs milliseconds have passed. If msecs is -1, this function will not time out.
.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 12, 2014, 12:32
Так не очень понятно. Вот если бы еще в примерах так было (я про bytesAvailable || waitForReadyRead вместо waitForReadyRead).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 12, 2014, 12:39
Цитировать
Так не очень понятно.

А это обычное поведение для всех QIODevice классов: сокетов, процессов и пр.
Просто раньше оно работало не в соответствии с документацией, но теперь в соответствии. :)

Цитировать
Получается какая-то коллизия. Так и должно быть? Может как-то доработать библиотеку, чтобы работало и в таком режиме?

Проще тогда было сделать два отдельных теста: sender и receiver.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 13, 2014, 13:12
Заработала моя программа. Иногда перед нужными данными появляются уже принятые данные. Если перед отправкой данных устройству или после приема данных, вызвать waitForReadyRead(0), то лишних данных нет!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 13, 2014, 14:35
Цитировать
Иногда перед нужными данными появляются уже принятые данные.
Не может такого быть.

Цитировать
Если перед отправкой данных устройству или после приема данных, вызвать waitForReadyRead(0), то лишних данных нет!
Что-то перемудрено тут.. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 13, 2014, 14:48
Ну хз, я не настаиваю. Если у кого-нибудь возникнет такое, будут знать как проверить. Хотя большинство наверно сигналами пользуются.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 26, 2014, 09:50
@Phoenix,

Кстати да (ты прав). Кажется, есть баг в waitForBytesWritten() когда он используется совместно с waitForReadyRead() (или когда что-то читаем).
Тогда если внутри waitForBytesWritten() срабатывает событие от "WaitCommEvent", то оно некорректно обрабатывается, что приводит к
заполнению readBuffer данными которые уже были когда-то прочитаны (или мусором).

Вот сам баг https://bugreports.qt-project.org/browse/QTBUG-40344 (и там есть ссылка на патч, если есть время - то попробуй плз).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июль 30, 2014, 08:04
Kuzulis, патч работает. Даже пропала коллизия в тесте, про которую я писал выше.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июль 30, 2014, 16:43
Ага, спасибо за тесты. Баг будет исправлен в 5.3.2.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: titan83 от Август 07, 2014, 11:14
kuzulis, извини, если это будет офф, но все же.
Хочу оформить свои классы в отдельную библиотеку, чтобы не таскать их в каждый проект.
Читаю документацию - и везде при использовании библиотек надо указывать пути к хедерам и прочее...((
а вот у тебя в QtSerialPort сделано все правильно - одна строчка CONFIG += serialport и это, на мой взгляд, правильно.
Подскажи - насколько сложно добиться подобного поведения? Я начал смотреть исходники, но слишком много белых пятен для меня пока((
Может у тебя есть исходник какой-нибудь простой библиотеки, чтобы можно было поразбираться и по аналогии сделать для себя?
Заранее спасибо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 07, 2014, 11:40
Цитата: titan83
а вот у тебя в QtSerialPort сделано все правильно - одна строчка CONFIG += serialport и это, на мой взгляд, правильно.
Нет. Эта фича относится только (в основном) к модулям/компонентам, которые установлены в Qt (находятся в директории с Qt-шными бинарями). Т.е. это как-бы неотъемлемая часть Qt.

Если планируется использование только Qt5 - то тут все просто:

1. Необходимо установить питон + перл (обязательно!).
2. Организовать структуру проекта твоих классов/библиотек определенным образом (см. как сделано в QtSerialPort, а также в других модулях, например QtConnectivity и прочих "не-Core" модулей)

В этом случае, после сборки твоей "библиотеки", ее необходимо будет установить в директорю с твоей Qt5.
Можно это делать с помощью "make install", а можно вручную распихатть все куда надо в директорию с Qt5.

И - да, тогда для подключения твоих модулей достаточно будет только написать QT += mycoolmodule

Если планируется использование только Qt4 - то тут сложнее:

1. Нужно написать еще *.prf файл (я особо не разбирался в этом, т.к. это делал другой человек) и неким образом сделать так чтобы
он при установке копировался в нужные места в твоем Qt4 (mkspecs/features).
2. Неким образом сделать так, чтобы твои заголовки при установке копировались в нужные места в твоем Qt4.

В этом случае, после сборки твоей "библиотеки", ее необходимо будет установить в директорю с твоей Qt4.
Можно это делать с помощью "make install", а можно вручную распихатть все куда надо в директорию с Qt4.

И - да, тогда для подключения твоих модулей достаточно будет только написать CONFIG += mycoolmodule


Но, ИМХО, это мутная тема и я бы не заморачивался с этим, а таскал бы свои классы с сбой.
Если так уж не нравится прописывать всякий раз пути к заголовкам, пути к библиотекам и прочеее - то я бы
просто рекомендовал бы перейти на QBS. Там нет такого. :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: titan83 от Август 07, 2014, 12:03
Пожалуй, соглашусь на счет мутности и буду дальше таскать классы с собой, ибо qt пока 4.8
Спасибо за развернутый ответ!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: SniT от Сентябрь 11, 2014, 15:13
Доброго дня.
Подскажите как скачать исходники QtSerialPort ? На qt.gitorious.org отвечает что файл не найден.
Если у кого есть, выложите плиз сюда.

Заранее благодарен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 12, 2014, 17:46
https://qt-project.org/wiki/QtSerialPort_Russian


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Октябрь 23, 2014, 09:13
upd: отбой тревоги :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Ноябрь 05, 2014, 14:03
Доброго времени суток!
kuzukis, работаю с Вашей библиотекой с лета сего года, начал юзать Qt 5.2.1 win7 32 (скачано с qserialport с оффсайта) - все работоспособно, но очень не нравится то, что в консоли(=вывод приложения) почему-то постоянно ругается при открытии любого порта: "void QSerialPortPrivate::detectDefaultSettings(): Unexpected flow control settings". Нашел тут только одно подобное упоминание http://www.prog.org.ru/index.php?topic=9537.msg145149#msg145149 - почитал, подумал - в результате, как относится к моему случаю и как исправить не понял. Ткните пожалуйста в ссылку в нужном направлении или вкратце поясните. Я бы и не дергался, но пока отлаживался подобные сообщения иногда возникали в отношении других параметров портов, хотя потом пропали. Что было раз - будет еще неоднократно, может проблемы у меня с кодом? Тем более хотелось бы понять где наглючил. Ранее с Qt4.8 пользовал "qextserialport", кажется, и таких проблем не было.
С уважением...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 05, 2014, 15:03
В последних версиях эт сообщение уже убрано. Достаточно просто обновиться до 5.3.2/5.3.3


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Ноябрь 05, 2014, 15:10
В последних версиях эт сообщение уже убрано. Достаточно просто обновиться до 5.3.2/5.3.3
Спасибо, kuzulis, как-то так я и думал - значит на эти сообщения просто не обращаю внимания. Буду переходить на 5.3.3.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Ноябрь 05, 2014, 15:19
kuzulis, во-первых, спасибо за очень хорошую библиотеку! Пользуюсь - радуюсь.
Во-вторых, не уверен по адресу ли вопрос - если нет, простите и пошлите если знаете по верному адресу.
Возможна ли статическая сборка с qserialport? Нигде не нашел пояснений кроме вот такого )) http://www.prog.org.ru/topic_26384_0.html - "... QtSerialPort никто из разработчиков статически не собирал (да и не соберется он)." Может для более новых версий все он таки соберется уже? Или это никак и использовать только динамику с любимой кучкой файлов *.dll ?.
С уважением...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 05, 2014, 16:53
Цитировать
Возможна ли статическая сборка с qserialport?

Не имею понятия. Возможно в qtserialport\src\serialport\serialport.pro в CONFIG можно указать "staticlib", но не уверен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Ноябрь 05, 2014, 17:16
Цитировать
Возможна ли статическая сборка с qserialport?

Не имею понятия. Возможно в qtserialport\src\serialport\serialport.pro в CONFIG можно указать "staticlib", но не уверен.

Спасибо, будем искать...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Hellraiser от Ноябрь 06, 2014, 08:24
Я собирал для 4.8 под 2010 студию. Собирал только саму библиотеку и при этом правил serialport.pro (в src/serialport). В CONFIG добавлял staticlib, в DEFINES - QT_STATIC (этот дефайн потом придется повторять в проектах своих статически собранных приложений).
Вот мой проектник (ветку для версий > 4 не трогал).
Код
C++ (Qt)
QT = core
 
QMAKE_DOCS = $$PWD/doc/qtserialport.qdocconf
include($$PWD/serialport-lib.pri)
 
greaterThan(QT_MAJOR_VERSION, 4) {
   load(qt_build_config)
   QT += core-private
   TARGET = QtSerialPort
   load(qt_module)
} else {
   TEMPLATE = lib
   TARGET = $$qtLibraryTarget(QtSerialPort$$QT_LIBINFIX)
   include($$PWD/qt4support/install-helper.pri)
   CONFIG += module staticlib create_prl
   DEFINES += QT_STATIC
   mac:QMAKE_FRAMEWORK_BUNDLE_NAME = $$TARGET
}
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Ноябрь 06, 2014, 16:22
Hellraiser, спасибо. Сейчас загружен, на днях попробую, отпишусь.

Отписываюсь. Qt5.2.1 mingw 4.8. Результат: сделал статическую сборку Qt, отдельно статически собрал qtserialport, распихал результаты сборки qtserialport по нужным каталогам статической сборки Qt, на первый взгляд все работает, но нужно еще потестить. И осознать ))).

Всем спасибо за дачу нужных направлений!
С уважением...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: DruidCat от Декабрь 30, 2014, 00:20
Люди добрые помогите решить проблему в GNU/Linux. Написал программу на РС, которая подключается по последовательному порту с микроконтроллером. Все работает замечательно, но одна загвоздка, не всегда есть под рукой микроконтроллер. Поэтому я написал программу на РС, эмулирующую микроконтроллер, и в Windows 7 соединил эти две программы по виртуальному нуль модему. Благо в винде подобных программ, по созданию виртуальных нуль модемов много. Но вот с GNU/Linux  я сталкнулся с проблемой создания виртуального нуль модема. Так как я в GNU/Linux не силен. Мне посоветовали программу socat, я связался с разработчиком этой программы и он мне дал совет, как создать виртуальный нуль модем.
Код:
sudo socat -d -d -lu PTY,link=/dev/ttyS0,raw,echo=0 PTY,link=/dev/ttyS1,raw,echo=0
Я этим воспользовался. У меня в папке /dev четыре файла ttyS0-ttyS3, и эти четыре файла моя программа видит, как свободные последовательные порты для подключения. Но когда я запустил socat, то ttyS0 и ttyS1 у меня превратились в ссылки /dev/pts/1 и /dev/pts/2 и моя программа перестала видеть ttyS0 и ttyS1. Может я что-то делаю не так, и может не нужно пользоваться socat? Просто я в GNU/Linux  не силен, проверял это в Ubuntu и Calculate(Gentoo). Для наглядности выложу скрин https://yadi.sk/i/6sgXc79cdhKju (https://yadi.sk/i/6sgXc79cdhKju). Там в комбобоксе раньше было доступно ttyS0-ttyS3, а теперь ttyS2 и ttyS3.
Еще выкладываю кусок кода, как ищются свободные последовательные порты, может я что не правильно написал в исходниках, хотя с реальными портами все работает на ура:
Код:
void DCRegErsteds::slotRescanPorts()//Кнопка Обновление списка СОМ портов
/////////////////////////////////////////////////////////////////////////////////////////////
//------------------С Л О Т   Д О С Т У П Н Ы Х   С О М   П О Р Т О В----------------------//
/////////////////////////////////////////////////////////////////////////////////////////////
{
    QStringList lstPortName;//Список Сом портов
    QList<QSerialPortInfo> serialPortInfoList = QSerialPortInfo::availablePorts();//Поиск доступных Сом портов
    foreach (const QSerialPortInfo &serialPortInfo, serialPortInfoList)//Цикл
        lstPortName << serialPortInfo.portName();//Добовляем в список доступные Сом порты

    ui->pcbxPortName->clear();//Очищаем ComboBox
    ui->pcbxPortName->addItems(lstPortName);//Добавляем в ComboBox список доступных Сом портов

    for(size_t untStep = 0; untStep < lstPortName.size(); untStep++)//Цикл просмотра содержимого списка свободных СОМ портов
    {
    if(pdcsetting->getPortName() == lstPortName[untStep])//если есть равенство СОМ порта из настроек и СОМ порта доступного для подключения, то...
    {
    ui->pcbxPortName->setCurrentText(pdcsetting->getPortName());//Указываем номер порта, который есть в настройках
    return;
    }
    }

    pdcsetting->setPortName("");//Делаем порт не определенным, так как того порта, который в настройках не существует физически
}


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 30, 2014, 00:50
Все правильно. Socat создает симлинки на /dev/pts. Теперь ttyS0/ttyS1 - это симлинки а не реальные устройства. QSerialPortInfo не будет их "видеть". Теперь нужно вручную задавать ttyS0/ttyS1 не надеясь на QSerialPortInfo. Кроме того вплоть до Qt 5.4.0 включительно, QSerialPort некорректно работает с socat: там косяки с DTR/RTS и прочим при открытии (пофикшено в Qt 5.4.1). Поэтому попробуй использовать "виртуальные" последовательные порты, созданные драйверами (модулями ядра) от Tibbo или иными (погугли, сейчас не свпомню точно). Хотя, не факт что QSerialPortInfo их также "увидит".


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: DruidCat от Декабрь 30, 2014, 05:19
Спасибо за помощь. Буду вручную задавать ttyS0/ttyS1 в программе, и ждать релиза QtSerialPort 5.4.1. в Gentoo.
PS: Спасибо тебе за QtSerialPort!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 25, 2015, 12:41
Правильно ли я понял, что для Qt4 нужно собирать "branch: qt4-dev"?
Скачал последнюю qt4-dev, собрал в winXP, моя программа выдает ошибку после вызова waitForBytesWritten: "Неверный дескриптор".
Если заменить на предыдущую версию (кажется я собирал в сентябре 2014), то все прекрасно работает.
В linux (x86-64, ARM) такой проблемы не замечено.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 25, 2015, 14:46
Цитировать
Правильно ли я понял, что для Qt4 нужно собирать "branch: qt4-dev"?

В будущем, когда выйдет Qt 5.5 - то да, это верный бранч для Qt4. Начиная с Qt 5.5 будут отдельные бранчи для Qt >= 5.5 и для Qt 4.8.x.
Я его особо не тестировал qt4-dev, т.к. оно еще далеко. ;)

Пока-же можно использовать бранчи от Qt 5.4.x для Qt4.

UPD:
Цитировать
Скачал последнюю qt4-dev, собрал в winXP, моя программа выдает ошибку после вызова waitForBytesWritten: "Неверный дескриптор".

Вроде исправил, следи за:
https://codereview.qt-project.org/104521
https://codereview.qt-project.org/104522

И спасибо за выявление ошибочки ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 25, 2015, 18:33
Помогло. И тебе спасибо за хорошую библиотеку.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Январь 28, 2015, 22:57
=== Около темы ===
Денис, а ты в курсе, что твою библиотеку (что для Qt4 что из Qt5) использует проект Fritzing для программирования всяких ардуиноподобных устройств?

(видимо позаимствован код из ArduinoIDE)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kit от Февраль 04, 2015, 14:17
Цитировать
Результат: сделал статическую сборку Qt, отдельно статически собрал qtserialport, распихал результаты сборки qtserialport по нужным каталогам статической сборки Qt, на первый взгляд все работает, но нужно еще потестить. И осознать ))).

Pavel_, ну и как впечатления от статической сборки qtserialport?
Подскажите, пожалуйста, как вам это удалось.

Тоже вот пробую сделать статическую сборку qtserialport:
1 – создаю каталог /serialport-build на уровне каталога исходников:
   /qtserialport
      /src
      /serialport-build

2 – добавляю в qtserialport.pro:
CONFIG += release
CONFIG += static

QMAKE_LFLAGS += -static -static-libgcc

3 – в cmd.exe запускаю qmake:
..\MyProjects\qtserialport\serialport-build>qmake ..\MyProjects\qtserialport\qtserialport.pro -r -spec win32-g++

4 – после успешного создания make-файла запускаю mingw32-make.exe:
..\MyProjects\qtserialport\serialport-build>mingw32-make.exe

На этом этапе выскакивает ошибка:
makefile:40: recipe for target 'sub-src-release' failed
mingw32-make: *** [sub-src-release] Error 1


Были попытки выполнить весь процесс с помощью QtCreator:
открываю qtserialport.pro, во вкладке "Проекты" настраиваю каталог сборки и этапы сборки qmake и mingw32-make.
Но вылезает та же ошибка.

Динамически собранный qtserialport из комплекта моего Qt5.4.0 работает изумительно, проблем нет.
Поделитесь, пожалуйста, опытом. Или причина безуспешности моих попыток в чем-то другом?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Февраль 04, 2015, 18:07
=== Около темы ===
Денис, а ты в курсе, что твою библиотеку (что для Qt4 что из Qt5) использует проект Fritzing для программирования всяких ардуиноподобных устройств?

(видимо позаимствован код из ArduinoIDE)

Не, Юр, не в курсе (да и все-равно, если честно). :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Февраль 14, 2015, 14:11
Цитировать
Результат: сделал статическую сборку Qt, отдельно статически собрал qtserialport, распихал результаты сборки qtserialport по нужным каталогам статической сборки Qt, на первый взгляд все работает, но нужно еще потестить. И осознать ))).

Pavel_, ну и как впечатления от статической сборки qtserialport?
Подскажите, пожалуйста, как вам это удалось.
.................(далее по тексту)...................

В статике все работает. Порядок действий ничем не отличается от указанного в сообщении от "Ноябрь 06, 2014, 16:22" породившего вопрос. Общемногоразописанным способом делаем статическую сборку Qt. Отдельно статически - еще раз спасибо "Hellraiser" http://www.prog.org.ru/topic_9537_1200.html, сам я не додумался - собираем QSerialPort, результат копируем в каталог общей статической сборки Qt. Для себя сохранил напоминание в виде текстового файла, который и прилагаю. На вопросы отвечу, хотя из того что сделано ничего моего практически и нет.

У меня Qt 5.2.1, а у "kit" 5.4.0, поэтому прошу "kit" также отписаться по результатам.

С уважением!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Март 09, 2015, 23:53
Astra Linux 1.10, Qt 5.3.0. После развертывания системы и попытки собрать qbs проект с QSerialPort получаю при разборе qbs:
"Module Qt/serialport could not be loaded", что странно ибо в Windows вроде этот модуль шёл в стандартной поставке.
Дальше пытаюсь собрать qserialport самостоятельно в соответствии с https://qt-project.org/wiki/QtSerialPort.
Качаю соответствующий архив. После make получаю - qserialportglobal.h - No such file or directory
Что-бы это значило?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 10, 2015, 22:12
Цитировать
"Module Qt/serialport could not be loaded"
А что, в репозиториях астры нет пакета QtSerialPort?

Но если сам Qt ставится не из реп, а из инсталлятора - то там должен быть QtSerialPort (хотя не уверен, нужно проверять тебе самому :) ).
Да и использовать лучше тогда сразу Qt 5.4.1 а не старье.

Цитировать
Качаю соответствующий архив.
...
Что-бы это значило?

Очевидно, что что-то делаешь не так..  :)

 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Март 10, 2015, 23:05
А что, в репозиториях астры нет пакета QtSerialPort?
Как проверить?
Код
Bash
sudo apt-get install QtSerialPort
E: Unable to found QtSerialPort
 

Но если сам Qt ставится не из реп, а из инсталлятора - то там должен быть QtSerialPort (хотя не уверен, нужно проверять тебе самому :) ).
Как проверить?
Код
Bash
xokc@astra-client:/usr/lib/x86_64-linux-gnu$ ls libQt5*.so.5.3.0
libQt5CLucene.so.5.3.0             libQt5Multimedia.so.5.3.0         libQt5Svg.so.5.3.0
libQt5Concurrent.so.5.3.0          libQt5MultimediaWidgets.so.5.3.0  libQt5Test.so.5.3.0
libQt5Core.so.5.3.0                libQt5Network.so.5.3.0            libQt5WebKit.so.5.3.0
libQt5DBus.so.5.3.0                libQt5OpenGL.so.5.3.0             libQt5WebKitWidgets.so.5.3.0
libQt5Declarative.so.5.3.0         libQt5PrintSupport.so.5.3.0       libQt5Widgets.so.5.3.0
libQt5DesignerComponents.so.5.3.0  libQt5Qml.so.5.3.0                libQt5X11Extras.so.5.3.0
libQt5Designer.so.5.3.0            libQt5Quick.so.5.3.0              libQt5Xml.so.5.3.0
libQt5Gui.so.5.3.0                 libQt5Script.so.5.3.0
libQt5Help.so.5.3.0                libQt5Sql.so.5.3.0
 

libQt5SerialPort или чего-нибудь подобного не вижу. Аналогично, нет ничего подобного и в /usr/include/x86_64-linux-gnu/qt5:
Код
Bash
root@astra-client:/usr/include/x86_64-linux-gnu/qt5# ls
QtConcurrent  QtDBus  QtNetwork  QtOpenGLExtensions  QtPrintSupport  QtSql   QtWidgets
QtCore        QtGui   QtOpenGL   QtPlatformSupport   QtSolutions     QtTest  QtXml
 

Да и использовать лучше тогда сразу Qt 5.4.1 а не старье.
У меня сертифицированная ОС - я не могу, к сожалению, позволить себе "просто так" качать что-нибудь более новое.

Очевидно, что что-то делаешь не так..  :)
Как сделать так, как надо? После qmake получаю следующее:
Код
Bash
g++ -c -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -D_FORTIFY_SOURCE=2 -O2 -fvisibility=hidden -fvisibility-inlines-hidden -std=c++0x -fno-exceptions -Wall -W -D_REENTRANT -fPIC -DQT_NO_MTDEV -DLINK_LIBUDEV -DQT_BUILD_SERIALPORT_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/home/xokc/test/qt-qtserialport/src/serialport -I/home/xokc/test/qt-qtserialport/src/serialport -I/home/xokc/test/qt-qtserialport/include -I/home/xokc/test/qt-qtserialport/include/QtSerialPort -I../../include -I../../include/QtSerialPort -I/home/xokc/test/qt-qtserialport/include/QtSerialPort/5.3.0 -I/home/xokc/test/qt-qtserialport/include/QtSerialPort/5.3.0/QtSerialPort -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore/5.3.0 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore/5.3.0/QtCore -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I.moc -I. -o .obj/qserialport.o /home/xokc/test/qt-qtserialport/src/serialport/qserialport.cpp
In file included from /home/xokc/test/qt-qtserialport/src/serialport/qserialport.cpp:45:0:
/home/xokc/test/qt-qtserialport/src/serialport/qserialport.h:48:44: fatal error: QtSerialPort/qserialportglobal.h: Can't found file or directory
compilation terminated.
make[2]: *** [.obj/qserialport.o] Error 1
make[2]: Leaving directory `/home/xokc/test/build/src/serialport'

make[1]: *** [sub-serialport-make_first] Error 2
make[1]: Leaving directory `/home/xokc/test/build/src'
make: *** [sub-src-make_first] Error 2
То есть ищется QtSerialPort/qserialportglobal.h, которого в Include путях и нет. Куда дальше-то рыть?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kit от Март 11, 2015, 10:44
Цитата: http://www.prog.org.ru/index.php?topic=9537.msg207891#msg207891
У меня Qt 5.2.1, а у "kit" 5.4.0, поэтому прошу "kit" также отписаться по результатам.

Прошу прощения за долгое молчание!
Отчитываюсь по результатам статической сборки QSerialPort.
Делаю все по пункту 3 вашей инструкции Результат статической сборки.txt, нигде не отклоняясь.
Получаю ошибки после запуска mingw32-make.
Файл с текстом брани, которую мне выплевывает командная строка, прилагаю.
Кажется, не находит файл qserialport.o. Да и не создается этот файл почему-то в процессе сборки.
Может, тут что-то простое, не знаю. Хотелось бы разобраться. Раз у людей получилось.

Пока пользуюсь динамическим QSerialPort.
Еще неплохо себя показывает библиотека QExtSerialPort-1.2rc https://code.google.com/p/qextserialport/wiki/Downloads?tm=2 (https://code.google.com/p/qextserialport/wiki/Downloads?tm=2).
Легко и просто подключается в виде исходников, нет проблем.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2015, 11:39
Цитировать
E: Unable to found QtSerialPort

Можешь поискать в пакетах от дистра (http://www.astra-linux.com/wiki/index.php/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2).

Хотя я вообще не понимаю всех этих астр, и прочих "росеянских ОС", мучайся с ними сам, ничем помочь не могу. :)

Цитата: xokc
Как проверить?

Имелось ввиду использование инсталлятора.. Проверить, есть ли аддон QtSerialPort в инсталляторе с их (qt.io) сайта.. Но раз ты говоришь что:

Цитата: xokc
У меня сертифицированная ОС - я не могу, к сожалению, позволить себе "просто так" качать что-нибудь более новое.

Значит эта тема снимается.

Цитата: xokc
То есть ищется QtSerialPort/qserialportglobal.h, которого в Include путях и нет. Куда дальше-то рыть?

А qmake для какого файла делаешь? Нужно делать для корневого qtserialport.pro.
Лучше всего собрать QtSerialPort с помощью креатора (там, на английской вики написано как). Только не нужно прописывать цель "make install", а выполнить ее вручную из теневой директории сборки через sudo.

И откуда берешь исходники?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Март 11, 2015, 14:01
Xokc, поправь в некоторых заголовочных файлах #include <...> на #include "..." и вместо системных путей укажи относительные пути. Библиотека пытается найти свои заголовочные файлы в системных каталогах - это хорошо когда заголовочные файлы устанавливаются пакетом и плохо если все вручную. В принципе, можно еще закинуть заголовочные файлы в те пути что ожидаются. Я для астры 1.9 собирал, работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2015, 14:07
Цитировать
Библиотека пытается найти свои заголовочные файлы в системных каталогах - это хорошо когда заголовочные файлы устанавливаются пакетом и плохо если все вручную. В принципе, можно еще закинуть заголовочные файлы в те пути что ожидаются.

Нене.. Что-то делали неправильно.. Все должно собраться без танцев..


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Март 11, 2015, 14:15
Kuzulis, я всегда руками собираю в linux и windows, т.к. Qt4 и все время приходится пути поправлять. Правда я не сильно часто новую библиотеку собираю - раз в полгода.
В качестве примера файл qserialport.h, в нем:
#include <QtSerialPort/qserialportglobal.h> - это по умолчанию.
#include "qserialportglobal.h" - вот так работает.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Март 11, 2015, 14:52
Можешь поискать в пакетах от дистра (http://www.astra-linux.com/wiki/index.php/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2).
Спасибо, поискал и нашёл :).

Код
DOS
Package: libqt5serialport5
Source: qtserialport-opensource-src
Version: 5.3.0-1
Architecture: amd64
Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Installed-Size: 138
Pre-Depends: multiarch-support
Depends: libc6 (>= 2.2.5), libqt5core5a (>= 5.2.0), libstdc++6 (>= 4.1.1), libudev0 (>= 0.140)
Multi-Arch: same
Homepage: http://qt-project.org/
Priority: optional
Section: libs
Filename: pool/main/q/qtserialport-opensource-src/libqt5serialport5_5.3.0-1_amd64.deb
Size: 32718
SHA256: a0c789655f09ce93449ea1e4a2fafc7756642d7acd239697f8747dd9cea22784
SHA1: 131fb70a369f24b706e6cc5f18c923eeb5570fe4
MD5sum: 35c7ea305a6ea95cecac24f87113434c
Description: Qt 5 serial port support
Qt is a cross-platform C++ application framework. Qt's primary feature
is its rich set of widgets that provide standard GUI functionality.
.
This package includes the library to use serial ports from within Qt 5.
Description-md5: 495baaf3e432acf5b4e4136a5d0e645a
Как мне его поставить, так (под рукой системы нет, проверить сам не могу)?
Код
Bash
sudo apt-get install libqt5serialport5

А qmake для какого файла делаешь? Нужно делать для корневого qtserialport.pro.
qmake делаю находясь в папке build для файла ../qt-serialport/qtserialport.pro

Лучше всего собрать QtSerialPort с помощью креатора (там, на английской вики написано как).
Пробовал - результат абсолютно аналогичный

И откуда берешь исходники?
Отсюда: https://qt.gitorious.org/qt/qtserialport/source/360767286dfc77a08ac28bf03f35b289fd37536d:

Поправь в некоторых заголовочных файлах #include <...> на #include "..." и вместо системных путей укажи относительные пути.
Этот "порочный" путь я, конечно, пройду если совсем уж припечёт. Но хотелось бы с бубном плясать по-минимуму :).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2015, 16:05
Цитировать
Как мне его поставить, так (под рукой системы нет, проверить сам не могу)?

Понятия не имею.

Цитировать
Пробовал - результат абсолютно аналогичный

Да не может быть... т.к. все перепроверялось сто-пицот раз.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Pavel_ от Март 11, 2015, 17:19
Цитата: http://www.prog.org.ru/index.php?topic=9537.msg207891#msg207891
У меня Qt 5.2.1, а у "kit" 5.4.0, поэтому прошу "kit" также отписаться по результатам.
Прошу прощения за долгое молчание!
Отчитываюсь по результатам статической сборки QSerialPort. Делаю все по пункту 3 вашей инструкции Результат статической сборки.txt, нигде не отклоняясь. Получаю ошибки после запуска mingw32-make............

Доброго времени суток, "kit"!
Подробнее отписал в личку. Повторюсь: QSerialPort нормально статически собирается для Qt 5.4.0.
Кажется бывали ошибки при использовании системного "cmd.exe" вместо родного "Qt 5.4 for Desktop (MinGW 4.9 32 bit)", вроде для второго уже настроены все переменные окружения.
Может вы запускаетесь не из каталога "qtserialport-build", может еще что...

Лог компиляции и свои действия прилагаю в архиве - вдруг поможет чем. Там же откомпилированные для статики компоненты qtserialport-build.rar (не zip), их надо скопировать себе в статическую сборку Qt и все должно работать.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Март 11, 2015, 17:21
Цитировать
Пробовал - результат абсолютно аналогичный
Да не может быть... т.к. все перепроверялось сто-пицот раз.
Ну не знаю... Скриншот приложить, видео записать, зуб дать :)?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Март 11, 2015, 19:45
Цитата: xokc
Ну не знаю... Скриншот приложить, видео записать, зуб дать Улыбающийся?
Значит чего-то не хватает.. Возможно перла или еще чего недоустановилось в системе.. Я хз..


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Март 11, 2015, 20:48
Ну, собственно победил. Если кому интересно для сборки QSerialPort нужно:
apt-get install qtbase5-private
 - это для установки приватных h файлов, иначе будут ошибки на отсутствующий qringbuffer_p.h
apt-get install libudev-dev
- это для установки h файлов от libudev (сам libudev уже стоял из коробки)
Таким же образом можно было и сразу libqt5serialport5 с libqt5serialport5-dev поставить без бубнов.

Но вот qbs в QtCreator продолжает ругаться: Module Qt/serialport could not be loaded.
Какие предложения?

А тут же сам себе и отвечу - само рассосалось :) Нужно было QtCreator перезапустить после этого. Всё, astra побеждена - спасибо.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kit от Март 13, 2015, 09:58
Доброго времени суток, "kit"!
Подробнее отписал в личку. Повторюсь: QSerialPort нормально статически собирается для Qt 5.4.0.
Кажется бывали ошибки при использовании системного "cmd.exe" вместо родного "Qt 5.4 for Desktop (MinGW 4.9 32 bit)", вроде для второго уже настроены все переменные окружения.
Может вы запускаетесь не из каталога "qtserialport-build", может еще что...

Большое спасибо, Pavel_!
Ваша статическая сборка QtSerialPort  у меня сразу заработала  :)

Что же касается ошибок, то с ними осталось неясно.
Поясню некоторые детали:
1 - Да, мой Qt собирался из исходников и "Qt 5.4 for Desktop (MinGW 4.9 32 bit)" в нем нет.
Мне это жить не мешало, даже статическую сборку делали через cmd.exe. Переменные окружения
действительно приходится прописывать самому:
Код:
C:\Qt\Qt5.4.0\MyProjects\qtserialport\serialport-build>PATH = "C:\Qt\Qt5.4.0\5.4\mingw491_32\bin";"C:\Qt\Qt5.4.0\Tools\mingw491_32\bin"
2 - Проблема сборки модуля у меня так и осталась непознанной. Вроде все делаю по вашей инструкции, да
по указаниям https://qt-project.org/wiki/QtSerialPort_Russian, а что-то не фурычит.
Стабильно жалуется на отстутствующий

Оставляем задачу до лучших времен. Когда в следующий раз буду устанавливать свежий Qt на другую машину,
попробую разобраться.
Пока для статики буду использовать ваш собранный QtSerialPort.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kit от Март 13, 2015, 10:01
Стабильно жалуется на отстутствующий
Стабильно жалуется на отсутствующий '.obj/release/qserialport.o' ...

Pavel_, еще раз спасибо за поддержку!


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Июнь 23, 2015, 14:27
Добрый день. Kuzulis, расскажи пожалуйста подробнее про патчи: "Add direct mode" (https://codereview.qt-project.org/#/c/75708/), "Do not use the queued connection to handle an I/O events on Windows" (https://codereview.qt-project.org/#/c/114416/)

Это будет работать только в Qt5, или в ветку qt4-dev тоже планируется добавить? В каких случаях работает direct mode? Этот режим как-то нужно активировать? Последний патч работает только в windows?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Июнь 23, 2015, 16:58
Цитировать
"Add direct mode",
В каких случаях работает direct mode? Этот режим как-то нужно активировать?
Это не планируется вообще, т.к. это хз вообще что такое и не нужно (ИМХО).

Цитировать
"Do not use the queued connection to handle an I/O events on Windows"
Это только для Windows, что-то вроде выпрямления кривого кода :).

Цитировать
Это будет работать только в Qt5, или в ветку qt4-dev тоже планируется добавить?
Только Qt5.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 21, 2015, 09:39
Qt 5.5 UTF-8 Window7
Как получить читабельный вывод?

Код
C++ (Qt)
QSerialPort serialPort(QString(""));
   if (!serialPort.open(QSerialPort::ReadWrite))
       qDebug() << serialPort.error() << serialPort.errorString();
 

Вывод:
11 "\u0421\u0438\u0441\u0442\u0435\u043C\u0435 \u043D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u043D\u0430\u0439\u0442\u0438 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C."


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Пантер от Август 21, 2015, 09:42
Ты напоролся на баг Кьюта 5.5.0. Жди фиксовой версии или выводи через qPrintable (вроде, так должно норм быть).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 21, 2015, 10:11
Не знаю как там с багом, но если вписать несуществующее имя порта, то вывод нормальный.

PS
Стало немного понятнее. В случае с пустой строкой - вывод на английском, в случае с несуществующим портом - вывод на русском и тут проявляется баг. Тогда вопрос другой: почему сообщения "смикшировались" на разных языках?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 21, 2015, 11:03
Цитировать
Тогда вопрос другой: почему сообщения "смикшировались" на разных языках?

Потому что там есть два типа сообщений об ошибках:

* Системные - извлекаются из кода системной ошибки. В зависимости от локали, в твоем случае на русском, т.к. винда русская.

* Кастомные - для которых нет системного кода, просто обернуты в tr().  Они будут на английском, пока ты не сделаешь qtserialport.ts
   и не заюзаешь его. Как только заюзаешь (переведешь) - они будут на русском.

Но, как уже сказали выше - это эпичный баг в Qt 5.5, по поводу которого было эпичное бурление в тырнетах (на LOR и в Qt-шном баг-трекере) .
Вроде-как баг уже пофиксили в 5.5.1... хотя не уверен.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 21, 2015, 11:56
Приравняй в исходнике ERROR_FILE_NOT_FOUND и ERROR_PATH_NOT_FOUND - для порта в нашем случае это одно и тоже.
Проблема исчезнет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 21, 2015, 12:08
А ERROR_PATH_NOT_FOUND в каких случаях появляется?

UPD: Сам себе отвечу - при пустой строке в имени порта :)

Запилил патч: https://codereview.qt-project.org/#/c/123934/

Цитировать
Они будут на английском, пока ты не сделаешь qtserialport.ts
   и не заюзаешь его. Как только заюзаешь (переведешь) - они будут на русском.

Запилил патч с переводами: https://codereview.qt-project.org/#/c/123931/


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 21, 2015, 14:39
Qt 5.5 Windows7 (последнее обновление сегодня)

Код
C++ (Qt)
   QSerialPort serialPort("com1");
   qDebug() << serialPort.open(QSerialPort::ReadWrite);
   qDebug() << serialPort.setBaudRate(15);
 

Вывод:
true
true

Раньше было иначе. Не обращали внимания?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 21, 2015, 15:10
Цитировать
Раньше было иначе. Не обращали внимания?

Да не.. там ничего такого не менялось.. Если смущает что оно устанавливает 15 бод - то значит так оно и есть.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Август 21, 2015, 19:24
Так то baudRate может быть любым, если устройство поддерживает. А чаще всего используется одна из стандартных скоростей.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 24, 2015, 16:17
Qt 5.5.0 Window7

Код
C++ (Qt)
   QSerialPort serialPort("COM1");
   qDebug() << serialPort.open(QSerialPort::ReadWrite);
   qDebug() << serialPort.clear();
   qDebug() << serialPort.error();
   qDebug() << serialPort.errorString();
 

Код ошибки 10, а текст ошибки при этом: Параметр задан неверно.
Ошибок быть не должно. Да если и была бы ошибка то текст ошибки не соответствует ее коду.
Где-то бага...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 24, 2015, 17:53
Ошибка после clear() ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 25, 2015, 08:38
Да, после clear().
От каких проблем предохраняет запуск асинхронного чтения в этом методе? Приведи подробный пример.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 25, 2015, 08:48
Цитировать
Да, после clear().

Значит все правильно.

Цитировать
От каких проблем предохраняет запуск асинхронного чтения в этом методе? Приведи подробный пример.

http://code.qt.io/cgit/qt/qtserialport.git/tree/tests/auto/qserialport/tst_qserialport.cpp#n713 (см readAfterInputClear())


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Kurles от Август 25, 2015, 21:46
Qt 5.5 UTF-8 Window7
Как получить читабельный вывод?

Код
C++ (Qt)
QSerialPort serialPort(QString(""));
   if (!serialPort.open(QSerialPort::ReadWrite))
       qDebug() << serialPort.error() << serialPort.errorString();
 

Вывод:
11 "\u0421\u0438\u0441\u0442\u0435\u043C\u0435 \u043D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u043D\u0430\u0439\u0442\u0438 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C."
Код
C++ (Qt)
qDebug() << serialPort.error() << serialPort.errorString().toUtf8().data();
 
Примерно так.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 27, 2015, 08:51
Цитировать
Да, после clear().

Значит все правильно.

Цитировать
От каких проблем предохраняет запуск асинхронного чтения в этом методе? Приведи подробный пример.

http://code.qt.io/cgit/qt/qtserialport.git/tree/tests/auto/qserialport/tst_qserialport.cpp#n713 (см readAfterInputClear())

Правильно - это когда после успешной работы функции код ошибки равен 0, а текст ошибки равен "No error".
Переделывай свой костыль.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 27, 2015, 14:06
https://codereview.qt-project.org/124361
https://codereview.qt-project.org/124362


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: TigerProg от Октябрь 26, 2015, 15:44
Всем привет!

Использую библиотеку QSerialPort для Qt 4.8.5 под винду для получения с модема sms в постоянном режиме. Модем подключён к компьютеру через провод RS-232/USB.
Всё работает, но модем примерно раз в день (обычно ночью) перестаёт отвечать на команды. Никак не могу понять с чем это может быть связано.. Сам модем (Cinterion BGS2T-232) с функцией watch-dog, тоесть по идее должен перезапускаться в случае зависания, но это не помогает.
Также сделал программно перезагрузку модема каждые полчаса командой AT+CFUN=1,1. Тоже без результата.
Отключил в настройках электропитания в параметрах USB временное отключение USB порта. Также не наблюдаю результата.
Сейчас помогает только передёргивание сетевого кабеля питания модема.
В чём может быть дело? может ли быть проблема в библиотеке QSerialPort или я что-то ещё не попробовал?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 26, 2015, 16:24
Цитировать
Также сделал программно перезагрузку модема каждые полчаса командой AT+CFUN=1,1. Тоже без результата.

Ну так модем отвечает что-то на эту команду? Отвечает ли вообще на AT?

Цитировать
В чём может быть дело? может ли быть проблема в библиотеке QSerialPort или я что-то ещё не попробовал?

ХЗ.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: TigerProg от Октябрь 26, 2015, 17:02
Цитировать
Ну так модем отвечает что-то на эту команду? Отвечает ли вообще на AT?
Отвечает ОК, модем перезагружается, выдаёт программе ^SYSSTART, программа заного его настраивает АТ-командами, всё вроде ОК, но в период между этими получасовыми перезагрузками он всеровно может зависнуть и тогда уже ни на какие AT команды ничего не отвечает, пока из сети не перезагружу.
После перезагрузки из сети, где-то сутки работает (с получасовыми перезагрузками через AT+CFUN=1,1) и потом опять виснет.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 26, 2015, 18:38
Как вариант - написать на WinAPI хак чтобы периодически ресетить USB хаб(ы) (снимать/подавать питание к примеру) вместо ручного выдергивания.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: TigerProg от Октябрь 26, 2015, 18:58
Цитировать
Как вариант - написать на WinAPI хак чтобы периодически ресетить USB хаб(ы) (снимать/подавать питание к примеру) вместо ручного выдергивания.
Так может сам модем виснет, а не хаб?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 26, 2015, 19:25
без понятия


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: TigerProg от Ноябрь 05, 2015, 21:33
С помощью утилиты devcon, restart usb не осуществляется.
Если в диспетчере задач отключить/включить хаб, модем всеровно не отвечает.
Но дозвон с телефона на него идёт, значит сам модем не висит.
В чём проблема?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Декабрь 16, 2015, 15:20
Подскажите, по какой причине может возникнуть ошибка "File exists"?
Программа работает в Linux, затем ее закрывают, запускают ser2net (пробрасывает порт по сети), закрывают ser2net, запускают программу и возникает ошибка "File exists". Помогает перезагрузка компьютера.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 16, 2015, 16:17
Цитировать
"File exists"

Может к lock файлу это относится. Скорее всего то-ли от разных юзеров запускали то-ли что-то еще. Его просто нужно удалить (если дело было в этой бобине).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Декабрь 16, 2015, 16:50
А для чего создается lock файл?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Декабрь 16, 2015, 18:27
для эксклюзивного доступа к порту (чтобы нельзя было одновременно открыть один и тот же порт несколькими программами, к примеру)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: TigerProg от Декабрь 31, 2015, 00:53
Может кому пригодится... По поводу моей проблемы, всё дело оказалось в кабеле RS232/USB.
Нужно использовать промышленный кабель, например MOXA. Тогда ничего виснуть не будет.

P.S.
Всех с новым годом!)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Май 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 не обновляется уже.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Май 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 не обновляется уже

все верно.. теперь сами обновляйте если надо


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Май 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).

или нужно было в корень домашней директории склонировать?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: __Heaven__ от Май 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


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 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, все предыдущие методы выполнились без ошибок. Это сделано нарочно?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: gil9red от Сентябрь 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 (http://doc.qt.io/qt-5/qserialport.html#dataTerminalReady-prop)
Цитировать
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.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 13, 2016, 11:29
Я знаю, что он должен быть открыт. Почему при настройке не ругается?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 13, 2016, 18:13
Какой настройке? Читайте доку.

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



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 14, 2016, 15:38
Если у нас есть возможность устанавливать параметры порта до его открытия, то что мешает добавить туда Dtr и Rts. Пусть так же устанавливаются в нужное состояние в момент открытия порта.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 14, 2016, 19:44
Это понятно, и планируется.

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

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

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

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

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


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 15, 2016, 11:40
socat - не сталкивался, дайте ссылочку.
 
Цитировать
4. RTS/DTR не так уж и важны по сравнению с остальными параметрами, поэтому
    пока на это подзабили.

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


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 15, 2016, 14:53
Цитировать
socat - не сталкивался, дайте ссылочку.

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

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

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

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

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

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

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



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 16, 2016, 09:39
Цитировать
по умолчанию всегда 9600 8 N 1

То что при открытии порта устанавливаются предопределенные значения в корне не верно, тем самым вы сбиваете настройки которые были установлены ранее (к примеру командой mode), потому что есть софт, который ничего не должен знать о параметрах порта и не должен выполнять никаких настроек, а должен только открывать его и заниматься обменом. Это можно решить флагом конструктора, например DefaultSettings/SystemSettings.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 16, 2016, 11:59
Цитировать
устанавливаются предопределенные значения в корне не верно

Раньше так оно и было, давно. Но с тех пор уже много копий сломано было на этот счет,
ругались и так и сяк :).

В конце концов порешили, что так тому и быть, и теперь QSP::open()
откроет порт с 9600 8 N 1, если до этого не были установлены никакие другие
настройки. И это корректно с т.з. ООП.

Хочешь свои настройки - устанавливай их до открытия; хочешь чтобы менялись
в процессе работы - меняй их у открытого девайса.  

Хочешь чтобы просто открылось - нельзя так. Все, точка.

Логика проста.  :)

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

Как это не должен знать? Это проблемы того софта.

Если софтина работает с у-вом,
то она должна знать параметры для работы с у-вом и сама его конфигурить. Она берет
над ним контроль, а не "Дядя Вася" откуда-то.

UNIX-way не всегда есть тру-way (оно устарело на 50 лет уже).  :)

Цитировать
Это можно решить флагом конструктора, например DefaultSettings/SystemSettings.

Не, никто не будет заморачиваться с этим, и я тоже.

PS: Всем не угодишь, а тратить личное время мне уже надоело на все эти потехи, увы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 16, 2016, 15:37
Цитировать
Раньше так оно и было, давно. Но с тех пор уже много копий сломано было на этот счет,
ругались и так и сяк
Именно тогда вам надо было сказать:
Цитировать
нельзя так. Все, точка

Цитировать
Хочешь свои настройки - устанавливай их до открытия; хочешь чтобы менялись
в процессе работы - меняй их у открытого девайса. 

Хочешь чтобы просто открылось - нельзя так. Все, точка.

Логика проста.
"У Вас тут пахнет всем чем угодно, но только не колбасой" (логикой)

Цитировать
Как это не должен знать? Это проблемы того софта.

Если софтина работает с у-вом,
то она должна знать параметры для работы с у-вом и сама его конфигурить. Она берет
над ним контроль, а не "Дядя Вася" откуда-то.
Вы же прекрасно поняли, что в описанном случае софт работает не с устройством, а с хендлом, а вот на что хендл указывает знает "Дядя Вася". А в примере "echo hello >> com1" по вашему команда echo должна настраивать порт?

Цитировать
Не, никто не будет заморачиваться с этим, и я тоже.
PS: Всем не угодишь, а тратить личное время мне уже надоело на все эти потехи, увы.
Создается впечатление, прошу прощения за грубость, что Вам западло ввести еще одну переменную и проверить ее состояние перед вызовом initialize(). Любители дефолтов ничего не теряют.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Bepec от Сентябрь 16, 2016, 15:48
Тролль?
Библиотека QSerialPort кроссплатформенная.
Поддержка фишки одной ОС, которая отсутствует в других - нерациональное решение :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Old от Сентябрь 16, 2016, 15:57
Поддержка фишки одной ОС, которая отсутствует в других - нерациональное решение :)
Это вы про какую фишку сейчас говорите? И в какой ОС ее нет? :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 16, 2016, 16:48
Цитировать
Именно тогда вам надо было сказать:

Ага, ну конечно...

Цитировать
"У Вас тут пахнет всем чем угодно, но только не колбасой" (логикой)

Дело не в логике, а в реализации. Там были проблемы при "автодетекте" текущих параметров
порта при открытии, для некоторых девайсов.
 
Например, встречалась такая комбинация в DCB (да и в termios тоже) что нельзя однозначно
определить в каком режиме (какие "системные" настройки) оно открылось.

Этот автодетект нужен был чтобы после открытия обновить внутренние проперти объекта.
Чтобы, например, дальнейший вызов QSP::baudRate() показал именно текущую скорость,
а не какой-то "левак", но он не всегда работал как ожидалось.

Поэтому было принято решение все упростить и зделать так чтобы принудительно
инициализировать у-во уже заранее известными параметрами.

Было и еще что-то я уже и не помню.

Цитировать
Вы же прекрасно поняли, что в описанном случае софт работает не с устройством, а с хендлом, а вот на что хендл указывает знает "Дядя Вася".

Опять же, это все частный случай, а не общий. Это "фишка" конкретной платформы, мировосприятия.

Цитировать
А в примере "echo hello >> com1" по вашему команда echo должна настраивать порт?

А оно "echo" для этого и не предназначено.

Ну, есть у меня только "echo" и что с нее толку, если я не знаю,
режим работы порта... И мне, что, перебирать в терминалке на другом конце все возможные
варианты скоростей и всего прочего, чтобы получить это "hello" ?

Ну, я ж и грю, ох уж этот Юникс-вэй... кто-то конфигурит девайс, кто-то с него читает, кто-то в него пишет, кто-то его лижет.
Старичок должен идти на покой.  :)

Цитировать
Создается впечатление, прошу прощения за грубость, что Вам западло ввести еще одну переменную и проверить ее состояние перед вызовом initialize(). Любители дефолтов ничего не теряют.

А мне этого не надо, меня все устраивает. Код открыт, вперед.  ;)


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lit-uriy от Сентябрь 16, 2016, 17:56
>>Вы же прекрасно поняли, что в описанном случае софт работает не с устройством, а с хендлом, а вот на что хендл указывает знает "Дядя Вася".
Не понимаю Дедевасиной проблемы, он что порт не в силах был настроить?
указатель на QSerialPort, открытый и настроеный, пусть и передаёт.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 16, 2016, 18:30
Не, как я понял, суть в другом.

1. Бородатый Дядя Вася в потрепаном свитаре настроил порт  /dev/ttyS0 через stty на 115200 бод.

2. Девочка Лиза делает echo "Hello, Petya" >> /dev/ttyS0

3. Мальчик Петя запустил cat  /dev/ttyS0 или другую юникс-вей программулинку и
читает данные в консольке, и видит: "Hello, Petya". Он рад и счастлив новым знакомствам.

4. Тут Марь Иванна (уборщица) протерла тряпкой клавиатуру у ПиСи,
и нечаянно запустила программку, которая открывает порт через QSP..

И оп-ля, мальчик Петя плачет, у него больше в консольке ничо не отображается,
QSP скинул настройки на 9600 бод (злая Марьиванна все паламала).

Пичаль-беда... Теперь Мальчик Петя не познакомится с девочкой Лизой, не возьмет
ее замуж.. Эффект бабочки прям какой-то... Во всем виновата Марь Иванна.

Мальчику Пете надо конфетку. :)

5. Мальчик Петя позвал Дядю Васю, и попросил помочь.. "Не переживай, Петя", крякнул Василий,
и жирными пальцами (от селедки) набрал stty 115200.. "Я линухойд", сказал он, я все умею.

6. И, о, чудо, Петя снова видит Лизины "смски"

7. Но тут Марь-ванна все просекла, дала по шапке Василию, а грязной тряпкой
погнала мальчика Васю и Лизу вон, из помещения - в парк! Негоже молодежи
сидеть в помещении, пусть кушают морожко в парке!

ЗЫ: Все в этом рассказе - чисто гипотетическая и фантазийно-фантазийная сцена,
нигде не пересекающаяся с реальностью, все персонажи вымышленные.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 19, 2016, 14:10
Спасибо, повеселили.
У Вас волшебная юмористическая аналитичность.
Однако вспоминается что-то из былого:
 - времена телеграфа - "– Давай, работай, – обратился Будённый к телеграфисту. Телеграфист быстро отстучал телеграфным ключом...";
 - появление телефонов - "Алло, коммутатор? Будьте добры, соедините...";
 - радиопередатчик - "Он отдал сообщение радисту: "Зашифруйте и передайте на частоте...";
 - директор секретарше, забыв номер - "Соедините меня с финансовым отделом!";
 - эпоха интернета - "Пожалуйста, организуйте интернет-конференцию на следующей неделе".
Как видно настройку и организацию связи осуществляют третьи лица. Нет?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 20, 2016, 12:08
Поразмыслив, я понял, что потребовал от Вас слишком мало!
Вместо настройки конструктора Default/System надо сделать для каждого "проперти" по мимо существующего смысла Unknown новый смысл System/Default, который будет определять состояние свойства в момент открытия порта, то есть настраивать свойство значением по дефолту/определением или брать его текущим по состоянию системы. Но это только в том случае, если Вы продолжите политику предопределенных значений.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Сентябрь 20, 2016, 13:25
Цитировать
по мимо существующего смысла Unknown

В будушем Unknown будет удален.

Все будет упрощено и всегда порт будет открываться и конфигуриться или с умолчальными 9600 8 N 1 или с пользовательскими настройками. Ни о каких "системных" настройках не может идти речи. Точка.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Сентябрь 20, 2016, 16:13
Цитировать
Ни о каких "системных" настройках не может идти речи. Точка.
Пичаль-беда... Теперь Мальчик Петя не познакомится с девочкой Лизой, не возьмет
ее замуж..

Итог.
На протяжении 4 лет я слежу и инспектирую класс QSerialPort (QSerialDevice) и аналоги из других библиотек. Смысл отказаться от сторонних компонент и полностью перейти на средства Qt. Из Ваших заявлений я делаю вывод, что QSerialPort как для нас, так и для наших партнеров в очередной раз не готов заменить широко применяемую компоненту TComPort. Кстати разработки 2002-2003 года. Увы, мне очень жаль потраченное Вами время.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Racheengel от Сентябрь 20, 2016, 19:23
Наш софт тоже работает с последовательным портом.
В конфигах есть таб, где можно выставить все параметры соединения.
Если это сделано через гуй - параметры передаются сразу порту.
Параллельно настройки пишутся в файлик.
При следующем старте софтины, файлик читается и порт переконфигурируется "вчистую".
По моему, это самое нормальное поведение. Гарантия того, что "дядя Вася" не нашухарил.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lesav от Октябрь 13, 2016, 10:46
Тема: setRequestToSend() setDataTerminalReady()

Вопрос рожден после прочтения следующего
сообщения: Re: QSerialPort и RS-485 короткий вопрос. (http://www.prog.org.ru/index.php?topic=25498.msg182639#msg182639)

Я понимаю, что QSerialPort работает полностью в асинхронном режиме.
Но предложенное решение не подходит для выставления управляющих
сигналов, т.к. сигнал bytesWtitten приходит всегда нестабильно во
времени, и переключение приемопередатчика происходит с опозданием. 
В итоге я получаю не весь ответ от опрашиваемого устройства.

Существует возможность четкого определения ухода в порт последнего бита ?
Или мне поможет только своя реализация поточного опроса COM порта ?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Октябрь 13, 2016, 11:12
Цитировать
.к. сигнал bytesWtitten приходит всегда нестабильно

Вообше не гарантирует что на физическом уровне передался последний байт/бит.
Оно гарантирует только что операция ввода/вывода завершена и все данные отправлены драйвером.
Но вот "куда" отправлены - это дугой вопрос. Зависит от реализации драйвера или самой железяки.

Цитировать
Существует возможность четкого определения ухода в порт последнего бита ?

Не думаю, что это возможно из обычной ОС.. Это возможно только при непосредственном обращении
к регистрам устройства, и то, если такие регистры, из которых можно получить эту информацию есть.

Как вариант, можно попробовать в линукс флаг, аналогичный FIONREAD, должно быть что-то типа FIONWRITE
или около того. А для Windows попробовать читать структуру COMSTAT.

Но тут также все зависит от девайса и от драйвера, реализовано ли, поддерживается ли...

Также я не уверен что оно отражает также данные, например, находящиеся в shift регистрах UART.

Цитировать
Или мне поможет только своя реализация поточного опроса COM порта ?

Чем черт не шутит, попробуйте ;)

PS: Я бы не заморачивался, а купил нормальный преобразователь с автоматическим детектированием
направления передачи, дабы сохранить нервы и время...

PSPS: Я даже не знаю, откуда сейчас берут такой раритет с ручным переключением...


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: lesav от Октябрь 14, 2016, 10:25
Цитировать
PS: Я бы не заморачивался, а купил нормальный преобразователь с автоматическим детектированием
направления передачи, дабы сохранить нервы и время...
Легких путей не существует ))))  Я бы с удовольствием "не заморачивался",
но некоторое оборудование жестко привязано к железу, и ничего не изменить.
К тому-же, моё ПО должно уметь работать с любым оборудованием.
Одно радует, что нужна поддержка только Windows, Linux и QNX

Цитировать
PSPS: Я даже не знаю, откуда сейчас берут такой раритет с ручным переключением...
Да, не перевелись такие. Используется Kontron-овская плата CP346 (http://www.kontron.com/products/boards-and-standard-form-factors/cpci/3u-i-o/miscellaneous-controller/cp346.html).
У этой железки управление приемопередатчиком с помощью сигнала DTR.
Есть вероятность что под Windows драйвер умеет автоматом управлять
направлением передачи, но оборудование работает под Suse linux SLES9. (

Цитировать
Чем черт не шутит, попробуйте свою реализацию...
Она работает, просто хотелось перевести проект на QSerial.
Жалко двух потраченых дней.

Спасибо за отклик


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: xokc от Декабрь 11, 2016, 22:39
Есть Linux с поднятым ntp сервером, который синхронизируется с GPS приемником, подключенным через COM порт. При этом мне надо-бы управлять приемником (писать/читать в этот порт). Могу я как-нибудь "расшарить" используемый порт между ntp сервером и моим приложением?


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Январь 31, 2018, 13:17
Столкнулся с утечкой памяти при определенных обстоятельствах. Утечка возникает только на WinXP. Если эту же самую программу запустить на Win7, то утечки нет. Qt 5.6.3 (хоть mingw, хоть msvc 2015).

Для воспроизведения проблемы нужно немного подредактировать программу blockungmaster, сделать чтобы при нажатии кнопки данные отправлялись бы все время:
В функции void MasterThread::run()
в самом конце комментируем: cond.wait(&mutex);

Где нибудь, например перед записью в порт или после чтения, добавляем msleep(2); - если это убрать, то утечки нет. Эта задержка - перестраховка, на случай если попадется промежуточный (RS232->RS482) экзотический преобразователь, у которого не нулевое время переключения с передачи на прием и обратно. Сам я с таким не сталкивался, но читал что такое есть и решил перестраховаться.

Соединяем rx и tx (я использую usb-rs232) и запускаем программу. Утечку можно наблюдать в диспетчере задач, последите минуту. За сутки может набежеть 200 Мб.

В принципе проблема не критична, я могу и не использовать msleep(2), но может это поможет найти возможные сопутствующие проблемы.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Январь 31, 2018, 14:07
См. https://bugreports.qt.io/browse/QTBUG-48653 может поможет. Если не поможет - то не используй waitForXXX, используй асинхронный подход с readyRead/bytesWritten сигналами.

Никто (Я) править для WinXP и Qt5.6.3 не будет(у) ничего. Но если проблема повторится с Qt 5.9.x || 5.10.x то тогда посмотрим.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: Phoenix от Февраль 02, 2018, 09:15
Это действительно помогло.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 09, 2018, 09:24
Поймал баг. При записи в порт получаю сообщение:
Цитировать
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSerialPort(0x15cfec0), parent's thread is SerialReader(0x159c420), current thread is QThread(0x316fb8)

Код
C++ (Qt)
SerialReader::SerialReader(QObject *parent) : QThread(parent)
{
   m_serialPort = new QSerialPort;
   m_serialPort->moveToThread(this);
   connect(m_serialPort, &QSerialPort::readyRead, this, &SerialReader::readSerialData);
}
 
void SerialReader::run()
{
   m_serialPort->setPortName("COM1");
   if (!m_serialPort->open(QIODevice::ReadWrite)
           || !m_serialPort->setBaudRate(9600)
           || !m_serialPort->setDataBits(QSerialPort::Data7)
           || !m_serialPort->setParity(QSerialPort::NoParity)
           || !m_serialPort->setStopBits(QSerialPort::TwoStop)
           || !m_serialPort->setFlowControl(QSerialPort::NoFlowControl)
           || !m_serialPort->setDataTerminalReady(true)
           || !m_serialPort->setRequestToSend(false)) {
       emit critical(m_serialPort->errorString());
       return;
   }
 
   exec();
 
   m_serialPort->close();
}
 
void SerialReader::readSerialData()
{
   QByteArray data = m_serialPort->readAll();
   qDebug() << data;
 
   if (data.startsWith("#"))
       m_serialPort->write("...");
}
 


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 09, 2018, 11:00
Это не баг, это неправильная работа с тредами. Погуглить наверно стоило прежде чем постить.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 10, 2018, 11:06
Мне хорошо известны способы работы с тредами, один через создание некоего Worker, другой через переопределение метода run. Кто из них правильный, а кто нет - тема отдельной дискуссии, но в жизни применяют и тот и другой. Если QSerialPort в одном из вариантов работает не полноценно, то это определенно BUG.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: sergek от Август 10, 2018, 12:29
Надо new QSerialPort делать в run.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 11, 2018, 14:22
> Мне хорошо известны способы работы с тредами

Это вы себя перехваливаете.



Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: poru от Август 21, 2018, 09:26
Есть ли какая возможность прервать функцию ожидания данных waitForReadyRead(), или будет ли она реализована в новой версии? Ну что то типа cancel(), которая прерывает все операции.


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Август 21, 2018, 17:18
Нет. Работа с QSP должна быть всегда в одном потоке. Никаких cancel() не предполагается. Нужно использовать асинхронные ф-ции, а не этот треш с waitForXXX().

ЗЫ: Можно попробовать на винде CancelIo() заюзать (дернуть из другого треда, что из этого выйдет - хз).


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: todimka от Ноябрь 13, 2018, 06:15
Подскажите пожалуйста, существует ли в QSP возможность определять момент, когда данные физически полностью переданы через UART? Через регистры порта это вроде несложно было бы сделать, но к ним доступа под win нету :(


Название: Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
Отправлено: kuzulis от Ноябрь 13, 2018, 12:24
нет


Название: Re: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Отправлено: kuzulis от Октябрь 07, 2020, 10:40
Всем доброго времени.

Наконец - таки я принял решение уйти из проекта и больше не сопровождать QtSerialPort. У меня больше нет на это времени, желания, да и вообще "перегорел".

Всем спасибо кто пользовался этим модулем.  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Отправлено: Igors от Октябрь 07, 2020, 11:18
Наконец - таки я принял решение уйти из проекта и больше не сопровождать QtSerialPort. У меня больше нет на это времени, желания, да и вообще "перегорел".
Имеете полное право. Но тогда уж в названии поменяйте "создаю" на "создал"  :)


Название: Re: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Отправлено: sergek от Октябрь 07, 2020, 12:16
Всем спасибо кто пользовался этим модулем.  :)
Вам спасибо. Для меня это один из самых нужных модулей.


Название: Re: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Отправлено: juvf от Октябрь 08, 2020, 14:50
Наконец - таки я принял решение уйти из проекта и больше не сопровождать QtSerialPort.
Загадываем желание "чтобы serial port в Qt больше не менял API".

ps Может QSP наконец-то выправят.


Название: Re: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Отправлено: Racheengel от Октябрь 13, 2020, 16:22
Всем доброго времени.

Наконец - таки я принял решение уйти из проекта и больше не сопровождать QtSerialPort. У меня больше нет на это времени, желания, да и вообще "перегорел".

Всем спасибо кто пользовался этим модулем.  :)

Вообще, конечно, опенсорс съедает много времени и сил, а отдачи практически никакой (кроме багрепортов и "хочу фичу!").
Я тоже свои проекты практически "закончил".

Большое спасибо за проект QSerialPort , помог очень в своё время.