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

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #135 : Апрель 12, 2010, 10:51 »

Итак, вроде исправил сегфаулт!!!

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

т.е. хто бы это всё реализовал бы? Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Prm
Гость
« Ответ #136 : Апрель 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!";




Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #137 : Апрель 12, 2010, 18:01 »

ОК, приму к сведению.

Ну а по теме то что?
Записан

ArchLinux x86_64 / Win10 64 bit
Prm
Гость
« Ответ #138 : Апрель 14, 2010, 08:18 »

Итак, вроде исправил сегфаулт!!!

А коммит на сайт fireforge делали? Там последняя версия от 05.04.2010. Хотелось бы самую последнюю версию качнуть.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #139 : Апрель 14, 2010, 09:48 »

Цитировать
А коммит на сайт fireforge делали? Там последняя версия от 05.04.2010. Хотелось бы самую последнюю версию качнуть.
Да, в SVN коммиты все есть. Всё самое новое в SVN! Качайте! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Prm
Гость
« Ответ #140 : Апрель 14, 2010, 15:01 »

Применил в проекте Вашу библиотечку. Впечатления наилучшие - отлично проработан код и документация. Спасибо за труд!!!

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

Сообщений: 2812


Просмотр профиля
« Ответ #141 : Апрель 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 не поддерживает шаред моде в отношении последовательных портов (хотя нужно проверить - может врут? Улыбающийся  )
Хотя, как я понял, этот режим может поддерживаться - но все зависит от драйвера последовательного порта.. т.е. не все девайсы это могут поддерживать... Опять - же НУЖНО ПРОВЕРИТЬ!
« Последнее редактирование: Апрель 14, 2010, 15:39 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Prm
Гость
« Ответ #142 : Апрель 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;
}

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




Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #143 : Апрель 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
« Последнее редактирование: Апрель 22, 2010, 17:26 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Prm
Гость
« Ответ #144 : Апрель 22, 2010, 19:56 »

Блин...фигня какая получилась. Я исходники брал со страницы http://fireforge.net/scm/?group_id=199, кликал по ссылке [Загрузить свежую SVN базу репозитория]. Значит сайт косячит... Грустный В архиве скачивается версия qserialdevice-scm-2010-04-05.

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

Сообщений: 2812


Просмотр профиля
« Ответ #145 : Апрель 22, 2010, 20:24 »

Цитировать
Значит сайт косячит...
дада, есть такая хрень
Записан

ArchLinux x86_64 / Win10 64 bit
sne
Гость
« Ответ #146 : Май 13, 2010, 11:33 »

fireforge.net сдох?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #147 : Май 13, 2010, 11:43 »

По ходу да... Они там переезжают куда-то..

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

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #148 : Май 13, 2010, 13:17 »

>>Думаю на google code перенести SVN
Переберайся на гиториус, git рулит. Всю историю с SVN'а можно стянуть в локальное git-хранилище, а потом отправить на гиториус
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #149 : Май 13, 2010, 14:18 »

Цитировать
Переберайся на гиториус, git рулит. Всю историю с SVN'а можно стянуть в локальное git-хранилище, а потом отправить на гиториус
Вопросы:
1. Чем GIT лучше SVN?
2. Есть мануал по переходу с SVN на GIT ?
3. Какие клиенты GIT под винду есть?
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 ... 8 9 [10] 11 12 ... 88   Вверх
  Печать  
 
Перейти в:  


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