Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ QtSerialPort

Автор: lkslks 18.10.2012, 8:40

При сборке получаю такое сообщение:
....
g++ -Wl,-s -o release\libSerialPort.a release/serialport.o release/serialportinfo.o release/serialport_win.o release/serialportinfo_win.o
-L".\lib" -L"c:\Qt\4.8.3\lib" -lsetupapi -ladvapi32 -lQtCore4
c:/qt/qtcreator-2.5.2/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16' collect2: ld returned 1 exit status
-------------------
Qt 4.8.3
MinGW 4.4.0
Кто может прояснить ситуацию ?

Автор: kuzulis 18.10.2012, 12:16

Все отлично собирается. Смотри проблему у себя со своей Qt и MinGw.

Автор: iReset 18.10.2012, 12:37

Добавь в .pro-файл строки

TEMPLATE = lib
CONFIG += staticlib


Виноват, ерунду написал.

Автор: RazrFalcon 18.10.2012, 15:21

Аналогичная проблема.

Лог сборки:

Раскрывающийся текст
15:19:50: Выполняется сборка проекта serialport...
15:19:51: Запускается: «c:\qtsdk\desktop\qt\4.8.1\mingw\bin\qmake.exe» C:\Users\razr\Desktop\qserialdevice-qserialdevice\serialport.pro -r -spec win32-g++ "CONFIG+=release"
Reading C:/Users/razr/Desktop/qserialdevice-qserialdevice/src/src.pro [C:/Users/razr/Desktop/serialport-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_______/src]
15:19:52: Процесс «c:\qtsdk\desktop\qt\4.8.1\mingw\bin\qmake.exe» завершился нормально.
15:19:52: Запускается: «C:\QtSDK\mingw\bin\mingw32-make.exe»
cd src\ && C:/QtSDK/mingw/bin/mingw32-make.exe -f Makefile
mingw32-make.exe[1]: Entering directory `C:/Users/razr/Desktop/serialport-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_______/src'
C:/QtSDK/mingw/bin/mingw32-make.exe -f Makefile.Release
mingw32-make.exe[2]: Entering directory `C:/Users/razr/Desktop/serialport-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_______/src'
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DSERIALPORT_BUILD -DSERIALPORT_SHARED -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore" -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include" -I"..\..\qserialdevice-qserialdevice\include" -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\ActiveQt" -I"release" -I"..\..\qserialdevice-qserialdevice\src" -I"." -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\mkspecs\win32-g++" -o release\serialport.o ..\..\qserialdevice-qserialdevice\src\serialport.cpp
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DSERIALPORT_BUILD -DSERIALPORT_SHARED -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore" -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include" -I"..\..\qserialdevice-qserialdevice\include" -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\ActiveQt" -I"release" -I"..\..\qserialdevice-qserialdevice\src" -I"." -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\mkspecs\win32-g++" -o release\serialportinfo.o ..\..\qserialdevice-qserialdevice\src\serialportinfo.cpp
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DSERIALPORT_BUILD -DSERIALPORT_SHARED -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore" -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include" -I"..\..\qserialdevice-qserialdevice\include" -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\ActiveQt" -I"release" -I"..\..\qserialdevice-qserialdevice\src" -I"." -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\mkspecs\win32-g++" -o release\serialportengine_p_win.o ..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp
In file included from ..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:45:
..\..\qserialdevice-qserialdevice\src\/serialportengine_p_win.h:17:50: error: QtCore/private/qwineventnotifier_p.h: No such file or directory
In file included from ..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:45:
..\..\qserialdevice-qserialdevice\src\/serialportengine_p_win.h:65: error: expected class-name before ',' token
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp: In destructor 'virtual WinSerialPortEngine::~WinSerialPortEngine()':
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:140: error: 'setEnabled' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp: In member function 'virtual bool WinSerialPortEngine::isReadNotificationEnabled() const':
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:879: error: 'isEnabled' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp: In member function 'virtual bool WinSerialPortEngine::isWriteNotificationEnabled() const':
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:925: error: 'isEnabled' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp: In member function 'virtual bool WinSerialPortEngine::event(QEvent*)':
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:1175: error: 'QWinEventNotifier' has not been declared
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp: In member function 'bool WinSerialPortEngine::createEvents(bool, bool)':
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:1210: error: 'setHandle' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp: In member function 'void WinSerialPortEngine::setMaskAndActivateEvent()':
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:1246: error: 'isEnabled' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:1247: error: 'setEnabled' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:1250: error: 'isEnabled' was not declared in this scope
..\..\qserialdevice-qserialdevice\src\serialportengine_p_win.cpp:1251: error: 'setEnabled' was not declared in this scope
mingw32-make.exe[2]: Leaving directory `C:/Users/razr/Desktop/serialport-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_______/src'
mingw32-make.exe[1]: Leaving directory `C:/Users/razr/Desktop/serialport-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_______/src'
mingw32-make.exe[2]: *** [release/serialportengine_p_win.o] Error 1
mingw32-make.exe[1]: *** [release] Error 2
mingw32-make.exe: *** [sub-src-make_default] Error 2
15:20:03: Процесс «C:\QtSDK\mingw\bin\mingw32-make.exe» завершился с кодом 2.
Возникла ошибка при сборке проекта serialport (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»

Автор: kuzulis 18.10.2012, 15:56

Цитата
Аналогичная проблема.


Во 1: Это не QtSerialPort а QSerialDevice.
Во 2: Не аналогичная проблема:
Цитата
..\..\qserialdevice-qserialdevice\src\/serialportengine_p_win.h:17:50: error: QtCore/private/qwineventnotifier_p.h: No such file or directory

Эта проблема уже стопитсотраз обсуждалась: нжно взять qwineventnotifier_p.h из сорцов Qt.
Гугл в помощь.
В 3: QSerialDevice больше не поддерживается, поэтому исправляйте баги сами.

Автор: RazrFalcon 18.10.2012, 16:49

Так кого лучше использовать?
QtSerialPort или QSerialDevice?

Автор: kuzulis 18.10.2012, 18:42

Цитата
QtSerialPort или QSerialDevice?

Почитай http://qt-project.org/wiki/QtSerialPort_Russian и http://www.prog.org.ru/topic_9537_0.html

Автор: lkslks 18.10.2012, 19:01

QSerialDevice уже не поддерживается, вместо него QtSerialPort.
Подробности и исходники здесь: http://qt-project.org/wiki/QtSerialPort
Вот рекомендуемый процесс сборки с этого сайта:

для Qt4:

mkdir serialport-build-release
cd serialport-build-release
qmake ../serialport-src/serialport.pro CONFIG+=release
make (or nmake)
cd ..
mkdir serialport-build-debug
cd serialport-build-debug
qmake ../serialport-src/serialport.pro //or can add CONFIG+=debug
make (or nmake)
cd ..

cd serialport-build-release // install release build
make install (or nmake install)
cd ..
cd serialport-build-debug // install debug build
make install (or nmake install)

При выполнении nmake появлялась ошибка с отсутствием WinMain@16, описанная в начале темы.
После изменения строки qmake ........... на
qmake ../serialport-src/serialport.pro CONFIG+=release CONFIG+=DLL ошибка исчезла.
Правда, осталась проблемка с отсутствием одного файла при компиляции примера Terminal, с этим разберусь чуть позже.
Да, библиотека собралась и нормально вызывается.
Буду тестировать дальше.

Автор: RazrFalcon 18.10.2012, 19:03

Почитал. Понял.

Автор: lkslks 19.10.2012, 8:51

1. Проект QtSeriallPort скомпилировался после добавления CONFIG += DLL. Подозреваю, что виноваты настройки версии Qt4.8.3 (у меня).

2. Не скомпилировался пример Terminal. Выяснил, что причина в том, что не собирается файл ресурсов из terminal.qrc в файл qrc_terminal.cpp.
Пробовал подключать ресурсы в QtCreator 2.5.2. Не получается, тот же результат, даже с тестовым проектом. Решил, что у меня QtCreator неверно настроен.
Создал файл вручную командой "rcc -o qrc_terminal.cpp terminal.qrc" и подсунул куда надо, пример скомпилировался и заработал.

Есть ли у кого какие идеи по неработающим ресурсам ? Подозреваю настройки Qt4.8.3, но опыта не хватает найти причину.

PS: Ресурсы, конечно не главное в данном проекте.

Автор: kuzulis 19.10.2012, 9:59

@lkslks

Qt4.8.3 сам собирал или качал готовые бинарики под MinGW 4.4 http://releases.qt-project.org/qt4/source/qt-win-opensource-4.8.3-mingw.exe?

Автор: lkslks 20.10.2012, 4:10

Цитата(kuzulis @ 19.10.2012, 12:59) *
@lkslks

Qt4.8.3 сам собирал или качал готовые бинарики под MinGW 4.4 http://releases.qt-project.org/qt4/source/qt-win-opensource-4.8.3-mingw.exe?


Да, качал готовые.

Автор: lkslks 20.10.2012, 6:39

У кого есть идеи по неработающим ресурсам в Qt Creator 2.5.2 и Qt4.8.3 ?
Просто в проекте создаю ресурс с картинкой и программа не компилируется.
Может работа rcc.exe где-то не прописана ?

Автор: Гость 1.11.2012, 17:47

Цитата(lkslks @ 20.10.2012, 6:39) *
У кого есть идеи по неработающим ресурсам в Qt Creator 2.5.2 и Qt4.8.3 ?
Просто в проекте создаю ресурс с картинкой и программа не компилируется.
Может работа rcc.exe где-то не прописана ?

Цитата(lkslks @ 20.10.2012, 6:39) *
У кого есть идеи по неработающим ресурсам в Qt Creator 2.5.2 и Qt4.8.3 ?
Просто в проекте создаю ресурс с картинкой и программа не компилируется.
Может работа rcc.exe где-то не прописана ?


это бага 4.8.3
нужно добавить в pro-файл строчку
QMAKE_RCC = $$[QT_INSTALL_BINS]/rcc.exe

Автор: lkslks 2.11.2012, 5:18

Да, решение верное, проверил, работает.
Но в моём случае всё оказалось проще.
Нужно в системной переменной PATH или в настройках проекта прописать путь c:\Qt\4.8.3.
Именно к верхнему уровню, а не только к папке bin. Потому что Qt пытается запустить RCC.EXE из подкаталога bin.
Это прописано в файлах Makefile/Debug и Makefile/Release, которые создаются при открытии проекта в QtCreator.
В файле c:\Qt\4.8.3\configure.exe нашёл следующее QMAKE_RCC = $$QT_BUILD_TREE...bin/rcc.exe.
А сюда это попало, возможно, из файла c:\Qt\4.8.3\configure (QT_INSTALL_BINS="$QT_INSTALL_PREFIX/bin"),
и, возможно, при установке. В общем, можно, конечно, и дальше копать, но решение найдено, смысл понятен.
Удачи всем, спасибо за помощь.

Автор: asket 14.1.2013, 11:26

kuzulis, У меня к Вам вот такой вопрос, я использую в своем проекте библиотеку QtSerialPort под Windows, все работает и все замечательно, если бы не одно НО. Оно заключается в следующем, при первом запуске своего приложения, функция open открывает порт, однако поступаемые данные почему-то Ваша библиотека не видит (используется write и waitForReadyRed(), read), чтобы привести в нормальное состояние, мне приходится принудительно закрывать порт с помошью close, запускать любую терминалку (terraterm или hyperterminal), а после можно будет открывать порт и работать. Хотелось бы понять как решить эту проблему? QtLib 4.8, QtSDK 1.2, кстати со старой библиотекой QserialDevice аналогичных проблем не было.

Автор: lkslks 15.1.2013, 4:44

Рекомендую посмотреть пример Terminal в исходниках QtSerialPort.

Автор: Алексей1153 15.1.2013, 5:57

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

Автор: asket 15.1.2013, 13:53

Алексей1153, в том то и дело что порт настроен соответствующим образом, скопировал кусок кода из примера terminal,
какие еще настройки влияют на работу приложения?

    if (m_Port->isOpen())
        m_Port->close();

    sleep(1);

    m_Port->setDataBits(SerialPort::Data8);
    m_Port->setRate(SerialPort::Rate115200);
    m_Port->setParity(SerialPort::NoParity);
    m_Port->setStopBits(SerialPort::OneStop);
    m_Port->setFlowControl(SerialPort::NoFlowControl);
    
    if (!m_Port->open(QIODevice::ReadWrite)){
        return ErrPortNotOpen;
    }

Автор: Алексей1153 15.1.2013, 19:30

там ещё по меньшей мере 5 таймаутов точно нужно настроить. Описание параметров можно найти, к примеру, здесь


http://msdn.microsoft.com/en-us/library/aa363214%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa363190(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/aa363200(v=vs.85).aspx

Автор: kuzulis 15.1.2013, 20:28

Цитата(asket @ 15.1.2013, 14:53) *
Алексей1153, в том то и дело что порт настроен соответствующим образом, скопировал кусок кода из примера terminal,
какие еще настройки влияют на работу приложения?


Да неужели правильно скопировал?

Цитата(asket @ 15.1.2013, 14:53) *
    if (m_Port->isOpen())
        m_Port->close();

    sleep(1);

    m_Port->setDataBits(SerialPort::Data8);
    m_Port->setRate(SerialPort::Rate115200);
    m_Port->setParity(SerialPort::NoParity);
    m_Port->setStopBits(SerialPort::OneStop);
    m_Port->setFlowControl(SerialPort::NoFlowControl);
    
    if (!m_Port->open(QIODevice::ReadWrite)){
        return ErrPortNotOpen;
    }


Едрить-колотить! Да сколько же можно? Доколе все ВЫ будете повторять эти ошибки?
Ты делаешь все неправильно! Читай документацию!
Или, для начала, хотя-бы проверяй возвращаемые значения методов setXXX()!

PS: Блин, задолбали с такими вопросами

Автор: Litkevich Yuriy 16.1.2013, 15:57

Цитата(kuzulis @ 15.1.2013, 22:28) *
Едрить-колотить! Да сколько же можно? Доколе все ВЫ будете повторять эти ошибки?Ты делаешь все неправильно! Читай документацию! Или, для начала, хотя-бы проверяй возвращаемые значения методов setXXX()!PS: Блин, задолбали с такими вопросами
Денис, а это всё от неестественности, я тебе ещё на прогорге про это говрил.
Гораздо естественнее: создать объект, настроить, а потом использовать. Поэтому люди так и делают.

Автор: NAUGREEM 16.1.2013, 17:26

Здравствуйте!
Проблема тоже в винде (в линуксе всё работает)...
порт открываю так:

    SerialPort dev;
    dev.setPort(QString(port));
    bool res = dev.open(QIODevice::ReadWrite);
    if (!res)
    {
        return false;
    }
    if (res) res = dev.setRate(SerialPort::Rate9600);
    if (res) res = dev.setDataBits(SerialPort::Data8);
    if (res) res = dev.setParity(SerialPort::NoParity);
    if (res) res = dev.setStopBits(SerialPort::OneStop);
    if (res) res = dev.setFlowControl(SerialPort::NoFlowControl);
    if (!res)
    {
        dev.close();
        return false;
    }


далее пишу в порт строку байтов 'write()', а из порта 'read()' приходит в бесконечном цикле первый байт строки...
winXP|win7|win8 - одна беда((
на старой версии QtSerialPort такой проблемы в винде небыло

Автор: kuzulis 16.1.2013, 18:28

Цитата(NAUGREEM @ 16.1.2013, 18:26) *
далее пишу в порт строку байтов 'write()', а из порта 'read()' приходит в бесконечном цикле первый байт строки...
winXP|win7|win8 - одна беда((
на старой версии QtSerialPort такой проблемы в винде небыло


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

Автор: NAUGREEM 16.1.2013, 19:15

вот простой пример:

#include <QCoreApplication>
#include <QtAddOnSerialPort/serialport.h>

QT_USE_NAMESPACE_SERIALPORT

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    if (argc != 2) return -1;
    qDebug("port: %s", argv[1]);

    QByteArray id;
    SerialPort dev;
    dev.setPort(QString(argv[1]));
    bool res = dev.open(QIODevice::ReadWrite);
    if (!res)
    {
        return -1;
    }
    if (res) res = dev.setRate(SerialPort::Rate9600);
    if (res) res = dev.setDataBits(SerialPort::Data8);
    if (res) res = dev.setParity(SerialPort::NoParity);
    if (res) res = dev.setStopBits(SerialPort::OneStop);
    if (res) res = dev.setFlowControl(SerialPort::NoFlowControl);
    if (!res)
    {
        dev.close();
        return -1;
    }
    dev.write(QByteArray(2, 0x90));
    dev.write(QByteArray(1, 0x26));
    for (int i = 0; i < 100; i++)
    {
        if (dev.bytesAvailable() > 0)
        {
            id.append(dev.read(1));
            qDebug("Read IDa: %x", (uchar)id.right(1).data()[0]);
        }
        else
        {
            if (dev.waitForReadyRead(100))
            {
                id.append(dev.read(1));
                qDebug("Read IDw: %x", (uchar)id.right(1).data()[0]);
            }
            else break;
        }
        if (id[id.length() - 1] == (char)0) break;
    }
    dev.close();


    return a.exec();
}


запущен на winXP SP3, qt-4.8.4, MinGW-w64 - for 32 bit Windows (gcc-4.7.1)

Автор: kuzulis 16.1.2013, 20:05

Цитата(NAUGREEM @ 16.1.2013, 20:15) *
вот простой пример:
...
...
...
запущен на winXP SP3, qt-4.8.4, MinGW-w64 - for 32 bit Windows (gcc-4.7.1)


И опять же, ты тоже неправильно используешь библиотеку.

В твоем случае см. в сторону примера BlockingMaster и внимательно читай комментарии в нем (точнее в qtserialport\doc\src\examples\).

Автор: NAUGREEM 17.1.2013, 13:22

Экспериментируя с кодом заметил забавную вещь:

если строку

if (dev.bytesAvailable() > 0)

заменить на
if (dev.bytesAvailable() - 512 > 0)

то всё отлично работает

отсюда вопрос: почему в виндовсе при пустом буфере чтения функция bytesAvailable() возвращает 512?

Автор: kuzulis 17.1.2013, 17:03

Цитата(NAUGREEM @ 17.1.2013, 14:22) *
отсюда вопрос: почему в виндовсе при пустом буфере чтения функция bytesAvailable() возвращает 512?


Не знаю, не может такого быть.

Слинкуй статически исходники библиотеки с твоим приложением через "serialport-lib.pri" и пробегись дебаггером.

Автор: NAUGREEM 17.1.2013, 19:27

что-то не собирается((

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

g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -fexceptions -mthreads -Wall -Wextra -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I'../../Qt/4.8.4/include/QtCore' -I'../../Qt/4.8.4/include' -I'../qtserialport/src/serialport' -I'../../Qt/4.8.4/inc
../qtserialport/src/serialport/serialport.cpp:382:1: warning: 'QtAddOn::SerialPort::SerialPort::SerialPort(QObject*)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:393:1: warning: 'QtAddOn::SerialPort::SerialPort::SerialPort(const QString&, QObject*)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:405:1: warning: 'QtAddOn::SerialPort::SerialPort::SerialPort(const QtAddOn::SerialPort::SerialPortInfo&, QObject*)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:415:1: warning: 'virtual QtAddOn::SerialPort::SerialPort::~SerialPort()' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:430:6: warning: 'void QtAddOn::SerialPort::SerialPort::setPort(const QString&)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
../qtserialport/src/serialport/serialport.cpp:441:6: warning: 'void QtAddOn::SerialPort::SerialPort::setPort(const QtAddOn::SerialPort::SerialPortInfo&)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
../qtserialport/src/serialport/serialport.cpp:483:9: warning: 'QString QtAddOn::SerialPort::SerialPort::portName() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:500:6: warning: 'virtual bool QtAddOn::SerialPort::SerialPort::open(QIODevice::OpenMode)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:530:6: warning: 'virtual void QtAddOn::SerialPort::SerialPort::close()' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
../qtserialport/src/serialport/serialport.cpp:553:6: warning: 'void QtAddOn::SerialPort::SerialPort::setRestoreSettingsOnClose(bool)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:568:6: warning: 'bool QtAddOn::SerialPort::SerialPort::restoreSettingsOnClose() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:599:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setRate(qint32, QtAddOn::SerialPort::SerialPort::Directions)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:613:8: warning: 'qint32 QtAddOn::SerialPort::SerialPort::rate(QtAddOn::SerialPort::SerialPort::Direction
s) const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:638:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setDataBits(QtAddOn::SerialPort::SerialPort::Da
taBits)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:649:22: warning: 'QtAddOn::SerialPort::SerialPort::DataBits QtAddOn::SerialPort::SerialPort::dataBits() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:672:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setParity(QtAddOn::SerialPort::SerialPort::Pari
ty)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:683:20: warning: 'QtAddOn::SerialPort::SerialPort::Parity QtAddOn::SerialPort::SerialPort::parity() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:705:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setStopBits(QtAddOn::SerialPort::SerialPort::St
opBits)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:716:22: warning: 'QtAddOn::SerialPort::SerialPort::StopBits QtAddOn::SerialPort::SerialPort::stopBits() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:738:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setFlowControl(QtAddOn::SerialPort::SerialPort:
:FlowControl)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:749:25: warning: 'QtAddOn::SerialPort::SerialPort::FlowControl QtAddOn::SerialPort::SerialPort::flowControl() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:773:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setDtr(bool)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:784:6: warning: 'bool QtAddOn::SerialPort::SerialPort::dtr() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:809:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setRts(bool)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:820:6: warning: 'bool QtAddOn::SerialPort::SerialPort::rts() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:844:19: warning: 'QtAddOn::SerialPort::SerialPort::Lines QtAddOn::SerialPort::SerialPort::lines() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:864:6: warning: 'bool QtAddOn::SerialPort::SerialPort::flush()' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:876:6: warning: 'bool QtAddOn::SerialPort::SerialPort::clear(QtAddOn::SerialPort::SerialPort::Directio
ns)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:907:6: warning: 'virtual bool QtAddOn::SerialPort::SerialPort::atEnd() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:921:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setDataErrorPolicy(QtAddOn::SerialPort::SerialP
ort::DataErrorPolicy)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:934:29: warning: 'QtAddOn::SerialPort::SerialPort::DataErrorPolicy QtAddOn::SerialPort::SerialPort::dataErrorPolicy() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:962:23: warning: 'QtAddOn::SerialPort::SerialPort::PortError QtAddOn::SerialPort::SerialPort::error() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:968:6: warning: 'void QtAddOn::SerialPort::SerialPort::clearError()' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
../qtserialport/src/serialport/serialport.cpp:993:8: warning: 'qint64 QtAddOn::SerialPort::SerialPort::readBufferSize() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1015:6: warning: 'void QtAddOn::SerialPort::SerialPort::setReadBufferSize(qint64)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1027:6: warning: 'virtual bool QtAddOn::SerialPort::SerialPort::isSequential() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1037:8: warning: 'virtual qint64 QtAddOn::SerialPort::SerialPort::bytesAvailable() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1050:8: warning: 'virtual qint64 QtAddOn::SerialPort::SerialPort::bytesToWrite() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1062:6: warning: 'virtual bool QtAddOn::SerialPort::SerialPort::canReadLine() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1080:6: warning: 'virtual bool QtAddOn::SerialPort::SerialPort::waitForReadyRead(int)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1088:6: warning: 'virtual bool QtAddOn::SerialPort::SerialPort::waitForBytesWritten(int)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1107:6: warning: 'bool QtAddOn::SerialPort::SerialPort::sendBreak(int)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1121:6: warning: 'bool QtAddOn::SerialPort::SerialPort::setBreak(bool)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
../qtserialport/src/serialport/serialport.cpp:1129:8: warning: 'virtual qint64 QtAddOn::SerialPort::SerialPort::readData(char*, qint64)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1137:8: warning: 'virtual qint64 QtAddOn::SerialPort::SerialPort::readLineData(char*, qint64)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
../qtserialport/src/serialport/serialport.cpp:1144:8: warning: 'virtual qint64 QtAddOn::SerialPort::SerialPort::writeData(const char*, qint64)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
In file included from ../qtserialport/src/serialport/serialport.cpp:1161:0:.
debug/moc_serialport.cpp:191:6: warning: 'static void QtAddOn::SerialPort::SerialPort::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
debug/moc_serialport.cpp:228:40: warning: 'QtAddOn::SerialPort::SerialPort::staticMetaObjectExtraData' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
debug/moc_serialport.cpp:232:31: warning: 'QtAddOn::SerialPort::SerialPort::staticMetaObject' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:241:20: warning: 'virtual const QMetaObject* QtAddOn::SerialPort::SerialPort::metaObject() const' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
debug/moc_serialport.cpp:246:7: warning: 'virtual void* QtAddOn::SerialPort::SerialPort::qt_metacast(const char*)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
debug/moc_serialport.cpp:254:5: warning: 'virtual int QtAddOn::SerialPort::SerialPort::qt_metacall(QMetaObject::Call, int, void**)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes].
debug/moc_serialport.cpp:315:6: warning: 'void QtAddOn::SerialPort::SerialPort::rateChanged(qint32, QtAddOn::SerialPort::SerialPort::Directions)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
In file included from ../qtserialport/src/serialport/serialport.cpp:1161:0:.
debug/moc_serialport.cpp:322:6: warning: 'void QtAddOn::SerialPort::SerialPort::dataBitsChanged(QtAddOn::SerialPort::SerialPort
::DataBits)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:329:6: warning: 'void QtAddOn::SerialPort::SerialPort::parityChanged(QtAddOn::SerialPort::SerialPort::
Parity)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:336:6: warning: 'void QtAddOn::SerialPort::SerialPort::stopBitsChanged(QtAddOn::SerialPort::SerialPort
::StopBits)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:343:6: warning: 'void QtAddOn::SerialPort::SerialPort::flowControlChanged(QtAddOn::SerialPort::SerialP
ort::FlowControl)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:350:6: warning: 'void QtAddOn::SerialPort::SerialPort::dataErrorPolicyChanged(QtAddOn::SerialPort::Ser
ialPort::DataErrorPolicy)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:357:6: warning: 'void QtAddOn::SerialPort::SerialPort::dtrChanged(bool)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:364:6: warning: 'void QtAddOn::SerialPort::SerialPort::rtsChanged(bool)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:371:6: warning: 'void QtAddOn::SerialPort::SerialPort::errorChanged(QtAddOn::SerialPort::SerialPort::P
ortError)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
debug/moc_serialport.cpp:378:6: warning: 'void QtAddOn::SerialPort::SerialPort::restoreSettingsOnCloseChanged(bool)' redeclared without dllimport attribute after being referenced with dll linkage [enabled by default].
In file included from ../qtserialport/src/serialport/serialport.cpp:1161:0:.
debug/moc_serialport.cpp:228:28: error: definition of static data member 'QtAddOn::SerialPort::SerialPort::staticMetaObjectExtraData' of dllimport'd class.
mingw32-make[1]: Leaving directory `C:/projects/TestSerialPort-build-Debug'.
mingw32-make[1]: *** [debug/serialport.o] Error 1.
mingw32-make: *** [debug] Error 2


.pro
QT       += core
QT       -= gui
include(../qtserialport/src/serialport/serialport-lib.pri)
TARGET = TestSerialPort
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp

Автор: kuzulis 17.1.2013, 20:02

Там в "serialport-global.h" надо закомментировать Q_DECL_XXX дефайны:

#if defined(QT_SERIALPORT_LIB)
#  define Q_SERIALPORT_EXPORT //Q_DECL_EXPORT
#else
#  define Q_SERIALPORT_EXPORT //Q_DECL_IMPORT
#endif

Автор: NAUGREEM 18.1.2013, 11:49

спасибо, собрал...

заметил такой момент:
в unix варианте после чтения из порта есть такая строка:

readBuffer.chop(bytesToRead - qMax(readBytes, qint64(0)));

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

складывается впечатление, что кто-то что-то для венды недоделал, или я взял исходник не и того места...

Автор: kuzulis 18.1.2013, 15:15

Цитата(NAUGREEM @ 18.1.2013, 12:49) *
складывается впечатление, что кто-то что-то для венды недоделал, или я взял исходник не и того места...


Да, есть касячок в реализации bytesAvailable() для винды.
Нужно чтобы он возвращал не размер буфера, а переменную actualReadBufferSize.

Автор: kuzulis 19.1.2013, 20:46

Вроде исправил, обновись.

Автор: NAUGREEM 24.1.2013, 14:50

Цитата(kuzulis @ 19.1.2013, 21:46) *
Вроде исправил, обновись.


обновил - заработало...
спасибо за оперативность)

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

Автор: kuzulis 24.1.2013, 21:04

обновись еще раз, сегодня был коммит на исправление clear():

https://codereview.qt-project.org/#change,45274

Автор: NAUGREEM 5.2.2013, 12:32

Доброго всем!

Заметил такую штуку:

когда

dev.write(wbuf);
dev.waitForBytesWritten(100);

то
dev.waitForReadyRead(100); == тру
dev.bytesAvailable(); > 0


а когда
dev.write(wbuf);
dev.waitForBytesWritten(100);
msleep(50);

то
dev.waitForReadyRead(100); == фолс
dev.bytesAvailable(); == 0


qt4.8.4 Linux
всё делается в отдельном потоке...

вопрос: куда деваются прочитанные данные во время сна?

Автор: NAUGREEM 5.2.2013, 13:24

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

Автор: NAUGREEM 13.3.2013, 23:01

Доброго всем!
Заметил недавно проблему - на USB-UART Com порте связь без проблем, а на Bluetooth Com порте порт отрывается не всегда, и в ErrorString пишет "отказано в доступе"...
Пробовал терминалкой - никаких проблем... открывает порт всегда с первого раза и не теряет связь, а если с помошью QtSerialPort - то через некоторое время (в пределах минуты) оказывается, что открытый порт уже свободен...
Кто-нибудь сталкивался с такой проблемой?
Может с блютузом надо как-то по особенному работать?

библиотеку брал из Git 10-го марта...
Qt 4.8.4, mingw32 (gcc-4.7)

Автор: Алексей1153 14.3.2013, 7:16

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




Автор: NAUGREEM 14.3.2013, 12:28

Цитата(Алексей1153 @ 14.3.2013, 8:16) *
NAUGREEM, может, его периодически надо дрюкать - к примеру раз в полминуты, если не было активности, принудительно пишем или читаем 0 байтов


Интересно - создатели терминалки так же делали?

Автор: kuzulis 14.3.2013, 13:31

NAUGREEM,

А ты установи сниффер (например Free Serial Port Monitor) и проверь.

Автор: Алексей1153 14.3.2013, 14:22

Цитата(NAUGREEM @ 14.3.2013, 15:28) *
Интересно - создатели терминалки так же делали?


а про какую именно речь ?

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

Автор: NAUGREEM 15.3.2013, 12:40

Цитата(kuzulis @ 14.3.2013, 14:31) *
NAUGREEM,

А ты установи сниффер (например Free Serial Port Monitor) и проверь.


посмотрел:
в терминалке:
Порт открыт процессом "tcomu12.exe" (PID: 2540)
Запрос:15.03.2013 9:27:31.20364
FF FF FF                                          ÿÿÿ
Ответ:15.03.2013 9:27:39.25064 (+0.0469 seconds)
FF FF FF                                          ÿÿÿ
Порт закрыт

у меня:
Порт открыт процессом "cms.exe" (PID: 2416)
Порт закрыт
Порт открыт процессом "cms.exe" (PID: 2416)
Порт закрыт
Порт открыт процессом "cms.exe" (PID: 2416)
Порт закрыт
Порт открыт процессом "cms.exe" (PID: 2416)
Порт закрыт
Порт открыт процессом "cms.exe" (PID: 2416)
Порт закрыт
Порт открыт процессом "cms.exe" (PID: 2416)
Порт закрыт
Порт открыт процессом "cms.exe" (PID: 2416)
Порт открыт процессом "cms.exe" (PID: 2416)
Запрос:15.03.2013 8:14:15.32764
FF                                                ÿ
Порт открыт процессом "cms.exe" (PID: 2416)
Порт открыт процессом "cms.exe" (PID: 2416)
FF FF                                             ÿÿ
Ответ:15.03.2013 8:14:16.74964 (+0.0156 seconds)
FF FF FF                                          ÿÿÿ
Запрос:15.03.2013 8:14:16.87464 (+0.1094 seconds)
.....

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

Автор: kuzulis 15.3.2013, 12:45

Мож у тебя вирус какой или троян? :)
Чудес не бывает (с).

Цитата
Порт открыт процессом "cms.exe"


Это чей процесс?

Автор: NAUGREEM 15.3.2013, 13:23

Цитата(kuzulis @ 15.3.2013, 13:45) *
Мож у тебя вирус какой или троян? :)
Чудес не бывает (с).

голая винда в виртуалке - везде с этого диска ставил и антивирусы ниразу не ругались...

Цитата
Цитата
Порт открыт процессом "cms.exe"


Это чей процесс?


это моя прога с этой либой)

на разных компах с блютузом такая-же шняга(
по USB нормально...

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

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

таблицы системных вызовов:
в терминалке:
Раскрывающийся текст

,IRP_MJ_CREATE,DOWN,TRUE,0x0,74 00 63 00 6F 00 6D 00 75 00 31 00 32 00 2E 00 65 00 78 00 65 00 00 00 ,t.c.o.m.u.1.2...e.x.e...,
1,IRP_MJ_CREATE,UP,FALSE,0x0,,,
2,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
3,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,00 C2 01 00 ,.A..,
4,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
5,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
6,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
7,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
8,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
9,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
10,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,
11,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
12,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_CLR_RTS: Clear RTS),DOWN,FALSE,0x0,,,
13,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_CLR_RTS: Clear RTS),UP,FALSE,0x0,,,
14,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
15,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
16,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
17,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
18,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 11 13 ,......,
19,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
20,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,01 00 00 00 00 00 00 00 00 02 00 00 00 02 00 00 ,................,
21,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
22,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_PURGE: Purge requests),DOWN,TRUE,0x0,0F 00 00 00 ,....,
23,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_PURGE: Purge requests),UP,FALSE,0x0,,,
24,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_QUEUE_SIZE: Set queue size),DOWN,TRUE,0x0,00 08 00 00 00 08 00 00 ,........,
25,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_QUEUE_SIZE: Set queue size),UP,FALSE,0x0,,,
26,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_TIMEOUTS: Set timeouts),DOWN,TRUE,0x0,01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 0A 00 00 00 ,....................,
27,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_TIMEOUTS: Set timeouts),UP,FALSE,0x0,,,
28,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
29,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
30,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
31,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
32,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
33,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
....
1182,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1183,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1184,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1185,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1186,IRP_MJ_WRITE,DOWN,TRUE,0x0,FF ,y,
1187,IRP_MJ_WRITE,UP,TRUE,0x0,FF ,y,
1188,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1189,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1190,IRP_MJ_READ,DOWN,FALSE,0x0,,,
1191,IRP_MJ_READ,UP,TRUE,0x0,FF FF FF ,yyy,
1192,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1193,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1194,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1195,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1196,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1197,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1198,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1199,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
....
1292,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),DOWN,FALSE,0x0,,,
1293,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
1294,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
1295,IRP_MJ_CLOSE,UP,FALSE,0x0,,,

у меня:
Раскрывающийся текст

0,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
1,IRP_MJ_CREATE,UP,FALSE,0x0,,,
2,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
3,IRP_MJ_CLOSE,UP,FALSE,0x0,,,
4,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
5,IRP_MJ_CREATE,UP,FALSE,0x0,,,
6,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
7,IRP_MJ_CLOSE,UP,FALSE,0x0,,,
8,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
9,IRP_MJ_CREATE,UP,FALSE,0x0,,,
10,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
11,IRP_MJ_CLOSE,UP,FALSE,0x0,,,
12,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
13,IRP_MJ_CREATE,UP,FALSE,0x0,,,
14,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
15,IRP_MJ_CLOSE,UP,FALSE,0x0,,,
16,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
17,IRP_MJ_CREATE,UP,FALSE,0x0,,,
18,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
19,IRP_MJ_CLOSE,UP,FALSE,0x0,,,
20,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
21,IRP_MJ_CREATE,UP,FALSE,0x0,,,
22,IRP_MJ_CLOSE,DOWN,FALSE,0x0,,,
23,IRP_MJ_CLOSE,UP,FALSE,0x0,,,
24,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
25, IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
26, IRP_MJ_CREATE,UP,FALSE,0xc0000022,,,
27,IRP_MJ_CREATE,UP,FALSE,0x0,,,
28,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
29,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,00 C2 01 00 ,.A..,
30,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
31,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
32,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
33,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
34,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
35,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
36,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
37,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,00 C2 01 00 ,.A..,
38,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
39,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
40,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
41,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
42,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
43,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
44,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,00 C2 01 00 ,.A..,
45,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
46,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
47,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
48,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
49,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
50,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 00 00 ,......,
51,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
52,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
53,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
54,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_TIMEOUTS: Retrieve timeouts),DOWN,FALSE,0x0,,,
55,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_TIMEOUTS: Retrieve timeouts),UP,TRUE,0x0,00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,....................,
56,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_TIMEOUTS: Set timeouts),DOWN,TRUE,0x0,FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,yyyy................,
57,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_TIMEOUTS: Set timeouts),UP,FALSE,0x0,,,
58,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_WAIT_MASK: Set current event mask),DOWN,TRUE,0x0,81 00 00 00 ,?...,
59,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_WAIT_MASK: Set current event mask),UP,FALSE,0x0,,,
60,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK: Wait for event),DOWN,FALSE,0x0,,,
61, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_MODEMSTATUS: Retrieve modem status),DOWN,FALSE,0x0,,,
62, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_MODEMSTATUS: Retrieve modem status),UP,TRUE,0x0,00 00 00 00 ,....,
63, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_DTRRTS: Retrieve DTR and RTS),DOWN,FALSE,0x0,,,
64, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_DTRRTS: Retrieve DTR and RTS),UP,TRUE,0x0,03 00 00 00 ,....,
65, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_MODEMSTATUS: Retrieve modem status),DOWN,FALSE,0x0,,,
66, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_MODEMSTATUS: Retrieve modem status),UP,TRUE,0x0,00 00 00 00 ,....,
67, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_DTRRTS: Retrieve DTR and RTS),DOWN,FALSE,0x0,,,
68, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_DTRRTS: Retrieve DTR and RTS),UP,TRUE,0x0,03 00 00 00 ,....,
69, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
70, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,00 C2 01 00 ,.A..,
71, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
72, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
73, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
74, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
75, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
76, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
77, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,
78, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
79, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
80, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
81, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
82, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
83, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 00 00 ,......,
84, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
85, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
86, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
87, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
88, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,80 25 00 00 ,?%..,
89, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
90, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
91, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
92, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
93, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
94, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
95, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,
96, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
97, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
98, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
99, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
100, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
101, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 00 00 ,......,
102, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
103, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
104, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
105, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
106, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,80 25 00 00 ,?%..,
107, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
108, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
109, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
110, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
111, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
112, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
113, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,
114, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
115, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
116, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
117, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
118, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
119, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 00 00 ,......,
120, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
121, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
122, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
123, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
124, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,80 25 00 00 ,?%..,
125, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
126, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
127, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
128, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
129, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
130, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
131, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,
132, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
133, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
134, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
135, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
136, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
137, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 00 00 ,......,
138, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
139, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
140, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
141, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,
142, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,80 25 00 00 ,?%..,
143, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,
144, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08 ,...,
145, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,
146, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00 00 00 ,......,
147, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,
148, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 ,....?...........,
149, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,
150, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,
151, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_CLR_RTS: Clear RTS),DOWN,FALSE,0x0,,,
152, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_CLR_RTS: Clear RTS),UP,FALSE,0x0,,,
153, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),DOWN,FALSE,0x0,,,
154, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_DTR: Set DTR),UP,FALSE,0x0,,,
155, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08 ,...,
156, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,
157, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 00 00 ,......,
158, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,
159, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,................,
160, IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,
161, IRP_MJ_WRITE,DOWN,TRUE,0x0,FF ,y,
162, IRP_MJ_WRITE,UP,TRUE,0x0,FF ,y,
163, IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
164, IRP_MJ_CREATE,UP,FALSE,0xc0000022,,,
165, IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
166, IRP_MJ_CREATE,UP,FALSE,0xc0000022,,,
167, IRP_MJ_WRITE,DOWN,TRUE,0x0,FF ,y,
168, IRP_MJ_WRITE,UP,TRUE,0x0,FF ,y,
169, IRP_MJ_WRITE,DOWN,TRUE,0x0,FF ,y,
170, IRP_MJ_WRITE,UP,TRUE,0x0,FF ,y,
171,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK: Wait for event),UP,TRUE,0x0,01 00 00 00 ,....,
172,IRP_MJ_READ,DOWN,FALSE,0x0,,,
173,IRP_MJ_READ,UP,TRUE,0x0,FF ,y,
174,IRP_MJ_READ,DOWN,FALSE,0x0,,,
175,IRP_MJ_READ,UP,FALSE,0x0,,,
176,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK: Wait for event),DOWN,FALSE,0x0,,,
177,IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK: Wait for event),UP,TRUE,0x0,01 00 00 00 ,....,
178,IRP_MJ_READ,DOWN,FALSE,0x0,,,
179,IRP_MJ_READ,UP,TRUE,0x0,FF FF ,yy,
180,IRP_MJ_READ,DOWN,FALSE,0x0,,,
181,IRP_MJ_READ,UP,FALSE,0x0,,,

и собственно мой код, который эти вызовы плодит:
    QSerialPort dev;
    dev.setPort(QString(port));
    bool res = false;
    for (int i = 0; i < 30; i++)
    {
        if (dev.open(QIODevice::ReadWrite))
        {
            res = true;
            break;
        }
        msleep(100);
    }
    if (!res) return;
    qDebug("port %s opened", port.data());
    if (res) res = dev.setBaudRate(QSerialPort::Baud9600);
    if (res) res = dev.setDataBits(QSerialPort::Data8);
    if (res) res = dev.setParity(QSerialPort::NoParity);
    if (res) res = dev.setStopBits(QSerialPort::OneStop);
    if (res) res = dev.setFlowControl(QSerialPort::NoFlowControl);
    if (!res)
    {
        dev.close();
        return;
    }
    QByteArray wbuf, rbuf;
    wbuf.append((char)0xff);
    for (int i = 0; i < 5; i++)
    {
        dev.write(wbuf);
        dev.waitForBytesWritten(100);
        dev.waitForReadyRead(200);
        if (dev.bytesAvailable() > 0)
        {
            rbuf.append(dev.readAll());
            while (dev.waitForReadyRead(100)) rbuf.append(dev.readAll());
        }
        res = false;
        if (rbuf.contains(QByteArray(3, (char)0xff)))
        {
            res = true;
            break;
        }
    }
    if (!res)
    {
        dev.close();
        return id;
    }

Автор: NAUGREEM 15.3.2013, 15:07

Цитата(kuzulis @ 15.3.2013, 13:45) *
Мож у тебя вирус какой или троян? :)
Чудес не бывает (с).

На всякий случай проверил всё свежим каспером - всё чисто...

Цитата(Алексей1153 @ 14.3.2013, 15:22) *
Цитата(NAUGREEM @ 14.3.2013, 15:28) *
Интересно - создатели терминалки так же делали?

а про какую именно речь ?


http://logic-bratsk.ru/radio/util/tstcomu/tstcomu.htm

Автор: kuzulis 15.3.2013, 15:12

Такое впечатление что у тебя несколько потоков пытаются открыть одно и то-же устройство.

Что это вообще за хренота?

Цитата
...
24,IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
25, IRP_MJ_CREATE,DOWN,TRUE,0x0,63 00 6D 00 73 00 2E 00 65 00 78 00 65 00 00 00 ,c.m.s...e.x.e...,
26, IRP_MJ_CREATE,UP,FALSE,0xc0000022,,,
27,IRP_MJ_CREATE,UP,FALSE,0x0,,,
...


Разбирайся со своим кодом.



Автор: NAUGREEM 15.3.2013, 16:18

Цитата(kuzulis @ 15.3.2013, 16:12) *
Такое впечатление что у тебя несколько потоков пытаются открыть одно и то-же устройство.


хм...
действительно...
я не подозревал, что QSerialPortInfo::availablePorts() пытается открыть все порты...

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

Автор: kuzulis 15.3.2013, 16:53

Цитата(NAUGREEM)
хм...
действительно...
я не подозревал, что QSerialPortInfo::availablePorts() пытается открыть все порты...


Он ничего не открывает сам.
Ты скорее всего вызываешь isBusy() или isValid(). Вот эти методы и открывают.
Просто не вызывай их.

Цитата(NAUGREEM)
а как мне тогда посмотреть, какие порты есть в системе, не открывая их?

см. выше.

Цитата(NAUGREEM)
мне нужен вотчдог на отвалившиеся и появившиеся порты...

Сам напиши.

Можешь взять код из QSerialDevice (master ветку) - класс SerialDeviceEnumerator:

http://gitorious.org/qserialdevice/qserialdevice/trees/master/src/qserialdeviceenumerator

Или из QExtSerialPort:

http://code.google.com/p/qextserialport/source/browse/#git%2Fsrc


А если по-простому - то просто по таймеру делай QSerialPortInfo::availablePorts() и все.

UPD: Если тебе нужен вачдог на выдергивание ранее открытого порта - то можешь просто приконнектиться к сигналу ResourceErorr.

Автор: NAUGREEM 15.3.2013, 18:24

Цитата(kuzulis @ 15.3.2013, 17:53) *
UPD: Если тебе нужен вачдог на выдергивание ранее открытого порта - то можешь просто приконнектиться к сигналу ResourceErorr.


спасибо!
поковыряю...

Автор: NAUGREEM 19.3.2013, 14:43

Цитата(kuzulis @ 15.3.2013, 17:53) *
UPD: Если тебе нужен вачдог на выдергивание ранее открытого порта - то можешь просто приконнектиться к сигналу ResourceErorr.


что-то я не нашёл - кто этот сигнал посылает?

Автор: kuzulis 19.3.2013, 14:49

Цитата(NAUGREEM @ 19.3.2013, 15:43) *
что-то я не нашёл - кто этот сигнал посылает?


Класс QSerialPort посылает сигнал QSerialPort::error(SerialPortError err) со значением ResourceError если
ты выдернул из системы уже открытый USB/Serial порт.



Автор: NAUGREEM 19.3.2013, 16:01

Цитата(kuzulis @ 19.3.2013, 15:49) *
Цитата(NAUGREEM @ 19.3.2013, 15:43) *
что-то я не нашёл - кто этот сигнал посылает?


Класс QSerialPort посылает сигнал QSerialPort::error(SerialPortError err) со значением ResourceError если
ты выдернул из системы уже открытый USB/Serial порт.


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

а при отправке данных в порт - возникает ошибка 11 (неизвестная ошибка)

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

засада получается...

Автор: kuzulis 19.3.2013, 17:09

Цитата(NAUGREEM)
но если ты вырубил блютузовый девайс - то никакой ошибки не возникает, пока ты не пошлёшь в порт какой-нибудь байт...


А ты поставь брекпойнт в CommOverlappedEventNotifier на processCompletionRoutine(),
выдерни шнурок и посмотри какое значение будет у triggeredEventMask, и сработает ли он вообще?

Цитата(NAUGREEM)
а при отправке данных в порт - возникает ошибка 11 (неизвестная ошибка)


Ну а ты там где вызывается GetLastError() (в свиче) замени на типа:
long r = GetLastError();
switch (r) {
...
}


И приведи значение кода этой системной ошибки в переменной r.

UPD: И да, какая у тебя ОС?

Автор: kuzulis 19.3.2013, 20:40

NAUGREEM
Упс, у себя проверил - оказывается - ДА, профукивался код

Цитата
ERROR_DEVICE_REMOVED
1617 (0x651)
The device has been removed.


И что самое интересное, что этот код ошибки появляется только если устройство было открыто и был произведен I/O в у-во.

Проверь с этим патчем: https://codereview.qt-project.org/#change,51468

И обязательно отпишись о том:

* на какой ОС, сколько бит,
* какой Bluetooth адаптер (по крайней мере VID/PID)
* какой Bluetooth стек использовал: Стандартный микрософтовский, IVTBlueSoleil, Toschiba и т.п.
!!!

Автор: NAUGREEM 21.3.2013, 16:25

Цитата(kuzulis @ 19.3.2013, 18:09) *
А ты поставь брекпойнт в CommOverlappedEventNotifier на processCompletionRoutine(),
выдерни шнурок и посмотри какое значение будет у triggeredEventMask, и сработает ли он вообще?

не срабатывает

Цитата(kuzulis @ 19.3.2013, 18:09) *
Ну а ты там где вызывается GetLastError() (в свиче) замени на типа:
long r = GetLastError();
switch (r) {
...
}


И приведи значение кода этой системной ошибки в переменной r.

::GetLastError() возвращает 0

Цитата(kuzulis @ 19.3.2013, 18:09) *
UPD: И да, какая у тебя ОС?

WinXP 32
BT адаптер HAMA Vid:0a12 Pid:0001
BT стек стандартный микросовтовский

Автор: kuzulis 21.3.2013, 17:13

Как не срабатывает? Не может быть.. Ты пробовал перед этим писать/читать из у-ва?


Я проверял на двух адаптерах в Win8 - все работает.
Хотя, может быть, дело в том, что у тебя WinXP...

Можешь дать мне удаленный доступ к своему компу через TeamViewer?

Автор: NAUGREEM 21.3.2013, 17:48

Цитата(kuzulis @ 21.3.2013, 18:13) *
Как не срабатывает? Не может быть.. Ты пробовал перед этим писать/читать из у-ва?


Я проверял на двух адаптерах в Win8 - все работает.
Хотя, может быть, дело в том, что у тебя WinXP...

Можешь дать мне удаленный доступ к своему компу через TeamViewer?


могу Ammyadmin, но только завтра...


примерно такой лог у меня получается:
last serial error выводится по сигналу error (десятичное значение)
triggeredEventMask выводится в processCompletionRoutine() после GetOverlappedResult() (это в классе ComOverlappedEventNotifier)
Раскрывающийся текст

last serial error 997
last serial error 997
dump... To block-0: FF FF FF
triggeredEventMask = 1
dump... From block-0: FF
triggeredEventMask = 1
dump... From block-0: FF FF
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
last serial error 997
dump... To block-0: FF FF FF
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11
last serial error 0
error = 11

Автор: kuzulis 21.3.2013, 22:44

Что-то ты мне не так все рассказываешь.

Цитата
last serial error выводится по сигналу error (десятичное значение)


Выведи результат от GetLastError не по сигналу, а внутри decodeSystemError().

Странно все это, т.к. я даже проверил на WinXP на примере Terminal - у меня все работает:

* если просто открываю порт и выдергиваю блютуз - то срабатывает triggeredEventMask = 0

* если открываю порт, пробую в него что-то принять извне, а потом выдергиваю блютуз -
то срабатывает triggeredEventMask = 1, далее, пытается прочитать что-то в startAsyncRead(),
читает с ошибкой ERROR_DEVICE_REMOVED == 1617 (0x651)


Цитата
могу Ammyadmin, но только завтра...

Я не знаю что это - но лучше скачай TeamViewer.

Автор: NAUGREEM 22.3.2013, 9:13

Цитата(kuzulis @ 21.3.2013, 23:44) *
* если просто открываю порт и выдергиваю блютуз - то срабатывает triggeredEventMask = 0


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

Автор: kuzulis 22.3.2013, 10:08

Цитата(NAUGREEM @ 22.3.2013, 10:13) *
Цитата(kuzulis @ 21.3.2013, 23:44) *
* если просто открываю порт и выдергиваю блютуз - то срабатывает triggeredEventMask = 0


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


Выдергиваю свисток

Автор: NAUGREEM 22.3.2013, 10:20

Цитата(kuzulis @ 22.3.2013, 11:08) *
Выдергиваю свисток


с этим-то проблем нету...
там и порт пропадает из списка...

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

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


и да: спасибо тебе за библиотеку и помошь)

Автор: kuzulis 22.3.2013, 10:46

Цитата(NAUGREEM @ 22.3.2013, 11:20) *
Цитата(kuzulis @ 22.3.2013, 11:08) *
Выдергиваю свисток


с этим-то проблем нету...
там и порт пропадает из списка...

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

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


и да: спасибо тебе за библиотеку и помошь)


А, вот, теперь порядок.

А по твоей проблеме отследить никак не получится, только если пинговать постоянно. :)

Спасибо за помощь.

Автор: NAUGREEM 25.3.2013, 22:12

Доброго всем!

эпопея продолжается...)

с блютузом всё классно - вочдог отрабатывает по наличию ошибки (serial->error() > 0)

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

посмотрел номер ошибки в GetLastError() - 997
гугл сказал: Error 997: Overlapped I/O operation is in progress

может кто знает - из-за чего она может быть?
и может её вообще можно игнорировать?


UPD:
поглядел внимательнее - ERROR_IO_PENDING там уже есть, а вот ERROR_SUCCESS стоит добавить как QSerialPort::NoError


UPD2:
когда вернулся в линукс - заметил странную вещь: постоянно висела ошибка 11 с текстом "Неприменимый к данному устройству ioctl"
содержимое errno = 25 (ENOTTY)

стоит ли игнорировать эту ошибку?
или это реальный баг?

Автор: kuzulis 26.3.2013, 10:23

NAUGREEM,

напомни плз., о каком типе чипа идет речь?

Цитата(NAUGREEM)
с блютузом всё классно - вочдог отрабатывает по наличию ошибки (serial->error() > 0)


Если ты хочешь отследить именно выдергивание - то проверяй код ошибки только на ResourceError,
а не на > 0.

Цитата(NAUGREEM)
но по USB теперь глюк появился - в какой-то момент неизвестная ошибка 11, и по ней порт закрываестя, и вё повторяется заново...


Так ты выведи GetLastError в консоль (именно из метода decodeSystemError())и посмотри какой реальный номер имеет системная ошибка
и при каких обстоятельствах: возвращается ли ReadFile с ошибкой или нет, возвращаются ли иные системные вызовы с ошибками?

Цитата(NAUGREEM)
посмотрел номер ошибки в GetLastError() - 997
гугл сказал: Error 997: Overlapped I/O operation is in progress

может кто знает - из-за чего она может быть?
и может её вообще можно игнорировать?


Это не ошибка, это нормальное поведение, не обращай на эту "ошибку" внимания.

Цитата(NAUGREEM)
UPD:
поглядел внимательнее - ERROR_IO_PENDING там уже есть, а вот ERROR_SUCCESS стоит добавить как QSerialPort::NoError


А ERROR_SUCCESS у тебя реально появляется? Если ДА - то при каких обстоятельствах.

Цитата(NAUGREEM)
UPD2:
когда вернулся в линукс - заметил странную вещь: постоянно висела ошибка 11 с текстом "Неприменимый к данному устройству ioctl"
содержимое errno = 25 (ENOTTY)

стоит ли игнорировать эту ошибку?
или это реальный баг?


Так посмотри, после чего она появляется в Linux, при каких обчтоятельствах, после какого системного вызова?


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

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

Автор: NAUGREEM 27.3.2013, 0:13

Цитата(kuzulis @ 26.3.2013, 11:23) *
напомни плз., о каком типе чипа идет речь?

BT хост: HAMA Vid:0a12 Pid:0001
BT стек: стандартный микросовтовский WinXP
BT девайс: Bluegiga WT11
USB-UART: CP2103

Цитата(kuzulis @ 26.3.2013, 11:23) *
Если ты хочешь отследить именно выдергивание - то проверяй код ошибки только на ResourceError,
а не на > 0.

просто выдёргиванием ситуация не обходится - надо отслеживать пропадание WT11

Цитата(kuzulis @ 26.3.2013, 11:23) *
Так ты выведи GetLastError в консоль (именно из метода decodeSystemError())и посмотри какой реальный номер имеет системная ошибка
и при каких обстоятельствах: возвращается ли ReadFile с ошибкой или нет, возвращаются ли иные системные вызовы с ошибками?

как писал выше:
Цитата
посмотрел номер ошибки в GetLastError() - 997
гугл сказал: Error 997: Overlapped I/O operation is in progress

и ещё GetLastError() == 0 было, при котором serial->error() возвращал 11, так как ERROR_SUCCESS у тебя не обрабатывается...

Цитата( @ 26.3.2013, 11:23) *
А ERROR_SUCCESS у тебя реально появляется? Если ДА - то при каких обстоятельствах.

реально, где-то на waitForReadyRead(), который не дожидался данных, и только на USB

Цитата(kuzulis @ 26.3.2013, 11:23) *
Так посмотри, после чего она появляется в Linux, при каких обчтоятельствах, после какого системного вызова?

да кажется после каждого

может, правда, у меня какой глючёк был - сей девайс виртуалка на время перехватывала
я пока просто ENOTTY в игнор поставил)

Цитата(kuzulis @ 26.3.2013, 11:23) *
В общем, поподробнее поисследуй поведение со своим чипом, т.к. мне трудно что-либо советовать и фиксить без
сопутствующей информации. Т.к. нужно понять все обстоятельства при которых появляются ошибки! :)

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

попробую, но не обещаю скоро...

Автор: Некий 9.7.2013, 18:14

Я скачал новую версию Qt 5.1, для неё библиотека qtserialport как устанавливается?

Автор: Litkevich Yuriy 9.7.2013, 21:23

Цитата(Гость_Некий_* @ 9.7.2013, 20:14) *
Я скачал новую версию Qt 5.1, для неё библиотека qtserialport как устанавливается?
никак, она уже входит в состав Qt 5:
в pro-файле просто пишешь:
QT += serialport
и всё

http://qt-project.org/doc/qt-5.1/qtserialport/qtserialport-index.html

Автор: NAUGREEM 14.7.2013, 4:40

Здравствуйте, Все!

Набросал тут патчик для поддержки соединения через Bluetooth RFCOMM на Андроиде в QtSerialPort...
Проверял на Qt 4.8.2 (Necessitas), но на Qt 5.1 теоретически тоже должен работать...

Работает через JNI к Android API.
Устройство должно быть предварительно сопряжено.

Может быть автор QtSerialPort'а возьмётся привести эту поделку в правильную форму, и включить в библиотеку...

 serialport.diff.gz ( 13 килобайт ) : 282

Автор: kuzulis 15.7.2013, 10:23

Ох. Отлично, спасибо. Но я не разбираюсь в кишках Android... :(

Кажется, что все-таки патчи необходимо слать в Necessitas проект (или как там его)..
Я не нашел в сорцах Qt5.1 никаких упоминаний об Android (за исключением одной почти пустой директории).

По большому счему, кажется, что именно в Necessitas сделаны обертки для всех Qt-шных классов.. Если я не прав, то поправьте..

Автор: NAUGREEM 16.7.2013, 19:52

Necessitas, на сколько я помню, плавно влился в Qt 5

На Qt 5.1 beta, да и на RC1 и RC2 я собирал свою прогу для андроида - и худо-бедно там работал и QML, и почти весь QtCore...
может там отдельная ветка под андроид?

В Necessitas для последовательных портов ничего нету - там есть обёртка для блютуза (на QtMobility 1.2), но и та не работает...
а QtSerialPort всё-таки включен в Qt 5.1, который уже смотрит в сторону андроида...

Может есть ещё какие, нибудь мантейнеры у QtSerialPort, которые за андроид взяться смогут? (выражая скромную надежду)

Автор: kuzulis 16.7.2013, 21:03

Цитата(NAUGREEM @ 16.7.2013, 20:52) *
Может есть ещё какие, нибудь мантейнеры у QtSerialPort, которые за андроид взяться смогут?


:D Не, я таких не знаю. Ты сам можешь им стать.. (по крайней мере не мэнтейнером - а контрибьютором, хотя..)

Автор: kuzulis 1.8.2013, 15:26

NAUGREEM,

а скажи-ка: а использовать JNI (т.е. то, что ты сделал в своем патче) можно только на рутованых девайсах или на любых?

UPD: Если есть желание поучаствовать, то в рассылке началось обсуждение возможности портирования для Android...
Я там и про тебя упомянул, не забыл :)

Автор: NAUGREEM 4.8.2013, 17:55

Цитата(kuzulis @ 1.8.2013, 16:26) *
NAUGREEM,

а скажи-ка: а использовать JNI (т.е. то, что ты сделал в своем патче) можно только на рутованых девайсах или на любых?

UPD: Если есть желание поучаствовать, то в рассылке началось обсуждение возможности портирования для Android...
Я там и про тебя упомянул, не забыл :)


я запускал на неломанных (планшет SONY и смартфон Phillips)

мне тут железку подогнали на андроиде 2.3 (API-10) - буду пробовать на ней по USB работать...

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

Автор: kuzulis 4.8.2013, 20:47

NAUGREEM,

вот ссылка на баг-трекер где обсуждается добавление поддержки Андройда.

https://bugreports.qt-project.org/browse/QTBUG-32672

если можешь, пожалуйста, отпишись там, напиши свое видение проблемы и как там можно Андройд поддержать, т.к. ты, я смотрю, в теме. ;)

Мы пока сошлись (неофициально) на мнении, что использовать JNI не нужно. Можно просто "тупо" дергать Linux-овые вызовы.

Хотя я не уверен, что это будет работать без прав суперпользователя.


Кстати, а почему нельзя было использовать /dev/rfcomm напрямую, не используя вызовы JNI и т.п. в твоем патче?
Может быть потому, что через JNI можно узнать производителя, описание и т.п расширенную инфу?

Цитата
мне тут железку подогнали на андроиде 2.3 (API-10) - буду пробовать на ней по USB работать...


Да, это очень интересно. Т.к. я сам имею смартфон на 2.3. И недавно пробовал сбилдить QtSerialPort без примеров и тестов для Neccesitas (Qt4.8.2). В принципе, оно собралось с некоторыми исправлениями. Но другой парень (Laszlo) пробовал собирать в Qt5 - и у него совершенно другие ошибки вылезли.


В общем, если интересно и есть свободное время, то плз., ответь туда в трекер что-нибудь.. Ок? :)

Автор: NAUGREEM 5.8.2013, 0:15

Запостил комент про причину использования JNI в трэкер...

и да - на 2.3 я соединился по USB, но на поиске блютузных устройств у меня прога вылетала...

есть аддон для апи для поддержки блютуза, но я его ещё не пробовал...

Автор: kuzulis 5.8.2013, 11:19

Цитата(NAUGREEM)
Запостил комент про причину использования JNI в трэкер...


Ага, видел, спс.

Цитата(NAUGREEM)
и да - на 2.3 я соединился по USB,

подробнее можешь расскзать? а то я не понял :)

Цитата(NAUGREEM)
но на поиске блютузных устройств у меня прога вылетала...

в смысле? тоже подробнее расскажи что делал и как.

Цитата(NAUGREEM)
есть аддон для апи для поддержки блютуза, но я его ещё не пробовал...

Ты про QtBluetooth или QtConnectivity? Если да - то там вроде бы андроид не поддерживается..


Автор: NAUGREEM 5.8.2013, 21:11

Цитата(kuzulis @ 5.8.2013, 12:19) *
подробнее можешь расскзать? а то я не понял :)

человек, который дал железку, собрал на ней ядро с поддержкой USB-Serial конвертора, и в системе видится /dev/ttyUSB0, и я к нему подключаюсть...
только права пришлось выставить...
на железке Android 2.3 (API Level 10)

Цитата(kuzulis @ 5.8.2013, 12:19) *
в смысле? тоже подробнее расскажи что делал и как.

на API-10 нету поддержки блютуза (она с 14-го только(Android 4)), если не ошибаюсь, и при обращении через JNI к этим функциям прога вываливалась...
проишлось закоментировать блок с JNI в qserialportinfo_android.cpp

Цитата(kuzulis @ 5.8.2013, 12:19) *
Ты про QtBluetooth или QtConnectivity? Если да - то там вроде бы андроид не поддерживается..

я про этот: http://code.google.com/p/backport-android-bluetooth/

Автор: Евген 30.8.2013, 6:30

Доброго дня, есть проблема.

Большое асинхронное приложение, использующее QtSerialPort .. Qt 4.8.3. Запущено под Win8.
При работе с виртуальным COM-портом (по USB) вызывает регулярный БСОД.

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

В описании QtSerialPort не заявлена поддержка Windows 8.

Посему вопрос - Как обстоят дела с совместимостью проекта с Вынь8 и какие там могут быть грабли?

Автор: Iron Bug 30.8.2013, 8:50

извините, что вмешиваюсь. просто есть большой опыт работы с разными девайсами.
софт такого уровня, как эта библиотека, вряд ли может вызвать BSOD.
но под вендами, начиная с vista и выше, есть множество проблем с USB драйверами. бывает, что венда впадает в BSOD во время выхода из слип-мода. соответственно, помогает отключение засыпания венды в настройках. также проверьте, что у вас банально хватает блока питания. USB может жрать до 0.5A и иногда этого достаточно для вырубания системы.
проверьте, что ваше устройство находится в списке поддерживаемых вендой (многие старые устройства просто не работают под новыми версиями венды). попробуйте обновить драйвер.
ну и фото BSOD'а (или хотя бы возвращаемый там код ошибки) лучше прикладывать. может, вообще визуализация падает (под вендой это тоже частенько бывает).

Автор: kuzulis 30.8.2013, 10:30

Цитата(Евген)
При работе с виртуальным COM-портом (по USB) вызывает регулярный БСОД.


Случайно чип не от Prolific, не PL2303? :)

Потому что при работе с PL2303 в разных терминалках мы тоже иногда получали BSOD, но это не относилось вообще к Qt.

Попробуй обновить дрова к своему виртуальному COM-порту.

Цитата(Евген)
В описании QtSerialPort не заявлена поддержка Windows 8.
Посему вопрос - Как обстоят дела с совместимостью проекта с Вынь8 и какие там могут быть грабли?


Все поддерживается и работает хорошо. Грабель не наблюдаем.. :)

Автор: Евген 3.9.2013, 6:54

Цитата(kuzulis @ 30.8.2013, 10:30) *
Цитата(Евген)
При работе с виртуальным COM-портом (по USB) вызывает регулярный БСОД.


Случайно чип не от Prolific, не PL2303? :)

Потому что при работе с PL2303 в разных терминалках мы тоже иногда получали BSOD, но это не относилось вообще к Qt.

Попробуй обновить дрова к своему виртуальному COM-порту.

Цитата(Евген)
В описании QtSerialPort не заявлена поддержка Windows 8.
Посему вопрос - Как обстоят дела с совместимостью проекта с Вынь8 и какие там могут быть грабли?


Все поддерживается и работает хорошо. Грабель не наблюдаем.. :)


Выяснились некоторые подробности.
Чип Profilic PL2303.
БСОД видел, из описания понятно только, что ругалась винда на файл ser2pl64.sys.

После обновления драйверов вроде бы пока в норме, но тестовый период небольшой.
А в чем проблема была при этом чипе?

Автор: kuzulis 3.9.2013, 11:53

Цитата(Евген @ 3.9.2013, 7:54) *
А в чем проблема была при этом чипе?


В BSOD! Там то-ли дрова кривые, толи еще что-то. Но это было под Win7 раньше.
После обновления на последние дрова (типа WDF), проблема вроде исчезла.

PS: Также есть еще одна фишка в том, что этот чип имеет разные модификации, и часто встречается модификация (самая дешёвая и древняя),
для которой нет дров для Win8 (т.е. эта модификация не поддерживается больше Пролификом). Там на сайте Prolific про это написано.
Поэтому помогает откат на старые драйвера (не старые, а самые последние) от Win7, т.е. они работают тоже в Win8. Но для этого нужно немного пошаманить. :)

Так что мой совет - используйте чип FTDIxxx (предпочтительнее) или CPxxx.


Автор: Евген 4.9.2013, 6:40

Цитата(kuzulis @ 3.9.2013, 11:53) *
Цитата(Евген @ 3.9.2013, 7:54) *
А в чем проблема была при этом чипе?


В BSOD! Там то-ли дрова кривые, толи еще что-то. Но это было под Win7 раньше.
После обновления на последние дрова (типа WDF), проблема вроде исчезла.

PS: Также есть еще одна фишка в том, что этот чип имеет разные модификации, и часто встречается модификация (самая дешёвая и древняя),
для которой нет дров для Win8 (т.е. эта модификация не поддерживается больше Пролификом). Там на сайте Prolific про это написано.
Поэтому помогает откат на старые драйвера (не старые, а самые последние) от Win7, т.е. они работают тоже в Win8. Но для этого нужно немного пошаманить. :)

Так что мой совет - используйте чип FTDIxxx (предпочтительнее) или CPxxx.


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

Автор: marsel 4.9.2013, 15:38

Здравствуйте kuzulis.

Подскажите пожалуйста возможно ли в QSerialPort из под Windows получить дескриптор (handle) com порта, который возвращает CreateFile.

Просто необходимо изменить время ожидания у микросхемы FTDI(Виртуальный com порт). У неё есть библиотека, с помощью которой можно изменить это время ожидания. Но необходим дескриптор (handle) com порта.

http://www.ftdichip.com/Support/Knowledgeb...atencytimer.htm

#include "ftd2xx.h"

FT_HANDLE ftHandle;
UCHAR LatencyTimer;//***Время ожидания

FT_SetLatencyTimer(ftHandle, LatencyTimer);

Автор: Алексей1153 4.9.2013, 18:58

marsel, уточни вопрос, при чём тут хендл порта ?

для изменения задержки нужен хендл устройства конвертера, установленного в системе
http://www.ftdichip.com/Support/Knowledgebase/index.html?ft_setlatencytimer.htm

нужные функции можно вызвать, импортировав их из dll динамически



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

кстати, в диспетчере устройств можно полазить по свойствам самого устройства (где-то в списке USB устройств). Сейчас под рукой нет, не могу точно сказать

Автор: marsel 5.9.2013, 9:35

Цитата(Алексей1153 @ 4.9.2013, 19:58) *
marsel, уточни вопрос, при чём тут хендл порта ?

для изменения задержки нужен хендл устройства конвертера, установленного в системе
http://www.ftdichip.com/Support/Knowledgebase/index.html?ft_setlatencytimer.htm

нужные функции можно вызвать, импортировав их из dll динамически



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

кстати, в диспетчере устройств можно полазить по свойствам самого устройства (где-то в списке USB устройств). Сейчас под рукой нет, не могу точно сказать


Да handle устройства , наверно неправильно выразился.

Как вручную выставлять я знаю. Хотелось бы программно.

Если использовать WinAPI тогда всё понятно, но как это сделать используя QSerialPort

HANDLE descriptor; нужен из class QSerialPortPrivate.

Возможно ли его каким нибудь образом получить?

Кратко вопрос такой.
Как получить дескриптор устройства в QSerialPort (Windows)?
или
Как изменить время ожидания(FTDI) из QSerialPort ?




Автор: Алексей1153 5.9.2013, 10:00

marsel, Qt к ОС в общем случае не привязан. Драйвер относится к системе, а класс работает с абстракцией - интерфейсом ком порта

так что, сомневаюсь, что класс умеет менять настройки драйвера

Автор: kuzulis 5.9.2013, 10:24

Непонятен вопрос какое HANDLE необходимо.

1) Если необходим HANDLE последовательного порта, который получается при CreateFile("COMxx",...), то эта фича выйдет в Qt5.2 (если не ошибаюсь).

Ты можешь подождать или скачать исходники QtSerialPort, где эта фича присутствует, и пересобрать самостоятельно.

Вот принятый патч: https://codereview.qt-project.org/#change,51862

Исходники качаешь через Git и потом переключаешься в dev бранч, т.к. эта фича находится именно в dev бранче и еще не вышла. И наслаждаешься. :)

2) Если необходим HANDLE, который предоставляется вендор-специфичной либой от FTDI, то тут увы, QtSerialPort не имеет к этому никакого отношения. Делай все сам.


UPD: Но тебе нужен п.2., я так понимаю, поэтому я тут ничего не сделаю, т.к. это совершенно другое API от FTDI.

UPD2: Кроме того, ты можешь установить этот таймаут раз и навсегда, просто перепрошив EEPROM у чипа, и не нужно мучаться (вроде оно возможно, погугли).

Автор: Анна 9.10.2013, 10:15

Жаль, что errorString() не перегружена для QSerialPort... по крайней мере в QT-4.8.4 .

Автор: kuzulis 9.10.2013, 17:56

Цитата(Анна @ 9.10.2013, 11:15) *
Жаль, что errorString() не перегружена для QSerialPort... по крайней мере в QT-4.8.4 .


А, простите, зачем это нужно?

Автор: Алексей1153 14.10.2013, 9:18

Анна, произведи класс от QSerialPort и перегрузи :)

Автор: Анна 21.10.2013, 8:12

Цитата(kuzulis @ 9.10.2013, 18:56) *
Цитата(Анна @ 9.10.2013, 11:15) *
Жаль, что errorString() не перегружена для QSerialPort... по крайней мере в QT-4.8.4 .


А, простите, зачем это нужно?

В смысле, зачем нужно? А зачем тогда нужна errorString()? Хотя бы для какого-то единообразия. У меня три приложения работают с компортом, а у напарника с десяток, наверное. Хотелось бы, чтобы об одной и той же ошибке все приложения сообщали одинаковую информацию. Приходится таскать за собой довесок. К тому же как раз ради удобной обёртки и взяла этот класс. До этого пользовалась доморощенными методами.

Цитата(Алексей1153 @ 14.10.2013, 10:18) *
Анна, произведи класс от QSerialPort и перегрузи :)


Кеп, ты? ;)
Но, вообще, перегружать класс ради сообщений об ошибке не смешно.


Кстати, хотела узнать, под Линуксом никаких проблем с работой QSerialPort порта нету? Мне ещё предстоит линуксоида убедить перейти на этот класс.

Автор: kuzulis 21.10.2013, 9:59

Цитата(Анна)
В смысле, зачем нужно? А зачем тогда нужна errorString()? Хотя бы для какого-то единообразия. У меня три приложения работают с компортом, а у напарника с десяток, наверное. Хотелось бы, чтобы об одной и той же ошибке все приложения сообщали одинаковую информацию. Приходится таскать за собой довесок. К тому же как раз ради удобной обёртки и взяла этот класс. До этого пользовалась доморощенными методами.


Можно конкретный пример? Что не устраивает то конкретно?

Любые предложения приветствуются. :)

Цитата(Анна)
Кстати, хотела узнать, под Линуксом никаких проблем с работой QSerialPort порта нету? Мне ещё предстоит линуксоида убедить перейти на этот класс.


При использовании signal/slot (неблокирующего подхода) не должно быть проблем. Но при waitForXX() могут выплыть проблемки.. ;)

Автор: Анна 21.10.2013, 13:44

Цитата(kuzulis @ 21.10.2013, 10:59) *
Цитата(Анна)
В смысле, зачем нужно? А зачем тогда нужна errorString()? Хотя бы для какого-то единообразия. У меня три приложения работают с компортом, а у напарника с десяток, наверное. Хотелось бы, чтобы об одной и той же ошибке все приложения сообщали одинаковую информацию. Приходится таскать за собой довесок. К тому же как раз ради удобной обёртки и взяла этот класс. До этого пользовалась доморощенными методами.


Можно конкретный пример? Что не устраивает то конкретно?

Любые предложения приветствуются. :)

Цитата(Анна)
Кстати, хотела узнать, под Линуксом никаких проблем с работой QSerialPort порта нету? Мне ещё предстоит линуксоида убедить перейти на этот класс.


При использовании signal/slot (неблокирующего подхода) не должно быть проблем. Но при waitForXX() могут выплыть проблемки.. ;)


Конкретно, когда от порта приходит сигнал об ошибке (любой, например, у меня бывает плохой контакт между портом и железякой, тогда всё время валится ошибка 6 (очень облегчила мне жизнь в выяснении, кто виноват)), хочу расшифорвать его пользователю, а errorString() возвращает всегда "Unknown error". У меня ещё сверху добавляется свой анализ полученного из порта, так что проблему решила, просто добавив к "своим ошибкам" расшифорвку ошибок из хелпа, но у меня есть приложения, где хотелось бы использовать ваш класс в чистом виде, а не городить заплатку. Насколько я поняла, всего лишь нужно было в тех местах, где генерится сигнал error(), вызывать перед этим setErrorString() с соответствующим текстом.

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

Автор: kuzulis 21.10.2013, 16:18

Цитата
тогда всё время валится ошибка 6


Это которая BreakConditionError ?

Автор: DruidCat 21.10.2013, 17:19

http://qt-project.org/doc/qt-5.1/qtserialport/qserialportinfo.html
Хотелось бы задать вопрос, извините, если он будет глупым, я только учусь.
Мне хотелось бы проверять на занятость сом порты, в документации я нашел #include <QSerialPortInfo> с методом isBusy(), который возвращает bool. А как им пользоваться я не знаю. Я учу Qt меньше месяца, читаю учебник, и бегу вперед паровоза. Охота быстрей и быстрей написать свою программу. Я смотрел примеры по применению QSerialPortInfo, и не понял их, так как такие способы программирования я еще не знаю. Не могли бы привести небольшой наглядный кусочек кода, где понятно, как пользоваться методом isBusy(), желательно в if. Мне хотелось бы проверять определенные сом порты на занятость и если эти порты заняты, производить с ними определенные манипуляции.

Автор: kuzulis 21.10.2013, 17:53

Если не знаешь какой порт нужен - то просто перечисляешь и выбираешь из списка нужный и проверяешь его:

foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
{
    if (serialPortInfo.isBusy())
        qDebug() << "Port " << serialPortInfo.portName() << " is busy";
    else
        qDebug() << "Port " << serialPortInfo.portName() << " is free";
}


или

Если знаешь какой нужен то прямо его и проверяешь:

QString portName("COM1");

QSerialPortInfo serialPortInfo(portName);

if (serialPortInfo.isBusy())
    qDebug() << "Port " << serialPortInfo.portName() << " is busy";
else
    qDebug() << "Port " << serialPortInfo.portName() << " is free";


UPD: А еще смотри примеры, которые идут вместе с QtSerialPort в директории /examples:

* cenumerator - консольный пример
* enumerator - GUI пример

Автор: Litkevich Yuriy 23.10.2013, 19:42

Тему разделил: http://www.forum.crossplatform.ru/index.php?showtopic=9689

Автор: Анна 28.10.2013, 15:25

Цитата(kuzulis @ 21.10.2013, 16:18) *
Цитата
тогда всё время валится ошибка 6


Это которая BreakConditionError ?

Она.

Автор: bsn 18.11.2013, 16:49

Есть проблемка с QtSerialPort под Windows. Qt 4.7.4 WinGW. В целом все работает.
Но как тока хочу подвинут окно программы: левой кнопкой мыши нажимаю на полоске вверху окна, обмен приостанавливается, пока не отпущу кнопку мыши.
По сигналу таймера выполняется кусок.


{
//тут выполняется

//port.bytesToWrite()=5 - ТО ЧТО Я ПОСЛЕДНИЙ РАЗ ОТПРАВИЛ В ПОРТ И =0, КОГДА НЕ "ДЕРЖУ ОКНО"
if(port.bytesToWrite()==0)
{
port.write(dataSend);
}
}

Подскажите куда рыть?

Автор: kuzulis 18.11.2013, 17:06

Цитата(bsn @ 18.11.2013, 17:49) *
Подскажите куда рыть?


http://qt-project.org/forums/viewthread/33142/

Пока никак исправить это нельзя. В общем - используй объект QSerialPort в другом треде.

Автор: bsn 18.11.2013, 18:08

Цитата(kuzulis @ 18.11.2013, 18:06) *
Цитата(bsn @ 18.11.2013, 17:49) *
Подскажите куда рыть?


http://qt-project.org/forums/viewthread/33142/

Пока никак исправить это нельзя. В общем - используй объект QSerialPort в другом треде.


Спасибо ОГРОМНОЕ!

Это когда-нибудь исправят? Неохота поток создавать :(
А еще либы есть для Qt вменяемые для работы с COM портами?

Автор: kuzulis 18.11.2013, 20:56

Цитата(bsn)
Это когда-нибудь исправят? Неохота поток создавать :(


Возможно.

Цитата(bsn)
А еще либы есть для Qt вменяемые для работы с COM портами?


Есть еще QextSerialPort. Но там тоже евенты через QWinEventNotifier ловятся. Поэтому вполне возможно оно также будет замерзать.. Хотя - попробуй и отпишись, может там нормально будет.

Автор: kuzulis 19.11.2013, 17:55

Цитата(bsn @ 18.11.2013, 19:08) *
Это когда-нибудь исправят? Неохота поток создавать :(


Вот, запостил баг, следи за ним :) : https://bugreports.qt-project.org/browse/QTBUG-34946

Автор: Анна 29.11.2013, 10:37

Цитата(kuzulis @ 21.10.2013, 9:59) *
Цитата(Анна)
Кстати, хотела узнать, под Линуксом никаких проблем с работой QSerialPort порта нету? Мне ещё предстоит линуксоида убедить перейти на этот класс.


При использовании signal/slot (неблокирующего подхода) не должно быть проблем. Но при waitForXX() могут выплыть проблемки.. ;)


А нельзя ли поподробнее про проблемки.

Автор: kuzulis 29.11.2013, 21:31

Цитата(Анна @ 29.11.2013, 11:37) *
А нельзя ли поподробнее про проблемки.


https://bugreports.qt-project.org/browse/QTBUG-33987

Автор: borune 19.10.2014, 17:29

Ребят, подскажите, как получить перечень всех установленных в системе последовательных портов? В частности, интересует вывод виртуальных портов, к которым в настоящее время ничего не подключено.
QSerialPortInfo::availablePorts() выводит только те виртуальные порты, которые в текущий момент работают, а мне нужно все вообще.

Автор: kuzulis 20.10.2014, 21:54

Цитата
QSerialPortInfo::availablePorts() выводит только те виртуальные порты, которые в текущий момент работают, а мне нужно все вообще.


А, что? :blink:

QSerialPortInfo::availablePorts() возвращает вообще все устройства которые определились в системе.

Автор: borune 21.10.2014, 7:31

Цитата(kuzulis @ 20.10.2014, 22:54) *
А, что?

QSerialPortInfo::availablePorts() возвращает вообще все устройства которые определились в системе.


Именно, определилИСЬ. А если в данный момент к виртуальному порту ничего не подключено, то его нет в диспетчере устройств, соотвественно, и в списке его тоже нет.

Автор: kuzulis 21.10.2014, 10:23

Блин, что за ересь... Я даже не буду комментировать эту кашу в голове...

Автор: ahalaj 21.10.2014, 14:01

Цитата(borune @ 21.10.2014, 8:31) *
Цитата(kuzulis @ 20.10.2014, 22:54) *
А, что?

QSerialPortInfo::availablePorts() возвращает вообще все устройства которые определились в системе.


Именно, определилИСЬ. А если в данный момент к виртуальному порту ничего не подключено, то его нет в диспетчере устройств, соотвественно, и в списке его тоже нет.

Знакомо. Я в своё время использовал SetupAPI чтобы найти устройства, которых нет в диспетчере устройств потому как физическое устройство не подключено, но фактически такое устройства в системе имеются потому как были однажды подключены. Конечно это далеко не Qt и далеко не переносимо, будет работать только под виндами, но работать будет. И найдёт все устройства. Копай в сторону http://msdn.microsoft.com/en-us/library/windows/hardware/ff550855%28v=vs.85%29.aspx и далее.

Автор: kuzulis 21.10.2014, 18:57

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

То это не проблема, достаточно удалить (закомментировать) DIGCF_PRESENT в qserialportinfo_win.cpp и пересобрать. Но это не

Цитата
"а мне нужно все вообще".


как говорит ТС. Да и непонятно зачем это вообще надо.





Автор: borune 22.10.2014, 6:09

Цитата(kuzulis @ 21.10.2014, 19:57) *
Но это не
Цитата
"а мне нужно все вообще".
как говорит ТС.

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

Цитата(kuzulis @ 21.10.2014, 19:57) *
Да и непонятно зачем это вообще надо

Зачем нужно? Да вариантов можно придумать много, зачем это может быть нужно. Объясняю, зачем нужно именно мне. Разрабатываю программу, которая должна автоматически подхватывать устройство при его подключении. Для этого требуется постоянно опрашивать все установленные порты.

Автор: kuzulis 22.10.2014, 19:42

Изначальный вопрос был некорректен.

Автор: borune 22.10.2014, 20:17

Цитата(kuzulis @ 22.10.2014, 20:42) *
Изначальный вопрос был некорректен.

не бывает некорректных вопросов, бывают неумные отвечающие, это как раз твой случай, сочувствую

Автор: borune 23.10.2014, 19:37

Господа, вопрос актуален, ибо тов. kuzulis мало того, что не понимает русского языка, так еще и дает неверные советы. Как получить список всех когда-либо установленных ком портов средствами QSerialPort?

Автор: ahalaj 23.10.2014, 21:13

Цитата(borune @ 23.10.2014, 20:37) *
Господа, вопрос актуален, ибо тов. kuzulis мало того, что не понимает русского языка, так еще и дает неверные советы. Как получить список всех когда-либо установленных ком портов средствами QSerialPort?

Единственное что лично я могу предложить, это мой маленький кусочек из исходника 10-тилетней давности. Но он на Delphi и естественно никаким QSerialPort там и не пахнет. Мне в то время надо было ловить подключение мобильных телефонов Nokia через интерфейс DKU-2. При каждом подключении создавался виртуальный ком-порт, при первом подключении система его у себя прописывала и запоминала, при отключении этот виртуальный ком-порт из диспетчера задач пропадал, но система созданную запись о нём не забывала и в системе он всё равно присутствовал, правда был hidden пока телефон физически не подключишь. И вот мне надо было ловить и видимые в диспетчере устройства, подключенные реально, и невидимые, но про которые система знала.

Использовался SetupApi.pas из http://jvcl.delphi-jedi.org/ (в 2004-м году этот юнит назывался SetupApi.pas, сейчас он же называется по-моему JvSetupApi.pas, я с тех пор в эту библиотеку не лазил, как 10 лет назад сделал так и забыл, принцип программиста "работает -- не трожь!" :lol: )

Вот моя функция на Delphi, которая этот SetupApi.pas использует.

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

interface

uses Windows;

const
   aDevGUID:array[0..3] of TGUID = (
            '{4F919104-4ADF-11D5-882D-00B0D02FE381}',
            '{4F919102-4ADF-11D5-882D-00B0D02FE381}',
            '{4F919100-4ADF-11D5-882D-00B0D02FE381}',
            '{86E0D1E0-8089-11D0-9CE4-08003E301F73}'
   );

type
  HDEVINFO = Pointer;

function GetDKU2List:string;

implementation

uses
  SetupApi, SysUtils;

function GetDKU2List:string;
var iDevClass,iDevice:integer;
     DevInfo:HDEVINFO;
     DevInfoData:TSpDevInfoData;
     DeviceInterfaceData:TSPDeviceInterfaceData;
     cbSize:DWORD;
     DevIFCDetailData:PSPDeviceInterfaceDetailData;
     InstanceID:PChar;
begin

  // начинаем просмотр всех возможных классов устройств в поисках
  // подходящего дивайса
  For iDevClass:=Low(aDevGUID) to High(aDevGUID) do begin
    DevInfo:=SetupDiGetClassDevs(@(aDevGUID[iDevClass]), nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
    If DevInfo=Pointer(INVALID_HANDLE_VALUE) then Exit
    else begin
      // дивайсы в этом классе есть
      DevInfoData.cbSize:=sizeof(SP_DEVINFO_DATA);
      // пробежимся по всем дивайсам данного класса начиная с нулевого,
      // пока функция SetupDiEnumDeviceInfo не вернёт FALSE
      iDevice:=0;
      While SetupDiEnumDeviceInfo(DevInfo,iDevice,DevInfoData) do begin
        // дивайс с таким номером найден
        // смотрим какие интерфейсы поддерживает данный дивайс
        DeviceInterfaceData.cbSize:=sizeof(SP_DEVICE_INTERFACE_DATA);
        If not SetupDiEnumDeviceInterfaces(DevInfo, nil, aDevGUID[iDevClass], iDevice, DeviceInterfaceData) then begin
          //*****ошибка
        end
        else begin
          SetupDiGetDeviceInterfaceDetail(DevInfo, @DeviceInterfaceData, nil, 0, cbSize, nil);
          GetLastError();
          DevIFCDetailData:=AllocMem(cbSize);
          DevIFCDetailData.cbSize:=sizeof(TSPDeviceInterfaceDetailData);

          If SetupDiGetDeviceInterfaceDetail(DevInfo, @DeviceInterfaceData, DevIFCDetailData, cbSize, cbSize, nil) then begin
            SetupDiGetDeviceInstanceId(DevInfo, @DevInfoData, nil, 0, @cbSize);
            GetLastError();
            InstanceID:=AllocMem(cbSize);
            SetupDiGetDeviceInstanceId(DevInfo, @DevInfoData, InstanceID, cbSize, nil);
            Dispose(InstanceID);

            If (iDevClass=1) or ((iDevClass=333) (*and (DevIFCDetailData.DevicePath[4]=Ord('u'))*)) then begin
              Result:=Result+';'+StrPas(DevIFCDetailData.DevicePath);
            end;
          end;
          Dispose(DevIFCDetailData);
        end;

        Inc(iDevice);
      end;
    end;
  end;
end;

end.


Расчитано именно на DKU-2 и именно для мобильных телефонов Nokia, но по аналогии думаю можно разобраться что там к чему. Больше помочь ничем не могу, извини.

Автор: ahalaj 23.10.2014, 22:27

Цитата(ahalaj @ 23.10.2014, 22:13) *
Единственное что лично я могу предложить, это мой маленький кусочек из исходника 10-тилетней давности. Но он на Delphi и естественно никаким QSerialPort там и не пахнет.

[...]

Нашёл ещё кое-что. Докопался я тогда до этого дела путём наглого и бессовестного реверсинга trial копии http://www.logomanager.co.uk/php/products.php?id=54. В те времена это был единственный софт помимо родной для телефонов Nokia программы Nokia PC Suite который умел находить виртуальные порты DKU-2 как для подключенных, так и для неподключенных физически телефонов. Весь путь реверсинга я сохранял в C со своими коментариями по ходу чтобы после было легче понять что там к чему. Потом уже переделал на Delphi потому что в продакшн надо было на Delphi отдавать. Так что вот то, из чего после был сделан предыдущий паскальный исходник. Опять не Qt, но думаю что C всё же поближе должно быть чем Pascal. Тут и коментариев чуть больше, и SetupApi.pas не требуется, всё в обычном стандартном Microsoft Windows SDK имеется. Ищутся исключительно виртуальные порты DKU-2 для мобильных телефонов Nokia как и реально подключенные, так и hidden, которые в диспетчере устройств не показаны, но в системе тем не менее есть.

Стиль кода, определение ошибок и сами ошибки -- это всё не моё, данная функция отреверсена из http://www.logomanager.co.uk/php/products.php?id=54 практически "один в один", в оригинале не было только никаких вызовов logData(const char *format, ...), а всё остальное оттуда © 2004 год.

Раскрывающийся текст
#include <ctype.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#pragma pack(push,1)

#include <windows.h>
#include <setupapi.h>

#pragma pack(pop)

// тут мы будем хранить информацию о найденных устройствах
//
struct CDevice
{
    CDevice *pNext;
    bool     fNeedOpen;
    HANDLE   h;
    TCHAR    path[ANYSIZE_ARRAY];
};

// ПОРЯДОК ЭТИХ КЛАССОВ В МАССИВЕ ВАЖЕН!!!

static GUID aDevGUID[] = {
    {
        0x4D36E978,
        0xE325,
        0x11CE,
        {0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18}
    },
    {
        0x4F919104,
        0x4ADF,
        0x11D5,
        {0x88, 0x2D, 0x00, 0xB0, 0xD0, 0x2F, 0xE3, 0x81}
    },
    {
        0x4F919102,
        0x4ADF,
        0x11D5,
        {0x88, 0x2D, 0x00, 0xB0, 0xD0, 0x2F, 0xE3, 0x81}
    },
    {
        0x4F919100,
        0x4ADF,
        0x11D5,
        {0x88, 0x2D, 0x00, 0xB0, 0xD0, 0x2F, 0xE3, 0x81}
    },
    {
        0x86E0D1E0,
        0x8089,
        0x11D0,
        {0x9C, 0xE4, 0x08, 0x00, 0x3E, 0x30, 0x1F, 0x73}
    }
};

static char szLogFName[] = "dku-2.log";
static bool fNeedLog     = false;

static void logData(const char *format, ...)
{
    if (fNeedLog)
    {
        FILE *pFLog = fopen(szLogFName, "a+t");

        if (pFLog)
        {
            time_t timer = time(NULL);
            struct tm *stm = localtime(&timer);
            char *p = asctime(stm);
            p[strlen(p) - 1] = '\0';

            fprintf(pFLog, "%s: ", p);

            va_list args;
            va_start(args, format);
            vfprintf(pFLog, format, args);
            va_end(args);

            fclose(pFLog);
        }
    }
}

static void logStart()
{
    if (fNeedLog)
    {
        if (!access(szLogFName, 6))
        {
            FILE *pFLog = fopen(szLogFName, "a+t");

            if (pFLog)
            {
                fprintf(pFLog, "\n");
                fclose(pFLog);
            }
        }
    }
}

static void GUID2str(const GUID& guid, char *str)
{
    sprintf(str, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
            guid.Data1, guid.Data2, guid.Data3,
            guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
            guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
}

static void scanForDevices(CDevice **paDevices)
{
    CDevice  *aDevices = NULL;
    bool      fError = false;
    HDEVINFO  hDevInfo;
    char      szGUID[39];

    // начинаем просмотр всех возможных классов устройств в поисках
    // подходящего дивайса
    //
    for (int iDevClass = 0;
         iDevClass < sizeof(aDevGUID) / sizeof (aDevGUID[0]);
         iDevClass++)
    {
        GUID2str(aDevGUID[iDevClass], szGUID);

        hDevInfo = SetupDiGetClassDevs(&aDevGUID[iDevClass],
                                       0,
                                       0,
                                       DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

        // попробуем посмотреть есть ли у нас какие-нибудь дивайсы
        // в этом классе
        //
        if (hDevInfo == INVALID_HANDLE_VALUE)
        {
            // нифига, литовский национальный праздник ``Обломайтис''
            // вываливаемся сразу же, все четыре класса должны быть
            //
            logData("hmm... couldn't find device class %s\n", szGUID);
            fError = true;
            break;
        }
        else
        {
            // дивайсы в этом классе есть
            //
            logData("found device class %s\n", szGUID);

            SP_DEVINFO_DATA DevInfoData;

            DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

            // пробежимся по всем дивайсам данного класса начиная с нулевого,
            // пока функция SetupDiEnumDeviceInfo не вернёт FALSE
            //
            bool fFound = false;

            for (int iDevice = 0;
                 SetupDiEnumDeviceInfo(hDevInfo, iDevice, &DevInfoData);
                 iDevice++)
            {
                fFound = true;
                // дивайс с таким номером найден
                //
                logData("  device number: #%d\n", iDevice);

                // смотрим какие интерфейсы поддерживает данный дивайс
                //
                SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;

                DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

                if (!SetupDiEnumDeviceInterfaces(hDevInfo,
                                                 NULL,
                                                 &aDevGUID[iDevClass],
                                                 iDevice,
                                                 &DeviceInterfaceData))
                {
                    // какая-то ошибка в потрохах Weendoze, такого быть
                    // не должно по хорошему
                    //
                    logData("failed to get SP_DEVICE_INTERFACE_DATA for "
                            "device #%d: %08X\n", iDevice, GetLastError());
                }
                else
                {
                    // узнаем про этот интерфейс поподробнее
                    //

                    // тут мы получим необходимый размер буфера
                    //
                    ULONG cbSize;

                    // а это сам буфер
                    //
                    PSP_DEVICE_INTERFACE_DETAIL_DATA pDevIFCDetailData = NULL;

                    // во время первого вызова SetupDiGetDeviceInterfaceDetail
                    // передаём NULL в качестве указателя на буфер,
                    // 0 в качестве размера буфера и в результате Windows
                    // должен вернуть нам требуемый размер буфера в cbSize
                    //
                    SetupDiGetDeviceInterfaceDetail(hDevInfo,
                                                    &DeviceInterfaceData,
                                                    NULL,
                                                    0,
                                                    &cbSize,
                                                    NULL);

                    // ДОЛЖНА БЫТЬ ОШИБКА ПРО МАЛЫЙ РАЗМЕР БУФЕРА !!!
                    //
                    int ec = GetLastError();

                    if (ec != ERROR_INSUFFICIENT_BUFFER)
                    {
                        // не повезло, ошибка какая-то другая, вываливаемся
                        //
                        logData("error getting interface detail: %08X, "
                                "skip going any further\n", ec);
                    }
                    else
                    {
                        // выделяем памяти ровно столько, сколько надо
                        //
                        pDevIFCDetailData =
                            (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(cbSize);

                        if (!pDevIFCDetailData)
                        {
                            logData("insufficient memory, "
                                    "skip going any further\n");
                        }
                        else
                        {
/*
* ТУТ НАЧИНАЮТСЯ ПОЛНЫЕ НЕПОНЯТКИ. НЕСМОТРЯ НА ТО, ЧТО ВСЕ ПАРАМЕТРЫ
* ТЕПЕРЬ БУДУТ УСТАНОВЛЕНЫ КОРРЕКТНО, LMMPC ОЖИДАЕТ, ЧТО ФУНКЦИЯ ВЕРНЁТ
* ОШИБКУ (SIC!). ЕСЛИ ЖЕ ФУНКЦИЯ ВЫПОЛНИЛАСЬ БЕЗ ОШИБКИ, ТО LMMPC
* ЗАЧЕМ-ТО ПОЛУЧАЕТ INSTANCE ID ДАННОГО ИНТЕРФЕЙСА (ЧТО МЫ И ДЕЛАЕМ
* НИЖЕ ПО ТЕКСТУ) И ТОЖЕ ОЖИДАЕТ, ЧТО ФУНКЦИЯ ВЕРНЁТ ОШИБКУ! СУДЯ
* ПО ТЕКСТУ LMMPC, ТАКОЕ ПОВЕДЕНИЕ ВПОЛНЕ ВОЗМОЖНО, НО НЕ ДЛЯ ВСЕХ
* КЛАССОВ УСТРОЙСТВ (ВСЕГО ТАМ ЧЕТЫРЕ ВОЗМОЖНЫХ КЛАССА).
*
* БЫТЬ МОЖЕТ ВСЯ ЭТА БАДЯГА ТУТ НАДЕЛАНА ДЛЯ ТОГО, ЧТОБЫ ИЗБЕЖАТЬ
* ПОВТОРНОГО ОТКРЫТИЯ УЖЕ ОТКРЫТОГО ДИВАЙСА, ФИГ ЗНАЕТ
*/

/*
  * BIZARRE BEGIN
  */
                            // подготавливаем структуру
                            // SP_DEVICE_INTERFACE_DETAIL_DATA
                            //
                            pDevIFCDetailData->cbSize =
                                sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

                            // и опять вызываем SetupDiGetDeviceInterfaceDetail,
                            // но уже с установленными значениями параметров
                            //
/*
* В LMMPC ДАЛЕЕ ВЫПОЛНЕНИЕ ИДЁТ НА ОТКРЫТИЕ ДИВАЙСА ЕСЛИ ЭТА ФУНКЦИЯ ВЕРНУЛА
* ОШИБКУ И КЛАСС ДИВАЙСА РАВЕН ОПРЕДЕЛЁННОМУ ЗНАЧЕНИЮ. ЖУТЬ КАКАЯ-ТО, ЯВНО
* КАКИЕ-ТО МАНЬЯКИ ТАКОЕ ПРИДУМЫВАЛИ
*/
                            if (!SetupDiGetDeviceInterfaceDetail(
                                hDevInfo,
                                &DeviceInterfaceData,
                                pDevIFCDetailData,
                                cbSize,
                                NULL,
                                NULL))
                            {
/*
* НА ВСЯКИЙ СЛУЧАЙ ЗАПИСЫВАЕМ КОД ОШИБКИ В ЖУРНАЛ, МОЖЕТ БЫТЬ
* ЧУТЬ ПОНЯТНЕЕ СТАНЕТ (ПРОВЕРИТЬ ВОТ НЕ НА ЧЕМ)
*/
                                logData("bizarre error code 0: %08X\n",
                                        GetLastError());
                            }
                            else
                            {
/*
* ОШИБКИ НЕ БЫЛО, ЗНАЧИТ СМОТРИМ НА DEVICE INSTANCE ID
*/
                                logData("    device path: %s\n",
                                        pDevIFCDetailData->DevicePath);

                                // используем такой же способ определения
                                // требуемого размера буфера, как и выше
                                // для SetupDiGetDeviceInterfaceDetail
                                //
                                SetupDiGetDeviceInstanceId(hDevInfo,
                                                           &DevInfoData,
                                                           NULL,
                                                           0,
                                                           &cbSize);

                                ec = GetLastError();

                                if (ec != ERROR_SUCCESS)
                                {
                                    if (ec != ERROR_INSUFFICIENT_BUFFER)
                                    {
/*
* И ЭТУ СТРАННУЮ ОШИБКУ ТОЖЕ ПИШЕМ В ЖУРНАЛ
*/
                                        logData("bizarre error code 1: %08X\n",
                                                GetLastError());
                                    }
                                    else
                                    {
/*
* ПОПАДАЕМ СЮДА ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ БЫЛА ОШИБКА ПРО МАЛЫЙ
* РАЗМЕР БУФЕРА. В ПРОТИВНОМ СЛУЧАЕ ПРОСТО ИДЁМ НА ОТКРЫТИЕ ДИВАЙСА
*/
                                        // выделяем памяти ровно столько,
                                        //  сколько надо
                                        //
                                        char *pInstanceID =
                                            (char*)malloc(cbSize);

                                        if (pInstanceID)
                                        {
                                            if (!SetupDiGetDeviceInstanceId(
                                                hDevInfo,
                                                &DevInfoData,
                                                pInstanceID,
                                                cbSize,
                                                NULL))
                                            {
/*
* ЖУРНАЛИРУЕМ ЕЩЁ ОДНУ СТРАННУЮ ОШИБКУ
*/
                                                logData(
                                                    "bizarre error code 2: "
                                                    "%08X\n",
                                                    GetLastError());
                                            }
                                            else
                                            {
                                                // на всякий случай записываем
                                                // device instance id в лог
                                                //
                                                logData("    instance ID: %s\n",
                                                        pInstanceID);
                                            }
                                            // следим за heap
                                            //
                                            free(pInstanceID);
                                        }
                                    }
                                }
                            }
/*
  * BIZARRE END
  */
                            // смотрим к какому классу относится устройство
                            // (СМ. НАВЕРХУ ПРО ТО, ЧТО ПОРЯДОК КЛАССОВ В
                            // МАССИВЕ [i.e. ИХ НУМЕРАЦИЯ] ВАЖЕН!!!)
                            //
                            // устройства классов
                            // {4F919104-4ADF-11D5-882D-00B0D02FE381}
                            // {4F919100-4ADF-11D5-882D-00B0D02FE381},
                            // индексируемые через 0 и 2 соответственно,
                            // мы просто игнорируем (то есть мы проверяем
                            // эти классы только на присутствие, больше они
                            // нас никак не интересуют)
                            //
                            // устройство класса
                            // {4F919102-4ADF-11D5-882D-00B0D02FE381},
                            // индексируемое через 1, надлежит открыть
                            //
                            // устройство класса
                            // {86E0D1E0-8089-11D0-9CE4-08003E301F73},
                            // индексируемое через 3 и имеющее четвёртым
                            // символом пути букву `u' (USB?) тоже
                            // попадает под нашу юрисдикцию, однако
                            // открытия не требует (было открыто ранее?)
                            //
                            if ((iDevClass == 1) ||
                                    (iDevClass == 3 &&
                                    pDevIFCDetailData->DevicePath[4] == 'u'))
                            {
                                CDevice *pDevice =
                                    (CDevice*)malloc(sizeof (CDevice) +
                                    strlen(pDevIFCDetailData->DevicePath));

                                if(!pDevice)
                                {
                                    logData("insufficient memory to keep "
                                            "device info\n");
                                }
                                else
                                {
                                    fFound = true;

                                    if (aDevices)
                                        aDevices->pNext = pDevice;
                                    else
                                        aDevices = pDevice;

                                    pDevice->pNext = NULL;
                                    pDevice->fNeedOpen = (iDevClass == 1)
                                                                ? true
                                                                : false;
                                    pDevice->h = INVALID_HANDLE_VALUE;
                                    strcpy(pDevice->path,
                                        pDevIFCDetailData->DevicePath);
                                }
                            }

                            // следим за heap
                            //
                            free(pDevIFCDetailData);
                        }
                    }
                 }
             }
             if (!fFound)
             {
                 // в этом классе дивайсов нет
                 //
                 logData("  no any device(s)\n");
             }
             // больше нам этот класс не нужен
             //
             SetupDiDestroyDeviceInfoList(hDevInfo);
         }
    }

    // если выходим по ошибке, то освобождаем всю занятую память
    //
    if (fError)
    {
        for (CDevice *p = aDevices; p;)
        {
            CDevice *pTmp = p->pNext;
            free(p);
            p = pTmp;
        }
        aDevices = NULL;
    }

    *paDevices = aDevices;
}

