Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QSerialDevice - Библиотека для работы с COM-портами
Форум на CrossPlatform.RU > Административный > Crossplatform.ru - все о нем > Обсуждение исходников с сайта
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
kuzulis
Цитата
А очень просто. Надо перехватывать все события udev'а, а не только те, что связаны с rs232 портами. И смотреть, являлось ли отключённое устройство портом.


Да так там и работает. Ловятся любые события от UDEV а потом просто смотрим что изменилось в директории /dev, и если там пропало у-во которое является tty* - то мы сообщаем об этом. Значит при выдергивании порта когда он открыт события не приходят от UDEV. Нужно проверить как нибудь попозже.

Цитата
я использую QxtSerialPort в виндовозе, для отлова отключения преобразователя USB-RS232 при открытом порте всегда проверяю кол-во принятых байт. Драйвер FTDI'ного преобразователя всегда отрицательное значение возвращает.


Так это не означает, что конвертер отключен. Это означает что произошла какая то ошибка ввода - вывода ИМХО.

---
Резюмирую: чтобы реализовать полностью такую фичу как "отлов втыкания/выдергивания" конвертеров в любых состояниях (открыт или закрыт или что-то там еще) необходимо найти те механизмы в ОС которые позволяли бы обнаружить втыкание/извлечение конвертера.

Вот к примеру, если конвертер (порт) закрыт, то его "втыкание/извлечение" в принципе легко отслеживается. Но, если он открыт и в этот момент его мы "выдернули" - то это проблема ОС ! Если в ней еще сохраняется состояние того что порт присутствует - то виноват "индус" который писал ОС! :)

Если вы найдете механизм, который четко и однозначно определял наличие порта в системе - то я это реализую. Присылайте патчи.. Я только ЗА всеми руками!




Litkevich Yuriy
Цитата(kuzulis @ 15.5.2010, 17:36) *
Так это не означает, что конвертер отключен.
само собой. Просто FTDI'ный драйвер гарантирует такое поведение при отключении устр-ва при открытом порте.

Справедливо для виндовоза:
Проблема большинства имитаторов COM-порта: при открытом порте вытаскиваем USB-устройство, далее если мы не закрываем порт и снова вставляем USB-устройство. То - приплыли. Больше мы этим портом воспользоватся не сможем, пока не проделаем следующую процедуру:
1) опять выдёргиваем USB-устройство
2) в диспетчере устройств делаем обновить, соответствующий COM-порт должен исчезнуть из списка
3) Вставляем USB-устройство вновь, оно должно определиться и снова должен появится COM-порт.

Тот трюк который проделываю я:
Если приняли отрицательное кол-во байт, порт сразу закрываю. Т.к. вставка USB-устройства при закрытом порте не приводит к выше описанному криминалу.


Цитата(kuzulis @ 15.5.2010, 17:36) *
Но, если он открыт и в этот момент его мы "выдернули" - то это проблема ОС ! Если в ней еще сохраняется состояние того что порт присутствует - то виноват "индус" который писал ОС!
индус прав. Открытый порт не может исчезнуть вдруг. Т.к. этот ресурс занят программой.

программа не может ни с того ни с сего лишиться ресурса. Представь себе ситуацию:
// ты создал переменную - тоже ресурс
int myvar = 10;
...
// далее ты хочешь воспользоваться ею
int var2 = myvar;
// но вот не задача, ресурс myvar исчез
dekar

Цитата(kuzulis @ 15.5.2010, 14:36) *
Да так там и работает. Ловятся любые события от UDEV а потом просто смотрим что изменилось в директории /dev, и если там пропало у-во которое является tty* - то мы сообщаем об этом. Значит при выдергивании порта когда он открыт события не приходят от UDEV. Нужно проверить как нибудь попозже.

---
Резюмирую: чтобы реализовать полностью такую фичу как "отлов втыкания/выдергивания" конвертеров в любых состояниях (открыт или закрыт или что-то там еще) необходимо найти те механизмы в ОС которые позволяли бы обнаружить втыкание/извлечение конвертера.

Вот к примеру, если конвертер (порт) закрыт, то его "втыкание/извлечение" в принципе легко отслеживается. Но, если он открыт и в этот момент его мы "выдернули" - то это проблема ОС ! Если в ней еще сохраняется состояние того что порт присутствует - то виноват "индус" который писал ОС! :)