static bool openDevice(CDevice&  device,
                       DWORD     IOCode,
                       BYTE     *pOutBuf,
                       DWORD    *cOutBytes)
{
    bool rc = false;

    logData("  about to open %s\n", device.path);

    if ((device.h = CreateFile(device.path,
                              0xC0000000,
                              0,
                              NULL,
                              OPEN_EXISTING,
                              FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL,
                              NULL)) == INVALID_HANDLE_VALUE)
    {
        logData("  error: %08X\n", GetLastError());
    }
    else
    {
        logData("  HANDLE: %08X\n", device.h);
        logData("  about to create event semaphore\n");

        HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

        logData("  HANDLE: %08X\n", hEvent);

        if (hEvent)
        {
            DWORD sysErr = ERROR_WAIT_NO_CHILDREN;
            OVERLAPPED ovrlpd;

            memset(&ovrlpd, 0, sizeof (OVERLAPPED));
            logData("  about to send %08X IOCTL code\n", IOCode);
            if (DeviceIoControl(device.h,
                                 IOCode,
                                 NULL,
                                 0,
                                 pOutBuf,
                                 *cOutBytes,
                                 cOutBytes,
                                 &ovrlpd));
            {
                logData("  success\n");
                sysErr = ERROR_SUCCESS;
            }
            if (sysErr)
            {
                sysErr = GetLastError();
                logData("  failed: %08X\n", sysErr);
                if (sysErr == ERROR_IO_PENDING)
                    sysErr = WaitForSingleObject(hEvent, 5000);
                    logData("  after waiting for 5000 ms: %08X\n", sysErr);
            }
            CloseHandle(hEvent);

            if (sysErr == ERROR_SUCCESS)
                rc = true;
        }
        CloseHandle(device.h);
        device.h = INVALID_HANDLE_VALUE;
    }
    return rc;
}

static void processDevice(CDevice& device)
{
    if (device.fNeedOpen)
    {
        DWORD cBytes;
        BYTE  buf[512];

        cBytes = sizeof(buf);
        memset(buf, 0, sizeof(buf));

        openDevice(device, 0x22203C, buf, &cBytes);
        openDevice(device, 0x222034, buf, &cBytes);
    }
}

static void dumpData(const char *buf, size_t len)
{
    char *dst = (char*)malloc(80);

    if (dst)
    {
        for (size_t i = 0; i < len;)
        {
            sprintf(dst, "%04X  ", i);

            size_t j;
            char   tmp[9];

            for (j = 0; j < 16; j++)
            {
                if ((i + j) == len)
                {
                    break;
                }
                sprintf(tmp, "%02X ", (unsigned char)buf[i + j]);
                strcat(dst, tmp);
            }

            for (; j < 16; j++)
                strcat(dst, "   ");

            strcat(dst, " ");

            for (j = 0; j < 16; j++)
            {
                if ((i + j) == len)
                {
                    break;
                }
                sprintf(tmp, "%c", isascii(buf[i + j]) ? buf[i + j] : '.');
                strcat(dst, tmp);
            }
            i += 16;

            logData("%s\n", dst);
        }
        free(dst);
    }
}