Если вы найдете механизм, который четко и однозначно определял наличие порта в системе - то я это реализую. Присылайте патчи.. Я только ЗА всеми руками!


Мы подключаем устройство.

Вот события удева:

CODE
KERNEL[1273928448.612580] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)
KERNEL[1273928448.615458] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
KERNEL[1273928448.622468] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/tty/ttyACM0 (tty)
KERNEL[1273928448.622593] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
KERNEL[1273928448.622606] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)
UDEV [1273928448.626864] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)
UDEV [1273928448.627187] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
UDEV [1273928448.628576] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
UDEV [1273928448.640491] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/tty/ttyACM0 (tty)
UDEV [1273928448.644527] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)

Мы видим, что подключено устройство, связанное с tty

Теперь мы порт открываем, после чего вытаскиваем устройство. Результат:
CODE

KERNEL[1273928469.995045] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
KERNEL[1273928469.995079] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
KERNEL[1273928469.996906] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)
UDEV [1273928469.996923] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
KERNEL[1273928469.996937] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)
UDEV [1273928469.998121] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
UDEV [1273928469.999564] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)
UDEV [1273928469.999826] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)

Видно, что ttyACM0 не изчез. Но, если бы мы на прошлой итерации запомнили ещё и /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/, то тогда мы бы могли сейчас подать сигнал о том, что вынули именно ttyACM0.

Если устройство было подключено до старта watcher'а, то тогда его путь в ядре можно было бы отловить в самом начале, делая табличку интересующих нас устройств, т.е. tty* (да, знаю устройств много. Но, ИМХО, это полезая фича.
Litkevich Yuriy
Цитата(dekar @ 15.5.2010, 20:19) *
Но, ИМХО, это полезая фича
безусловно.

dekar, решение действительно хорошее, может kuzulis, возьмёт его на заметку.

П.С. по поводу оформления сообщений прочитай тему: Справка по кнопкам и тэгам форума
dekar
А ты можешь пока проверить, есть ли сигнал от изчезновения уже открытого порта в венде? На той версии, что уже есть. Ибо у меня пока нет возможности что-то под оной собрать.

И, если не сложно, краткое описание того, как вообще в венде собирать что-то. Там gcc вообще есть? make? Или только их студия? Вот уже поставил себе семёрку в виртуалке.

А править посты тут можно? Что-то я кнопочку не нахожу.
kuzulis
Цитата
А ты можешь пока проверить, есть ли сигнал от изчезновения уже открытого порта в венде? На той версии, что уже есть. Ибо у меня пока нет возможности что-то под оной собрать.

Я проверил под виндой. Да, таже проблемка :) . Но я знаю как решить.. Просто нужно "слушать" другие ветки реестра и все должно быть нормуль.

Цитата
И, если не сложно, краткое описание того, как вообще в венде собирать что-то. Там gcc вообще есть? make? Или только их студия? Вот уже поставил себе семёрку в виртуалке.

Дык есть описние . Если используешь MinGW, то сборка ничем не отличается. Но если Студию - то там только nmake вместо make. В общем ничего сложного.

Цитата
А править посты тут можно? Что-то я кнопочку не нахожу.

А для этого нужно набрать сколько то там постов (вроде)

----

В общем проблему понял, идеи есть. Будем решать в ближайшее время :)
leech
Добрый день! Благодарю за отличный класс для работы с компортом!

Возникла долго не решаемая проблема с приёмом данных из порта, после востановления подключения к порту.
Использую приём по сигналу readyRead()

COMport = new AbstractSerial();
connect(COMport, SIGNAL(readyRead()), this, SLOT(slot_COMPortReadyRead()));


void SCPI_Generator::slot_COMPortReadyRead()
{
    qint64 ba_count= COMport->bytesAvailable();        // Количество пришёдших байт в буффере
    QByteArray ba = COMport->read(ba_count);          // Читаем данные из буфера

    inputBuffer.append(ba);
    if (inputBuffer.contains("\n"))                                 // Если пришёл конец строки
    {
        QString ba_str(inputBuffer);
        inputBuffer.clear();
        logText->append(QString("<b>&gt;</b> %1").arg(ba_str));       // Записываем посылаемые данные в лог
    }
}