static void sendstuff(CDevice& device)
{
    DWORD  rc;
    HANDLE hDev;

    logData("  about to send some bytes\n");

    if ((hDev = CreateFile(device.path,
                           0xC0000000,
                           0,
                           NULL,
                           OPEN_EXISTING,
                           FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL,
                           NULL)) == INVALID_HANDLE_VALUE)
    {
        logData("  error opening: %08X\n", GetLastError());
    }
    else
    {
        HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

        if (hEvent)
        {
            OVERLAPPED ovrlpd;
            DWORD      nBytes;
            char       buf[512];

            memset(&ovrlpd, 0, sizeof (OVERLAPPED));
            ovrlpd.hEvent = hEvent;

            buf[0] = 0x1B;
            buf[1] = 0x00;
            buf[2] = 0x0C;
            buf[3] = 0xD0;
            buf[4] = 0x00;
            buf[5] = 0x01;
            buf[6] = 0x04;

            logData("  about to send data:\n");
            dumpData(buf, 7);

            rc = WriteFile(hDev,
                           buf,
                           7,
                           &nBytes,
                           &ovrlpd);

            if (rc)
            {
                if (GetLastError() == ERROR_IO_PENDING)
                {
                    printf ("waiting for 5 seconds to complete (write)\n");
                    logData("  waiting for 5 seconds to complete (write)\n");

                    rc = WaitForSingleObject(hEvent, 5000);
                }
            }
            if (rc)
            {
                logData("  error sending data: %08X\n", GetLastError());
            }
            else
            {
                logData("  about to read response:\n");
                SetEvent(hEvent);

                rc = ReadFile(hDev,
                              buf,
                              sizeof(buf),
                              &nBytes,
                              &ovrlpd);
                if (rc)
                {
                    if (GetLastError() == ERROR_IO_PENDING)
                    {
                        printf ("waiting for 5 seconds to complete (read)\n");
                        logData("  waiting for 5 seconds to complete (read)\n");

                        rc = WaitForSingleObject(hEvent, 5000);
                    }
                }
                if (rc)
                {
                    logData("  error getting response: %08X\n", GetLastError());
                }
                else
                {
                    dumpData(buf, nBytes);
                }
            }
            CloseHandle(hEvent);
        }
        CloseHandle(hDev);
    }
}

int main()
{
    CDevice *aDevices;

    char *pch = getenv("LOG_DKU-2");
    if (pch && stricmp(pch, "yes"))
        fNeedLog = true;

    logStart();
    logData("Start logging\n");

    scanForDevices(&aDevices);

    if (aDevices)
    {
        for (CDevice *p = aDevices; p; p = p->pNext)
        {
            logData("  BEFORE DeviceIoControl\n");
            sendstuff(*p);

            processDevice(*p);

            logData("  AFTER DeviceIoControl\n");
            sendstuff(*p);
        }

        for (CDevice *p = aDevices; p;)
        {
            if (p->h != INVALID_HANDLE_VALUE)
                CloseHandle(p->h);

            CDevice *pTmp = p->pNext;
            free(p);
            p = pTmp;
        }
    }

    logData("End logging\n");

    return 0;
}

Автор: borune 24.10.2014, 7:28

ahalaj, спасибо большое, но мне хотелось бы все же через QSerialPort сделать. В такие дебри лезть неохота, если честно, но за помощь спасибо тебе.

Автор: ahalaj 25.10.2014, 10:30

Цитата(borune @ 24.10.2014, 8:28) *
ahalaj, спасибо большое, но мне хотелось бы все же через QSerialPort сделать. В такие дебри лезть неохота, если честно, но за помощь спасибо тебе.