При запуске программы открывается и настраивается COMпорт
bool SCPI_Generator::ComPortOpen()
{
    COMport->setDeviceName(comPortName);
    if (COMport->open(QIODevice::ReadWrite | QIODevice::Unbuffered))
    {
        COMport->reset();
        COMport->setBaudRate(QString("%1 baud").arg(comBaudRate));
        COMport->setDataBits(QString("%1 bit").arg(comDataBits));
        COMport->setStopBits(comStopBits);
        COMport->setParity(comParity);
        COMport->setFlowControl(comFlowControl);
        return true;
    }
    else // Ошибка открытия COM порта
    {
        QMessageBox::critical(this, tr("Critical error!"),
                                    tr("Error opened serial device %1.\n"
                                       "Select another COM port.").arg(COMport->deviceName()), QMessageBox::Ok);
        return false;
    }
}



пришедшие данные отлично отображаются. ОДнако, если закрыть COM порт и потом снова открыть, при приёме отображается такая ошибка

Windows: NativeSerialEnginePrivate::nativeSelect(int timeout, bool selectForRead) 
-> function: ::WaitForSingleObject(ovl.hEvent, timeout < 0 ? 0 : timeout),
returned: WAIT_TIMEOUT:  258 . Warning!


и данные не читаются. После этого сигнал readyRead() вообще не эмитируется. Зашел пока в тупик. Заранее благодарю за разъяснения!
kuzulis
leech

А попробуйте ка использовать версию библиотеки из SVN. Там по сравнению с 0.2.0 много чего изменилось, внимательно посмотрите примеры и abstractserial.h.
Если и там будет такая-же проблема - то будем разбираться.

Из SVN качайте SVN-клиентом. Описание как это делать находится тут: http://fireforge.net/scm/?group_id=199

Ни в коем случае не жмакайте на ссылку: [Загрузить свежую SVN базу репозитория]
т.к. получите не свежий срез - а 2010/04/05. . (какая то ошибка на сервере/сайте)

Т.е. свежак - это использование клиента!
leech
Благодарю! Скачал SVN, пересобрал, поправил вызовы в связи с миграцией класса AbstractSerial с QIODevice на QObject, и всё заработало! Проблема решилась.
Litkevich Yuriy
kuzulis, отредактируй пожалуйста первое сообщение темы. Чтобы в нём были актуальные ссылки на проект/исходники.
Т.к. новичкам может быть обременительно читать всю тему в поисках ссылок.
dekar
Уже удалось отслеживать отключение уже открытого порта?
Если да, то советую сделать новый snapshot.
kuzulis
Цитата
kuzulis, отредактируй пожалуйста первое сообщение темы. Чтобы в нём были актуальные ссылки на проект/исходники.
Т.к. новичкам может быть обременительно читать всю тему в поисках ссылок.


у меня не появляется ссылки типа "редактировать сообщение"

Цитата
Уже удалось отслеживать отключение уже открытого порта?
Если да, то советую сделать новый snapshot.


да, но пока только под Windows.

Также обнаружились некоторые проблемы при использовании метода waitForReadyRead() .
Сегфолт наблюдается в Win7 при использовании примера /examples/reader.
Там какая-то фигня с WaitCommEvent и т.п. Но вроде уже проблему победил (сделал костыль).
Скоро обновлю срез.
Litkevich Yuriy
kuzulis, такой кнопки: под первым сообщением темы нету?
kuzulis
Litkevich Yuriy,
не, нету. только зеленые кнопки типа "создать тему", "цитата" и т.п.

dekar,
всё, добавил изменения в SVN. Пробуйте.
dekar
Венда у меня только в виртуалке далеко. Завтра попробую.
panbaraban
а получение инфы об устройстве (serialdeviceinfo) у всех нормально работает? :unsure:
kuzulis
Цитата
а получение инфы об устройстве (serialdeviceinfo) у всех нормально работает? :unsure:


А вы лучше скажите что не работает лично у вас! :)
Какая ОС ? Что именно не устраивает?

Конкретики пжлста!!! Конкретики! :)
panbaraban
Цитата(kuzulis @ 27.5.2010, 15:11) *
Цитата
а получение инфы об устройстве (serialdeviceinfo) у всех нормально работает? :unsure:


А вы лучше скажите что не работает лично у вас! :)
Какая ОС ? Что именно не устраивает?

Конкретики пжлста!!! Конкретики! :)


ось -винда хп сп3

запускаю пример serialdeviceinfo, ввожу COM1 например. В результате - пустые строки, и что самое главное isExists=false. :(
На линуксе ещё не проверял
kuzulis
Цитата
и что самое главное isExists=false.

значит нету COM1 :)

Кстати, этот порт в мамку встроен или это USB\RS-232 конвертер?
panbaraban
Цитата(kuzulis @ 27.5.2010, 17:17) *
Цитата
и что самое главное isExists=false.

значит нету COM1 :)

Кстати, этот порт в мамку встроен или это USB\RS-232 конвертер?

Он есть, проверил все что были. Конвертер USB\RS-485 тоже не определяется
kuzulis
Цитата(panbaraban @ 27.5.2010, 18:15) *
Цитата(kuzulis @ 27.5.2010, 17:17) *
Цитата
и что самое главное isExists=false.

значит нету COM1 :)

Кстати, этот порт в мамку встроен или это USB\RS-232 конвертер?

Он есть, проверил все что были. Конвертер USB\RS-485 тоже не определяется


хм.. о_О. ,

а посмотрите в реестре, по пути:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Serenum\\Enum

есть ли там что нибудь?
kuzulis
Цитата(dekar @ 15.5.2010, 17:19) *
Цитата(kuzulis @ 15.5.2010, 14:36) *
Да так там и работает. Ловятся любые события от UDEV а потом просто смотрим что изменилось в директории /dev, и если там пропало у-во которое является tty* - то мы сообщаем об этом. Значит при выдергивании порта когда он открыт события не приходят от UDEV. Нужно проверить как нибудь попозже.

---
Резюмирую: чтобы реализовать полностью такую фичу как "отлов втыкания/выдергивания" конвертеров в любых состояниях (открыт или закрыт или что-то там еще) необходимо найти те механизмы в ОС которые позволяли бы обнаружить втыкание/извлечение конвертера.

Вот к примеру, если конвертер (порт) закрыт, то его "втыкание/извлечение" в принципе легко отслеживается. Но, если он открыт и в этот момент его мы "выдернули" - то это проблема ОС ! Если в ней еще сохраняется состояние того что порт присутствует - то виноват "индус" который писал ОС! :)

Если вы найдете механизм, который четко и однозначно определял наличие порта в системе - то я это реализую. Присылайте патчи.. Я только ЗА всеми руками!


Мы подключаем устройство.

Вот события удева:

CODE
KERNEL[1273928448.612580] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)
KERNEL[1273928448.615458] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
KERNEL[1273928448.622468] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/tty/ttyACM0 (tty)
KERNEL[1273928448.622593] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
KERNEL[1273928448.622606] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)
UDEV [1273928448.626864] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)
UDEV [1273928448.627187] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
UDEV [1273928448.628576] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
UDEV [1273928448.640491] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/tty/ttyACM0 (tty)
UDEV [1273928448.644527] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)

Мы видим, что подключено устройство, связанное с tty

Теперь мы порт открываем, после чего вытаскиваем устройство. Результат:
CODE

KERNEL[1273928469.995045] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
KERNEL[1273928469.995079] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
KERNEL[1273928469.996906] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)
UDEV [1273928469.996923] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0 (usb)
KERNEL[1273928469.996937] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)
UDEV [1273928469.998121] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1 (usb)
UDEV [1273928469.999564] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_device/usbdev2.112 (usb_device)
UDEV [1273928469.999826] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1 (usb)

Видно, что ttyACM0 не изчез. Но, если бы мы на прошлой итерации запомнили ещё и /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/, то тогда мы бы могли сейчас подать сигнал о том, что вынули именно ttyACM0.

Если устройство было подключено до старта watcher'а, то тогда его путь в ядре можно было бы отловить в самом начале, делая табличку интересующих нас устройств, т.е. tty* (да, знаю устройств много. Но, ИМХО, это полезая фича.


только что проверил работу в Linux при таких обстоятельствах и получил это:
Цитата
[kuzulis@kuzulis release]$ ./serialdevicewatcher
Please remove or insert a serial device (eg USB/Serial controller) to see the notification.
Devices : ("/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3", "/dev/ttyUSB0")
Devices : ("/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3")
Devices : ("/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3", "/dev/ttyUSB1")