А kuzulis прав!

Цитата(kuzulis @ 21.10.2014, 19:57) *
Ах, если имелось ввиду найти все у-ва которые когда-либо были подключены и определены, а теперь являются "скрытыми" hidden (т.к. их например, выдернули из USB) и кстати, их можно отобразить в диспетчере устройств.

То это не проблема, достаточно удалить (закомментировать) DIGCF_PRESENT в qserialportinfo_win.cpp и пересобрать.

Посмотрел я на код qserialportinfo_win.cpp, там практически то же самое, что у меня. Закоментировал DIGCF_PRESENT

[...]

static inline const QList<GuidFlagsPair>& guidFlagsPairs()
{
    static const QList<GuidFlagsPair> guidFlagsPairList = QList<GuidFlagsPair>()
        // Standard Setup Ports Class GUID
        << qMakePair(QUuid(0x4D36E978, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18), 0 /*DWORD(DIGCF_PRESENT)*/)
        // Standard Setup Modems Class GUID
        << qMakePair(QUuid(0x4D36E96D, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18), 0 /*DWORD(DIGCF_PRESENT)*/)
        // Standard Serial Port Device Interface Class GUID
        << qMakePair(QUuid(0x86E0D1E0, 0x8089, 0x11D0, 0x9C, 0xE4, 0x08, 0x00, 0x3E, 0x30, 0x1F, 0x73), DWORD(/*DIGCF_PRESENT |*/DIGCF_DEVICEINTERFACE))
        // Standard Modem Device Interface Class GUID
        << qMakePair(QUuid(0x2C7089AA, 0x2E0E, 0x11D1, 0xB1, 0x14, 0x00, 0xC0, 0x4F, 0xC2, 0xAA, 0xE4), DWORD(/*DIGCF_PRESENT |*/DIGCF_DEVICEINTERFACE));
    return guidFlagsPairList;
}