т.е. сначала открыл у-во /dev/ttyUSB0 потом запустил Watcher. Он мне выдал первую строку. Потом я выдернул шнурок - он мне выдал вторую строку в которой этот порт пропал. Далее я опять втыкнул шнурок - он мне показал третью строку /dev/ttyUSB1

как видно, у меня на компе все события обрабатываются "корректно" . хм.. непонятно почему у вас проблемы в Linux


Litkevich Yuriy
kuzulis, не цитируй целыми сообщениями - читать тяжело
panbaraban
Цитата(kuzulis @ 27.5.2010, 19:28) *
хм.. о_О. ,

а посмотрите в реестре, по пути:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Serenum\\Enum

есть ли там что нибудь?


Нажмите для просмотра прикрепленного файла
kuzulis
хм. ну должно работать по идее.

а теперь посмотрите в :

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\USB\\Vid_067b&Pid_2303\\5&21b58723&0&1

и в:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\USB\\Vid_067b&Pid_2303\\5&21b58723&0&1\\Device Parameters
panbaraban
Цитата(kuzulis @ 28.5.2010, 9:39) *
хм. ну должно работать по идее.

а теперь посмотрите в :

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\USB\\Vid_067b&Pid_2303\\5&21b58723&0&1

и в:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\USB\\Vid_067b&Pid_2303\\5&21b58723&0&1\\Device Parameters


Как то так вот, например Нажмите для просмотра прикрепленного файла
kuzulis
В принципе все должно работать. Пробегитесь дебаггером в SerialDeviceInfo :).
panbaraban
Цитата(kuzulis @ 31.5.2010, 9:39) *
В принципе все должно работать. Пробегитесь дебаггером в SerialDeviceInfo :).

Пасиба, попробую)
panbaraban
Ещё такая бага: если порт открыть, а потом закрыть, то снова открыть его уже не получается. Делал полностью из примера reader.
В начале проги создал объект, при закрытии его не удалял. Затем снова вызываем open и всё, порт больше не открывается. Может быть я что-то не так делаю?

kuzulis
Цитата(panbaraban @ 8.6.2010, 18:43) *
Ещё такая бага: если порт открыть, а потом закрыть, то снова открыть его уже не получается. Делал полностью из примера reader.
В начале проги создал объект, при закрытии его не удалял. Затем снова вызываем open и всё, порт больше не открывается. Может быть я что-то не так делаю?


этот баг был в версии 0.2.0 (в релизе). в SVN это должно быть уже пофикшено.