[...]


пересобрал C:\Qt\5.3\Src\qtserialport\examples\serialport\enumerator и QSerialPortInfo::availablePorts() стал показывать не только реально подключенные устройства, но и те, которые зарегистрированы в системе, но не подключены в данный момент. Проверял на телефоне Nokia, единственное различие в выводе примера enumerator это то, что он не показывает IMEI телефона когда он не подключен, а так всё то же самое:

оригинальный код когда телефон не подключен:
оригинальный код когда телефон подключен:
модифицированный код с закоментированным DIGCF_PRESENT когда телефон не подключен:
модифицированный код с закоментированным DIGCF_PRESENT когда телефон подключен:

Так что или модифицировать qserialportinfo_win.cpp, или делать то же самое, но вручную, без QSerialPortInfo, других способов похоже нет.

Автор: borune 26.10.2014, 18:16

а ты как модифицированную версию QserialPort ставил, я просто пробовал через make и make install, вывод ничем не отличался от того, что было

Автор: ahalaj 26.10.2014, 19:24

Сначала модифицируем как надо C:\Qt\5.3\Src\qtserialport\src\serialport\qserialportinfo_win.cpp

После делаем так:

cd C:\Qt\5.3\Src\qtserialport\src
qmake
nmake


Вновь собранные debug и release .dll теперь находятся тут:

cd ..\lib
dir *.dll

Volume in drive C has no label.
Volume Serial Number is 94E6-4722

Directory of C:\Qt\5.3\Src\qtserialport\lib

26.10.2014  19:08            56,832 Qt5SerialPort.dll
26.10.2014  19:08           122,880 Qt5SerialPortd.dll
               2 File(s)        179,712 bytes
               0 Dir(s)  300,561,043,456 bytes free


А .lib пофигу, они подходят и к родным, и к модифицированным. Затем я просто брал отсюда Qt5SerialPort.dll и клал в тот каталог, где лежал откомпилированный пример enumerator.exe Ведь .dll без явного указания пути ищутся сначала в текущем каталоге, если там нет, то в каталоге откуда запущен .exe, если и там нет, то во всех каталогах переменной %PATH%. Т.к. мой лежал там же, где сам enumerator.exe, то родная .dll из C:\Qt\5.3\msvc2010_opengl\bin\Qt5SerialPort.dll не бралась, модифицированная находилась раньше и именно она использавалась при запуске enumerator.exe. Вот как-то так.

Автор: borune 26.10.2014, 20:17

так что сделать нужно, скопировать Qt5SerialPort.dll и Qt5SerialPortd.dll из папки сборки в папку lib моего компилятора?

Автор: ahalaj 26.10.2014, 20:48

Да, скопировать. Но не в папку .lib, а в ту папку, где оказывается твой целевой exe'шник.

Автор: borune 27.10.2014, 8:20

Цитата(ahalaj @ 26.10.2014, 21:48) *
Да, скопировать. Но не в папку .lib, а в ту папку, где оказывается твой целевой exe'шник.


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

Автор: ahalaj 27.10.2014, 8:51

Цитата(borune @ 27.10.2014, 8:20) *
Цитата(ahalaj @ 26.10.2014, 21:48) *
Да, скопировать. Но не в папку .lib, а в ту папку, где оказывается твой целевой exe'шник.
хм, а почему туда..ты ж сам описал порядок поиска требуемых dll..он в итоге должен дойти до каталога с компилятором, где все dll лежат, и оттуда его взять

Ну можно и в ту папку, где лежат все стандартные .dll от Qt. Просто тогда придётся новую dll записывать поверх стандартно-родной и соответственно стандартно-родной уже в оригинале не останется. А так когда кладёшь её в папку с exe'шником и волки получаются сыты (exe использует новую dll) и овцы целы (оригинальную dll из поставки Qt никто не трогает).

Автор: borune 27.10.2014, 10:01

Цитата(ahalaj @ 27.10.2014, 9:51) *
Цитата(borune @ 27.10.2014, 8:20) *
Цитата(ahalaj @ 26.10.2014, 21:48) *
Да, скопировать. Но не в папку .lib, а в ту папку, где оказывается твой целевой exe'шник.
хм, а почему туда..ты ж сам описал порядок поиска требуемых dll..он в итоге должен дойти до каталога с компилятором, где все dll лежат, и оттуда его взять

Ну можно и в ту папку, где лежат все стандартные .dll от Qt. Просто тогда придётся новую dll записывать поверх стандартно-родной и соответственно стандартно-родной уже в оригинале не останется. А так когда кладёшь её в папку с exe'шником и волки получаются сыты (exe использует новую dll) и овцы целы (оригинальную dll из поставки Qt никто не трогает).

ну так если нужна будет стандартная, снова собираешь и меняешь)

Автор: ahalaj 27.10.2014, 11:25

А зачем снова менять и собирать если нужна стандартная? Стандартная пусть всегда на месте остаётся, а модифицированная единовременно собирается для конкретного проекта и поставляется вместе с ним. Я так и сделал из расчёта чтобы как раз стандартную и не менять.

Автор: borune 28.10.2014, 15:57

Я попробовал дома, enumerator работает, но это все равно не то. Если порт есть, но к нему не подключен кабель, то этот порт нельзя открыть, и, соответственно, записать в него также ничего нельзя. Но это уже похоже на фишечку драйвера виртуального ком-порта, и ее никак не исправишь наверное...

Автор: ahalaj 28.10.2014, 17:20

Да, скорее всего тут именно драйвер. Но главное ведь получилось, существование порта детектится.

Автор: borune 28.10.2014, 17:35

Цитата(ahalaj @ 28.10.2014, 18:20) *
Да, скорее всего тут именно драйвер. Но главное ведь получилось, существование порта детектится.

да, а толку от этого..

Автор: kuzulis 28.10.2014, 23:12

Цитата
Если порт есть, но к нему не подключен кабель, то этот порт нельзя открыть, и, соответственно, записать в него также ничего нельзя. Но это уже похоже на фишечку драйвера виртуального ком-порта, и ее никак не исправишь наверное...


Это значит что устройства (активного устройства типа "последовательный порт", или любого другого - неважно) НЕТ! И это никакая не фишечка драйвера. Это Windows ОС просто кеширует у-ва чтобы вновь не создавать симлинки при подключении этого-же устройства в этот-же USB порт (или просто того-же у-ва).

Вот, воткнул ты к примеру USB флешечку она определилась как диск Z, потом ты выдернул ее. Потом проенумеровал все USB mass-storage устройства которые когда-то были подключены к системе.. Нашел у-во которое было диском Z и попытался открыть.. И.. надеешься считать файлики из Z которого сейчас нету? Гы. :) Вместо флешки можешь попробовать любое USB у-во (да хоть Audio карту, хоть USB мышку, хоть черта лысого и прочее).

Кроме того никто не запрещает в диспетчере у-в отобразить "hidden" устройства и удалить их. Тогда не будет никаких таких у-в перечисляться.

Цитата
да, а толку от этого..


А я тебя же предупреждал что все это хрень, но куда уж мне.. Ты-же у нас спец. :)

Автор: borune 29.10.2014, 7:51

Цитата(kuzulis @ 28.10.2014, 23:12) *
Цитата
Если порт есть, но к нему не подключен кабель, то этот порт нельзя открыть, и, соответственно, записать в него также ничего нельзя. Но это уже похоже на фишечку драйвера виртуального ком-порта, и ее никак не исправишь наверное...


Это значит что устройства (активного устройства типа "последовательный порт", или любого другого - неважно) НЕТ! И это никакая не фишечка драйвера. Это Windows ОС просто кеширует у-ва чтобы вновь не создавать симлинки при подключении этого-же устройства в этот-же USB порт (или просто того-же у-ва).


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


Цитата(kuzulis @ 28.10.2014, 23:12) *
А я тебя же предупреждал что все это хрень, но куда уж мне.. Ты-же у нас спец.

я, кажется, принес свои извинения

Автор: kuzulis 29.10.2014, 11:47

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


О каком порте речь? Об USB об SerialPort? Опять каша? :)

Если имеется ввиду это:

Цитата
PC (железный COM1) RS232 [ ] <-- кабель (RS232/TTL например DB9 и прочее) --> [ некий девайс ]


То у-во COM1 будет открываться в любом случае пока сам чип (который внутри PC не сгорел и фунциклирует).
RS232 - это "низкоуровневый" интерфейс, он не определяет, подключено что-то или нет к его Rx/Tx и прочим линиям.
Поэтому, подключен (или нет) некий девайс на том конце - без разницы - мы никогда это не узнаем пока не попробуем туда
что-нить отправить/принять. COM1 всегда будет активен в ОС вне зависимости от того воткнул ли кто-то что-то к нему через RS232 кабель.

Если имеется ввиду это:

Цитата
PC (вирт. COM1) USB[ ] <-- кабель (USB) --> [USB/Serial конвертер] <--- кабель (RS232/TTL например DB9 и прочее) --> [ некий девайс ]


То у-во COM1 будет открываться в любом случае пока подключен USB кабель к USB/Serial конвертеру и пока конвертер не сгорел.
Как только USB/Serial конвертер отключится - COM1 "исчезнет" из системы и станет hidden.
Далее, если подключить что-то к конвертеру кабелем RS232 (или не подключать) - нам без разницы, т.к. COM1 всегда откроется.мы никогда это не узнаем пока не попробуем туда
Но мы не может "программно" узнать что что-то подключено или нет на том конце RS232 пока что-нить не отправим/примем.

Автор: borune 29.10.2014, 12:23

Имеется ввиду виртуальный порт. Конвертер USB/Serial находится в самом девайсе, поэтому, по идее, при выключенном девайсе конвертер тоже должен быть выключен. При этом порт в диспетчере виден и программно доступен. Не понятно почему.

Автор: kuzulis 29.10.2014, 14:27

Цитата(borune @ 29.10.2014, 12:23) *
Не понятно почему.


Потому что по USB подается питание (5V) на USB/Serial конвертер и => все будет "работать" :).

Автор: borune 29.10.2014, 15:04

Цитата(kuzulis @ 29.10.2014, 14:27) *
Потому что по USB подается питание (5V) на USB/Serial конвертер и => все будет "работать" :).

а ведь ты чертовски прав

Автор: casper17 17.1.2015, 11:14

Добрый день. Подскажите пожалуйста почему у меня чтение с COM порта одного сообщения происходит за несколько раз? С Atmega8 отправляю данные массив unsigned char x[10]="";

    
            x[0]='p';
            x[1]='r';
            x[2]='i';
            x[3]='v';
            x[4]='e';
            x[5]='t';
            x[6]='1';
            x[7]='2';
            x[8]='3';
            x[9]='\0';
            uart_puts(x);
            _delay_ms(1000);

А принимает их за несколько раз
Раскрывающийся текст
void MainWindow::readData()
{
    qDebug() << "Razmer        : " << serial->bytesAvailable();
             data=serial->readAll();
             qDebug() << "Name        : " << data;
          ui->label->setText(data);
    qDebug() << "///////////////////";

Razmer        :  3
Name        :  "pri"
///////////////////
Razmer        :  4
Name        :  "vet1"
///////////////////
Razmer        :  2
Name        :  "23"
///////////////////
Razmer        :  2
Name        :  "pr"
///////////////////
Razmer        :  4
Name        :  "ivet"
///////////////////
Razmer        :  3
Name        :  "123"
///////////////////


Если попробовать цикл do while и добавлять к старому сообщению новое то
Раскрывающийся текст
serial = new QSerialPort(this);
    serial->setPortName("com4");
    if(serial->open(QIODevice::ReadWrite)){

        serial->setBaudRate(QSerialPort::Baud9600);
        serial->setDataBits(QSerialPort::Data8);
        serial->setParity(QSerialPort::NoParity);
        serial->setStopBits(QSerialPort::OneStop);
        serial->setFlowControl(QSerialPort::NoFlowControl);
        ui->label->setText("OK");
}
else
    {
        ui->label->setText("NO CONNECT");
    }
connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));

void MainWindow::readData()
{
    qDebug() << "Razmer        : " << serial->bytesAvailable();
    do {
            data.append(serial->readAll());
             qDebug() << "Name        : " << data;
     } while (serial->waitForReadyRead(50));
    ui->label->setText(data);
    qDebug() << "///////////////////";
}

Razmer        :  2
Name        :  "pr"
///////////////////
Razmer        :  7
Name        :  "privet123"
///////////////////
Razmer        :  1
Name        :  "privet123p"
///////////////////
Razmer        :  8
Name        :  "privet123privet123"
///////////////////

Почему он не принимает сразу его целиком?

Автор: lanz 17.1.2015, 12:37

Потому что в COM порте нет такого понятия "сообщение", он работает побайтово. Побайтово принимает и побайтово отправляет.
https://ru.wikipedia.org/wiki/Универсальный_асинхронный_приёмопередатчик

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)