к сожалению пока что fireforge.net лежит :( и невозможно получить срез.
panbaraban
Цитата(kuzulis @ 8.6.2010, 21:16) *
этот баг был в версии 0.2.0 (в релизе). в SVN это должно быть уже пофикшено.

к сожалению пока что fireforge.net лежит :( и невозможно получить срез.

хм, а я качал с svn в конце мая. попробую перекомпилить....
panbaraban
Нет, та же ерунда, причем выборочно. На одном порте работает отлично, а другой невозможно открыть повторно.
kuzulis
Цитата
Нет, та же ерунда, причем выборочно. На одном порте работает отлично, а другой невозможно открыть повторно.


Как качали SVN?
Включите отладочные сообщения (раскомментируйте в *.cpp файлах строки вида: #define blablabla_DEBUG) и посмотрите что оно выводить будет.
Пройдитесь дебагером. :)
panbaraban
Да, качал SVN, ревизия 132 кажется, конец мая.


Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode) 
-> trying to open device:  "COM6"

Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> opened device:  "COM6"  in mode:  3  succesfully. Ok!

Windows: NativeSerialEnginePrivate::nativeClose()
-> descriptor is invalid. Error!

Windows: NativeSerialEnginePrivate::nativeClose()
-> descriptor is invalid. Error!


не знает чего закрывать :wacko:
kuzulis
Хм... Вот я сделал пример, который открывает и закрывает порт. У меня все нормально.

Раскрывающийся текст

Cnt = 2
Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> trying to open device: "COM3"

Windows: NativeSerialEnginePrivate::detectDefaultFlowControl()
-> undefined flow, this->cc.dcb.fOutxCtsFlow is: 0 , this->cc.dcb.fRtsControl
is: 1 , this->cc.dcb.fInX is: 0 , this->cc.dcb.fOutX is: 0

Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> opened device: "COM3" in mode: 3 succesfully. Ok!

Serial device "COM3" open in 3
= Default parameters =
Device name : "COM3"
Baud rate : "1200 baud"
Data bits : "7 bit"
Parity : "None"
Stop bits : "1"
Flow : "Flow control undefined"
Char timeout, msec : 10
= New parameters =
Device name : "COM3"
Baud rate : "115200 baud"
Data bits : "8 bit"
Parity : "None"
Stop bits : "1"
Flow : "Disable"
Char timeout, msec : 50
Serial device "COM3" is closed
Cnt = 1
Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> trying to open device: "COM3"

Windows: NativeSerialEnginePrivate::detectDefaultFlowControl()
-> undefined flow, this->cc.dcb.fOutxCtsFlow is: 0 , this->cc.dcb.fRtsControl
is: 1 , this->cc.dcb.fInX is: 0 , this->cc.dcb.fOutX is: 0

Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> opened device: "COM3" in mode: 3 succesfully. Ok!

Serial device "COM3" open in 3
= Default parameters =
Device name : "COM3"
Baud rate : "1200 baud"
Data bits : "7 bit"
Parity : "None"
Stop bits : "1"
Flow : "Flow control undefined"
Char timeout, msec : 10
= New parameters =
Device name : "COM3"
Baud rate : "115200 baud"
Data bits : "8 bit"
Parity : "None"
Stop bits : "1"
Flow : "Disable"
Char timeout, msec : 50
Serial device "COM3" is closed
Cnt = 0
Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> trying to open device: "COM3"

Windows: NativeSerialEnginePrivate::detectDefaultFlowControl()
-> undefined flow, this->cc.dcb.fOutxCtsFlow is: 0 , this->cc.dcb.fRtsControl
is: 1 , this->cc.dcb.fInX is: 0 , this->cc.dcb.fOutX is: 0

Windows: NativeSerialEnginePrivate::nativeOpen(AbstractSerial::OpenMode mode)
-> opened device: "COM3" in mode: 3 succesfully. Ok!

Serial device "COM3" open in 3
= Default parameters =
Device name : "COM3"
Baud rate : "1200 baud"
Data bits : "7 bit"
Parity : "None"
Stop bits : "1"
Flow : "Flow control undefined"
Char timeout, msec : 10
= New parameters =
Device name : "COM3"
Baud rate : "115200 baud"
Data bits : "8 bit"
Parity : "None"
Stop bits : "1"
Flow : "Disable"
Char timeout, msec : 50
Serial device "COM3" is closed


Я прикрепил проект для теста. Попробуйте его у себя и воспроизведите в этом тесте вашу проблему.
kuzulis
а добавте в :
bool NativeSerialEnginePrivate::nativeClose()
{
....
....
....
    
    qDebug() << "closeResult = " << closeResult;// ВОТ ЭТО ДОБАВТЕ!
    return closeResult;
}

что будет выводить в консоль?
panbaraban
closeResult=true
kuzulis
Ну значит какой-то касяк: с ОС или самим железом (портом) или драйвером порта, имхо
panbaraban
печально, а QextSerialPort корректно работает.
kuzulis
Да.. Странно всё это.

Можно попробовать перед закрытием дескриптора порта (т.е. перед CloseHandle(Handle)) вставить ф-ю: CancelIo(Handle) по аналогии с QextSerialPort и посмотреть что будет. Если вам не трудно - то попробуйте и отпишитесь.
panbaraban
Помогло!!!
добавляем ::CancelIo(this->hd); перед if (::CloseHandle(this->hd) == 0) в bool NativeSerialEnginePrivate::nativeClose()
kuzulis
Итак, я обновил на fireforge.net SVN с учетом послелних постов, а также подчистил и исправил код (где возможно).

Качать так: svn checkout svn://scm.fireforge.net/svnroot/qserialdevice
juvf
не заработал qserialdevice месячной давности. Библиотека собралась, а в свой проект не смог прикрутить. Сегодня из svn сделал новый checkout.
Теперь вообще не собирается библиотека.

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

D:\Work\qt\serportN\trunk>qmake BuildIntegratedLibrary.pro

D:\Work\qt\serportN\trunk>mingw32-make
makefile:287: warning: overriding commands for target `build/lib/qintegratedseri
aldevice/obj/winregkeyreader.o'
makefile:272: warning: ignoring old commands for target `build/lib/qintegratedse
rialdevice/obj/winregkeyreader.o'
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_DEBUG -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"c:\Qt\2010.01\qt\include\QtCo
re" -I"c:\Qt\2010.01\qt\include" -I"qserialdevice" -I"qserialdeviceinfo" -I"qser
ialdeviceinfo" -I"qserialdeviceinfo" -I"qserialdevicewatcher" -I"c:\Qt\2010.01\q
t\include\ActiveQt" -I"build\lib\qintegratedserialdevice\moc" -I"c:\Qt\2010.01\q
t\mkspecs\default" -o build\lib\qintegratedserialdevice\obj\abstractserial.o qse
rialdevice\abstractserial.cpp
qserialdevice\abstractserial.cpp:1: error: stray '\239' in program
qserialdevice\abstractserial.cpp:1: error: stray '\187' in program
qserialdevice\abstractserial.cpp:1: error: stray '\191' in program
mingw32-make: *** [build/lib/qintegratedserialdevice/obj/abstractserial.o] Error
1

D:\Work\qt\serportN\trunk>


Что я делаю не так?

ps qt4.6.1

Litkevich Yuriy
Цитата(Гость_juvf_* @ 17.6.2010, 12:59) *
qserialdevice\abstractserial.cpp:1: error: stray '\239' in program
это на начало файла показывает, стало быть кодировка файла не правильная - UTF-8 c маркером, а надо без маркера (UTF-8 without BOM).

kuzulis, перекодируй файлы
kuzulis
Цитата
kuzulis, перекодируй файлы


Ок. Этот долбанный QtCreator меня достал! Я замучался уже перекодировать!
По-ходу придется Ru комментарии вообще убрать и оставить только En шоб не мучатся!
Гость
Цитата(Litkevich Yuriy @ 17.6.2010, 9:24) *
Цитата(Гость_juvf_* @ 17.6.2010, 12:59) *
qserialdevice\abstractserial.cpp:1: error: stray '\239' in program
это на начало файла показывает, стало быть кодировка файла не правильная - UTF-8 c маркером, а надо без маркера (UTF-8 without BOM).

kuzulis, перекодируй файлы


В общем ни чего не перекодировал, просто открыл проект и QTCreator-e и собрал проект. проект собрался, но с 2-мя варнингами
D:/Work/qt/serportM/trunk/makefile:287: warning: overriding commands for target `build/lib/qintegratedserialdevice/obj/winregkeyreader.o'
D:/Work/qt/serportM/trunk/makefile:272: warning: ignoring old commands for target `build/lib/qintegratedserialdevice/obj/winregkeyreader.o'


как варнинги победить?
kuzulis
Цитата
В общем ни чего не перекодировал, просто открыл проект и QTCreator-e и собрал проект. проект собрался, но с 2-мя варнингами

Понятно, а чем до этого и как собирали?

Цитата
как варнинги победить?

Да пока никак. Они не мешают.
Гость
Цитата(kuzulis @ 17.6.2010, 10:48) *
Понятно, а чем до этого и как собирали?


ээээ,,,, до чего "до этого"? тот что я смог месячной давности собрать? или до того как последний релиз собрал без перекодировки? Вообщем в обоих случаях собирал также как в 94-ом сообщении.
в Windows XP в шеле (cmd.exe). с помощью qt4.6.1 и mingw32-make. Но месяц назад всё собралось из шела, а последний релиз только из креатора.

ps

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\Прог>qmake -v
QMake version 2.01a
Using Qt version 4.6.1 in C:/Qt/2010.01/qt/lib

C:\Documents and Settings\Прог>mingw32-make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32

C:\Documents and Settings\Прог>

ну если нужно могу и кофигурацию компа скинуть ;)
kuzulis
Цитата
в Windows XP в шеле (cmd.exe). с помощью qt4.6.1 и mingw32-make. Но месяц назад всё собралось из шела, а последний релиз только из креатора.

вот только это я и хотел узнать
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.