Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QSerialDevice - Библиотека для работы с COM-портами
Форум на CrossPlatform.RU > Административный > Crossplatform.ru - все о нем > Обсуждение исходников с сайта
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
Litkevich Yuriy
Цитата(Гость_Гость_* @ 17.6.2010, 14:31) *
как варнинги победить?
pqo-файл исправить, где-то дважды засунут winregkeyreader.cpp в SOURCES
Boevik
Подскажите пожалуйста, как добавить данную библиотеку к моему проекту?
Скомпилировал библиотеку в интегрированном виде, получил "libqserialdevice.a". Положил её в "C:\Qt\2010.04\qt\lib\". В файл проекта добавил "LIBS += -lqserialdevice". В cpp-файл добавил "#include <AbstractSerial.h>". При компиляции ошибка:
Цитата
mainwindow.cpp:4:28: error: AbstractSerial.h: No such file or directory
Litkevich Yuriy
это всё потому-что kuzulis, не сделал нормального pri-файла, надо его пинать, чтобы сделал.
kuzulis
Boevik,

посмотрите как ЭТО сделано в примерах /examples.
И не нужно ничего копировать в "C:\Qt\2010.04\qt\lib\"


Litkevich Yuriy,

все там с *.pri нормуль. Хто хочет - сделает сам если что. :)
Litkevich Yuriy
Цитата(kuzulis @ 6.7.2010, 0:49) *
Хто хочет - сделает сам если что.
вот поэтому я и не использую твою библиотеку, также как и QxtSerialPort
Boevik
kuzulis, в примерах подключается "#include <abstractserial.h>", этот файл так же не находит при компиляции.

kuzulis
Цитата
kuzulis, в примерах подключается "#include <abstractserial.h>", этот файл так же не находит при компиляции.

Ёлки, посмотрите в любой файл *.pro из /examples . Там все видно что и как.

Цитата
вот поэтому я и не использую твою библиотеку, также как и QxtSerialPort

Да я тоже не использую ни QextSerialPort ни QSerialDevice. Ты не один такой! :)
Boevik
Цитата(kuzulis @ 6.7.2010, 8:24) *
Ёлки, посмотрите в любой файл *.pro из /examples . Там все видно что и как.

Мне не нужны в моем проекте чужие исходники. Какие еще есть способы установки данной библиотеки?
kuzulis
Ппц. :blink: :blink: :blink: :blink: :blink: :blink: :blink:
Litkevich Yuriy
Цитата(Boevik @ 6.7.2010, 20:58) *
Какие еще есть способы установки данной библиотеки?
видимо ни какого, как и в случае с любой другой библиотекой
bukap
Добрый день!

Регулярно работаю с устройствами, подключаемыми с помощью последовательного интерфейса к компьютеру. Интерфейсы разрабатываю на MFC, для связи с устройствами использую Windows API, ActiveX Microsoft Communication Control version 6.0.

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

Библиотеки:
QextSerialPort v.1.2 beta
QSerialSevice v 0.2.0

Среда разработки:
Qt Creator 2.0
Qt SDK 4.6.3

Платформа:
Microsoft Windows XP [Версия 5.1.2600] Service Pack 3

Последовательные порты:
1. Стандартный последовательный порт установленный на материнской плате
2. Prolific USB-to-Serial Comm Port
3. USB-SERIAL CH340
4. CP210x USB to UART Bridge Controller
5. PIC18F2550/4550 CDC RS-232 Emulation Microchip Technology Inc

QextSerialPort
Библиотека не поддерживает последовательные порты с нумерацией выше COM9. Устраняется добавлением в путь к открываемому порту указания на устройство “\\\\.\\” Для этого вносятся изменения в файл win_qextserialport.cpp.

CODE
bool Win_QextSerialPort::open(OpenMode mode) {
unsigned long confSize = sizeof(COMMCONFIG);
Win_CommConfig.dwSize = confSize;
DWORD dwFlagsAndAttributes = 0;
if (queryMode() == QextSerialBase::EventDriven)
dwFlagsAndAttributes += FILE_FLAG_OVERLAPPED;

LOCK_MUTEX();
if (mode == QIODevice::NotOpen)
return isOpen();
if (!isOpen()) {
/*open the port*/
Win_Handle=CreateFileA(("\\\\.\\" + port).toAscii(), GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);



}


QSerialSevice
Библиотека возвращает не верный статус линии. Устраняется исправлением типа данных с bool на ulong. Для этого вносятся изменения в файл abstractserial.cpp.

CODE
ulong AbstractSerial::lineStatus()
{
Q_D(AbstractSerial);
if (isOpen()) {
ulong ret = d->serialEngine->lineStatus();
if (!ret)
emitStatusString(ELineStatus);
return ret;
}
emitStatusString(EDeviceIsNotOpen);
return false;
}


Так же библиотека не смогла открыть последовательный порт PIC18F2550/4550 CDC RS-232 Emulation Microchip Technology Inc, при вызове функции открытия порта возникает ошибка из-за неудачного снятия состояния BREAK функцией ClearCommBreak. Устраняется комментированием строки ret = false;. После комментирования функциональность класса не изменяется, так как наличие вызова данной функции не обосновано.

CODE
bool NativeSerialEnginePrivate::nativeReset()
{



// cброс регистров порта. (reset device registers)
if (::ClearCommBreak(hd) == 0) {
#if defined (NATIVESERIALENGINE_WIN_DEBUG)
qDebug("Windows: NativeSerialEnginePrivate::nativeReset() \n"
" -> function: ::ClearCommBreak(hd) returned: 0. Error! \n");
#endif
// ret = false;



}

kuzulis
2 bukap,

Цитата
QSerialSevice
Библиотека возвращает не верный статус линии. Устраняется исправлением типа данных с bool на ulong. Для этого вносятся изменения в файл abstractserial.cpp.


Спс, мой косяк, недоглядел... Сегодня постараюсь исправить.

Цитата
Так же библиотека не смогла открыть последовательный порт PIC18F2550/4550 CDC RS-232 Emulation Microchip Technology Inc, при вызове функции открытия порта возникает ошибка из-за неудачного снятия состояния BREAK функцией ClearCommBreak. Устраняется комментированием строки ret = false;. После комментирования функциональность класса не изменяется, так как наличие вызова данной функции не обосновано.

Берите версию из Git. Теперь там при открытии не используется метод nativeReset(), т.е. его вызов закоментирован.

Цитата
1. Стандартный последовательный порт установленный на материнской плате
2. Prolific USB-to-Serial Comm Port
3. USB-SERIAL CH340
4. CP210x USB to UART Bridge Controller
5. PIC18F2550/4550 CDC RS-232 Emulation Microchip Technology Inc


Со всеми ли этими устройствами корректно работает класс SerialDeviceWatcher и SerialDeviceInfo ?
bukap
Со всеми перечисленными устройствами была достигнута корректная работа.
good835
Добрый день!

Задача: Прошивка программного обеспечения через com порт в режиме с управлением потоком
на скоростях 115200 и 230400 бит/с

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

Платформа:
Microsoft Windows XP Service Pack 2

Среда сборки
Qt Creator 2.0

Версии библиотеки
1. QSerialDevice 0.2.0
2. QSerialDevice из репозитария git http://gitorious.org/qserialdevice (от 3 августа)

Последовательные порты:
1. Cтандартный последовательный порт установленный на материнской плате
2. Prolific USB-to-Serial Comm Port
3. Moxa UPort 1110 1-портовый преобразователь USB в RS-232
4. Moxa NPort 510 преобразователь Ethernet в RS-232
5. Virtual Serial Ports Driver XP фирмы Eltima Software


Первый вопрос по QSerialDeviceWatcher:
Версия 0.2.0 - выдавался список всех портов в системе п.1-5 (с проверкой записи данных в порт)
Версия git - выдается только список "железных" портов в системе п.1-3
Первое что я заметил, это то что происходит чтение из другого места в реестре.

Второй вопрос по использованию нестандартной скорости передачи 230400 бит/с, которую поддерживают
порты Prolific USB2Comm и Moxa UPort 1110
Версия 0.2.0 - после добавления в список ряда скоростей соответствующей константы передача данных осуществлялась без ошибок
Версия git - на скорости 115200 бит/с передача данных осуществляется без ошибок, а на скорости 230400 бит/с порт успешно открывается,
задаются параметры, но далее при передаче данных происходит сбой с выдачей следующего сообщения
Windows: NativeSerialEnginePrivate::nativeWrite(const char *data, qint64 len)
-> function: ::::WaitForSingleObject(this->oTx.hEvent, 5000) returned: 258 . Error!

Третий вопрос:
Произвожу отправку данных в порт функцией qint64 AbstractSerial::write(const char *data, qint64 maxSize)
Каким образом можно задать таймаут на выполнение данной функции, так как в случае ошибки передачи данных поисходит зависание программы,
например, при разрыве кабеля
kuzulis
2 good835,

Цитата
Первый вопрос по QSerialDeviceWatcher:
Версия 0.2.0 - выдавался список всех портов в системе п.1-5 (с проверкой записи данных в порт)
Версия git - выдается только список "железных" портов в системе п.1-3
Первое что я заметил, это то что происходит чтение из другого места в реестре.

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

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Serenum\\Enum
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Ser2pl\\Enum
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\usbser\\Enum
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\lowcdc\\Enum

тут приведены пути в которых прописаны девайсы п.1-3 ... Для виртуальных портов наверное есть какие то другие пути.

Запустите диспетчер устройств, выберите девайс (п.4-5) и в вкладке "сведения" конкретного порта покажите мне что есть в значении :

"Код экземпляра устройства"
"Служба"
"Верхние фильтры устройства"

Цитата
Второй вопрос по использованию нестандартной скорости передачи 230400 бит/с, которую поддерживают
порты Prolific USB2Comm и Moxa UPort 1110
Версия 0.2.0 - после добавления в список ряда скоростей соответствующей константы передача данных осуществлялась без ошибок
Версия git - на скорости 115200 бит/с передача данных осуществляется без ошибок, а на скорости 230400 бит/с порт успешно открывается,
задаются параметры, но далее при передаче данных происходит сбой с выдачей следующего сообщения
Windows: NativeSerialEnginePrivate::nativeWrite(const char *data, qint64 len)
-> function: ::::WaitForSingleObject(this->oTx.hEvent, 5000) returned: 258 . Error!


Ну тут не знаю, тут почему-то WaitForSingleObject не дожидается события от порта что данные записаны.. Короче таймаут ожидания 5 секунд срабатывает.
Попробуйте выставить таймаут 10 секунд = 10000 ... Если честно, я не знаю почему эта ошибка происходит.
Код я брал "стандартный" предложенный $MS, так что не знаю... 8)

Цитата
Третий вопрос:
Произвожу отправку данных в порт функцией qint64 AbstractSerial::write(const char *data, qint64 maxSize)
Каким образом можно задать таймаут на выполнение данной функции, так как в случае ошибки передачи данных поисходит зависание программы,
например, при разрыве кабеля


Ух... тут это наверное возникает изза "режиме с управлением потоком" . Если это так, то я не сталкивался с этими особенностями и даж не представлю куда копать...
Хотя, попробуйте в методе:
void NativeSerialEnginePrivate::prepareOtherOptions()
{
    this->cc.dcb.fBinary = true;
    this->cc.dcb.fInX = this->cc.dcb.fOutX = this->cc.dcb.fAbortOnError = this->cc.dcb.fNull = false;
}

для this->cc.dcb.fAbortOnError = true; (вместо false)!!!
good835
2 kuzulis,
Насколько я понял QSerialDeviceWatcher версии 0.2.0 читал данные о портах в системе по следующей ветке:
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
она у меня выглядит следующим образом
"\\Device\\Serial0"="COM1"
"\\Device\\Serial1"="COM2"
"\\Device\\mxuport0"="COM14"
"\\Device\\mxuport1"="COM13"
"\\Device\\VSerial0"="COM20"
"\\Device\\VSerial1"="COM21"
"Npdrv8"="COM8"
"Npdrv7"="COM7"

В диспетчере устройств Виртуальные порты (COM20 COM21 из п.5) идут отдельной строкой
Eltima Virtual Serial Port(COM20->COM21)
Eltima Virtual Serial Port(COM21->COM20)
"Код экземпляра устройства" VSBUS\DEVICES\0000 и VSBUS\DEVICES\0001
"Служба" vserial
"Верхние фильтры устройства") пусто

по moxa ethernet 2 com - сейчас оно не подключено и возможно поэтому его нет в диспетчере устройств
а так это "Npdrv8"="COM8", "Npdrv7"="COM7"
в программе NPort Administrator они конфигурируются следующим образом но это вряд ли поможет
[Summary]
Total_Server=1

[Server1]
APID=0x80000312
HWID=0x322
IP=192.168.0.170
Port1=1,7,0,1,1,12,0,3,0,0,5000
Port2=1,8,0,1,1,12,0,3,0,0,5000

Данные из реестра для moxa nport 5210 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npdrv]
"Group"="Extended base"
"Type"=dword:00000001
"Start"=dword:00000002
"ErrorControl"=dword:00000000
"ImagePath"=hex(2):5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,72,\
00,69,00,76,00,65,00,72,00,73,00,5c,00,6e,00,70,00,64,00,72,00,76,00,2e,00,\
73,00,79,00,73,00,00,00
"DisplayName"="npdrv"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npdrv\Parameters]
"Ports"=dword:00000002
"Servers"=dword:00000001
"SessionRecovery"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npdrv\Parameters\Server1]
"APID"=dword:80000312
"HWID"=dword:00000322
"IPAddress"=dword:c0a800aa
"PortFlag"=hex:01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"COMNO"=hex:07,08,01,01,01,01,01,01,01,01,01,01,01,01,01,01
"TransmissionMode"=hex:01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"FIFO"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"FastFlush"=hex:01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"NetTimeOut"=hex:88,13,00,00,88,13,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npdrv\Security]
"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\
00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\
05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\
00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\
00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npdrv\Enum]
"0"="Root\\LEGACY_NPDRV\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001

Данные из реестра для виртуальных портов
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vserial]
"Type"=dword:00000001
"Start"=dword:00000003
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
52,00,49,00,56,00,45,00,52,00,53,00,5c,00,76,00,73,00,65,00,72,00,69,00,61,\
00,6c,00,2e,00,73,00,79,00,73,00,00,00
"DisplayName"="ELTIMA Virtual Serial Ports Driver"
"Group"="Extended Base"
"ForceFifoEnable"=dword:00000001
"RxFIFO"=dword:00000008
"TxFIFO"=dword:0000000e
"LogFifo"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vserial\Security]
"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\
00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\
05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\
00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\
00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vserial\Enum]
"0"="VSBUS\\DEVICES\\0000"
"Count"=dword:00000002
"NextInstance"=dword:00000002
"1"="VSBUS\\DEVICES\\0001"

Sorry, файлы не дает загрузить

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Serenum\\Enum - есть
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Ser2pl\\Enum - есть Ser2pl, но нет enum
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\usbser\\Enum - нет
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\lowcdc\\Enum - нет
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\mxuwdrv2\\ для moxa usb2com
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\vserial\\ для вирт портов
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\npdrv\\ для ethernet 2 com

остальное пока не пробовал
немного странно что версия 0.2.0 работала на скорости 230400 нормально, а последняя нет (



kuzulis
2 good835,

на основе ваших данных я попробовал добавить поддержку тех устройств которые вы перечислили. Обновляйте Git и пробуйте.
good835
2 kuzulis,

Еще раз по поводу списка портов в системе...
Все таки не могли бы вы пояснить почему сканируется реестр по ветке HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services
Сегодня еще раз попробовал версию 0.2.0 - она отлично видит список всех последовательных портов в системе
по [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM] и нормально работает со всеми типами портов
с аппратными, usb2com, и ethernet2com на скорости 230400 бит/с
Я разговаривал с человеком который занимался подобным вопросом, он сказал что также работал с веткой
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]

Версия из git
Теперь видит виртуальные порты (Eltima Virtual Serial Port), а порты ethernet2com по прежнему отсутствуют

2 kuzulis,

Подскажите существует ли возможность с помощью вашей библиотеки задать параметры таймаута для последовательного порта при записи данных
конкретнее, WriteTotalTimeoutMultiplier, WriteTotalTimeoutConstant http://msdn.microsoft.com/en-us/library/aa...0(v=VS.85).aspx
kuzulis
Цитата
Все таки не могли бы вы пояснить почему сканируется реестр по ветке HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services
Сегодня еще раз попробовал версию 0.2.0 - она отлично видит список всех последовательных портов в системе
по [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM] и нормально работает со всеми типами портов
с аппратными, usb2com, и ethernet2com на скорости 230400 бит/с
Я разговаривал с человеком который занимался подобным вопросом, он сказал что также работал с веткой
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]


См. почему я изменил ветку от этого поста и ниже по постам.

Цитата
Теперь видит виртуальные порты (Eltima Virtual Serial Port), а порты ethernet2com по прежнему отсутствуют


Напишите сюда что точно видно в диспетчере устройств по тэгу "Служба" при наличии ethernet2com порта. Я так понимаю это девайс от MOXA?

Цитата
Подскажите существует ли возможность с помощью вашей библиотеки задать параметры таймаута для последовательного порта при записи данных
конкретнее, WriteTotalTimeoutMultiplier, WriteTotalTimeoutConstant http://msdn.microsoft.com/en-us/library/aa...0(v=VS.85).aspx


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




good835
ethernet2com - это moxa nport 5210 - в диспетчере устройств его нет
в реестре, это HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]"Npdrv8"="COM8" "Npdrv7"="COM7"
плюс HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npdrv, но вы его уже добавили в список
(подробнее этот параметр я приводил выше)

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

По поводу таймаутов пока думаю, разбираюсь что к чему.
kuzulis
Цитата
Если я правильно понимаю, смена ветки нужна для корректного слежения за физически подключенными портами в системе?


Нет. Это нужно для этого, пример:

1. Допустим либа 0.2.0
1.0. Запустили SerialDeviceWatcher.
1.1. Открыли порт методом open и работаем с ним.
1.2. Выдернули физически сам usb/serial конвертер из USB порта компутера.

Результат: SerialDeviceWatcher не зафиксирует событие о том что порт извлечен, т.к. записи в реестре для этого порта по путям (в 0.2.0.) останутся неизменными.

2. Допустим либа Git
2.0. Запустили SerialDeviceWatcher.
2.1. Открыли порт методом open и работаем с ним.
2.2. Выдернули физически сам usb/serial конвертер из USB порта компутера.

Результат: SerialDeviceWatcher зафиксирует момент извлечения устройства, т.к. записи по путям (в Git) автоматически удалятся!!!

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

Ну, за все нужно платить. Это закон природы: в чемто выигрываем, а в чем то проигрываем.
На то и имеются исходники чтобы добавлять туда поддержку новых девайсов.
Тем более, их не стопицот тыщ, а с несколько десятков. :)
Тем более, если вы соберете библиотеку как *.dll/*.so то вам не придется перекомпилировать все приложение, а только библиотеку! ;)

Цитата
ethernet2com - это moxa nport 5210 - в диспетчере устройств его нет

ну так и не будет значит и либа детектить эти порты!
good835
Из документации MOXA NPORT
"Обратите внимание, что виртуальные порты MOXA НЕ отображаются в списке последовательных
портов в «Диспетчере Устройств» Windows. Это нормальное поведение для виртуальных COM-
портов: они не будут отображены в списке устройств Windows, но, при корректной настройке, будут
доступны для работы любому приложению." ???
kuzulis
Цитата
Из документации MOXA NPORT
"Обратите внимание, что виртуальные порты MOXA НЕ отображаются в списке последовательных
портов в «Диспетчере Устройств» Windows. Это нормальное поведение для виртуальных COM-
портов: они не будут отображены в списке устройств Windows, но, при корректной настройке, будут
доступны для работы любому приложению." ???


Ну, имхо, тогда никак не получится.
kuzulis
Сегодня добавил новый класс SerialDeviceEnumerator который в будущем должен заменить два класса: SerialDeviceWatcher+SerialDeviceInfo (т.е. я их планирую удалить вообще). В новом классе по идее должны работать любые девайсы.. Прошу потестить.
Litkevich Yuriy
Цитата(kuzulis @ 12.8.2010, 23:59) *
класс SerialDeviceEnumerator который в будущем должен заменить два класса: SerialDeviceWatcher+SerialDeviceInfo (т.е. я их планирую удалить вообще)
не согласен с именованием и объединением.
Название SerialDeviceEnumerator удачно и привычно. Он может заменить SerialDeviceInfo
А вот SerialDeviceWatcher всё-таки должен быть автономным (пусть внутри он и обращается к перечислителю портов, его можно сделать дружественным для перечислителя).
kuzulis
Цитата
не согласен с именованием и объединением.


Я тоже сомневался. Просто я "существенно" изменил алгоритм и реализацию SerialDeviceInfo и поэтому "пришлось" их объединить.

Цитата
А вот SerialDeviceWatcher всё-таки должен быть автономным (пусть внутри он и обращается к перечислителю портов, его можно сделать дружественным для перечислителя).


Поподробнее пжлста.
Litkevich Yuriy
Цитата(kuzulis @ 13.8.2010, 0:54) *
Поподробнее пжлста.
Я не знаю как он у тебя работает/должен_применятся.
Я думаю, что по аналогии с QFileSystemWatcher. Т.е. подключился к его сигналу, если сигнал сработает, то приложение как-то на него реагирует.

При статической сборке с приложением, если не нужен этот класс, можно его подключать - удобно
kuzulis
Цитата
Я не знаю как он у тебя работает/должен_применятся.


Ну так исходники SerialDeviceEnumerator же есть !

Фишка в том, что в реализации SerialDeviceEnumerator теперь всЁ упрощего и унифицировано, т.е.
при изменении (втыкании/вытыкании) порта теперь автоматом перечисляются все оставшиеся устройства в системе и обновляется инфа о них в мапе
QMap<QString, SerialInfo>


т.е. для получения инфы об нужном у-ве мы в данном случае просто берем уже готовую инфу для интересующего у-ва из мапы и нет необходимости для ее получения вызывать OS API. т.е. если у-во в наличии в мапе - то оно, естественно, в наличии и в ОС!!!

Получается еще удобнее чем было раньше.
Ну подумаешь, что теперь SerialDeviceEnumerator включает в себя Watcher + Info ... Ну и что с того?

Если делать как ты говоришь, то все-равно придется в Watcher включать код от Info и т.п. так какая разница? :)
good835
2 kuzulis,
если можно есть пара вопросов:
1. не получается обработать ошибку установки параметров скорости для порта, для порта на плате задаю скорость которую он не поддерживает 230400 бод, естественно возникает ошибка установки
Windows: NativeSerialEnginePrivate::nativeSetBaudRate(AbstractSerial::BaudRate baudRate)
-> function: ::SetCommConfig(this->m_descriptor, &this->cc, sizeof(COMMCONFIG)) returned: 0. Error
для обработки ошибки делаю так (как у вас в доке)
MyDevice = new AbstractSerial();
MyDevice->enableEmitStatus(true);
connect(MyDevice, SIGNAL(signalStatus(сonst QString,QDateTime)), this, SLOT(DisplayError(QString,QDateTime)));
и
void MyThread::DisplayError(QString& message, QDateTime cur_time){
qDebug() << "State: " << message << ", in time: " << cur_time.time().toString(); }
но в слот DisplayError я не попадаю, скорее всего, что это мой косяк, но пока не понимаю где...

2. можно ли сформировать список скоростей передачи поддерживаемых портом, аналогичный Диспетчер Устройств/Последовательный порт/Свойства/Параметры/Скорость передачи, что бы дать выбор при задании параметров порта, а не отлавливать ошибки при задании неверной конфигурации?
kuzulis
2 good835

1.
Цитата
не получается обработать ошибку установки параметров скорости для порта,

Т.е. вообще никакие ошибки не отлавливаются или только при установке скорости?

2.
Цитата
можно ли сформировать список скоростей передачи поддерживаемых портом, аналогичный Диспетчер Устройств/Последовательный порт/Свойства/Параметры/Скорость передачи, что бы дать выбор при задании параметров порта, а не отлавливать ошибки при задании неверной конфигурации?

Попробуйте использовать Win32 API ф-ю: GetCommProperties или что-нибудь подобное. Но не факт что оно получится. Иного решения я не знаю.
Но это не кроссплатформенное решение и поэтому я не буду это реализовывать (по крайней мере пока)
good835
2 kuzulis,
Цитата
Т.е. вообще никакие ошибки не отлавливаются или только при установке скорости?

Похоже что да, никакие, ни открытие, ни установка скорости, ни ошибка записи в порт
kuzulis
Значит что-то не так делаете
good835
2 kuzulis,
небольшое уточнение, попробовал поймать сигнал bytesWritten и вывести окошко, все получилось
connect(MyDevice, SIGNAL(bytesWritten(qint64)), this, SLOT(DisplayError3(qint64)));

а с
connect(MyDevice, SIGNAL(signalStatus(const QString,QDateTime)), this, SLOT(DisplayError(QString,QDateTime)));

по прежнему глухо, может что посоветуете?
MyDevice->enableEmitStatus(true);

нужно делать до коннекта или после?
good835
2 kuzulis,
sorry, с signalStatus разобрался, естественно это был мой косяк
rcdimon
Простите за ламерский вопрос, но как собрать и подключить библиотеку?

Открыл BuildLibrary.pro файл QTcreator'ом. Нажал собрать все. Получил какие-то файлы .o и .a... А где всякие .dll .lib? Или они не нужны?
И как теперь подключить их к своей программе?
Vatto
Здравствуйте. Во время использования библиотеки наткнулся на проблему : при открытии порта через библиотеку QSerialDevice порт открывается, но ничего принимать не хочет. Если открыть порт сначало в CommTest или в терминале, потом закрыть, и снова запустить приложение , то все работает отлично.
В чем может быть загвоздка. Версия из гита. Открываю порт как в примерах.
UsartTransmitter::UsartTransmitter(QObject *parent) 
UsartTransmitter::openPort()
UsartTransmitter::initPort()
Serial device  "COM4"  open in  OpenMode( "ReadWrite" )
= Defaults parameters =
Device name            :  "COM4"
Baud rate              :  "57600 baud"
Data bits              :  "8 bit"
Parity                 :  "None"
Stop bits              :  "1"
Flow                   :  "Disable"
Char timeout, msec     :  190
kuzulis
Цитата
Здравствуйте. Во время использования библиотеки наткнулся на проблему : при открытии порта через библиотеку QSerialDevice порт открывается, но ничего принимать не хочет.

Не имею ни малейшего понятия. У меня все работает как часы. Проверяйте сами.
Vatto
Прошу прощения. Ошибка видимо была моя. Сделал reset перед иницаилизацией праметров, и каждый задал жестко, без дефалтов и все заработало.
kuzulis
Цитата(Vatto @ 19.10.2010, 13:20) *
Прошу прощения. Ошибка видимо была моя. Сделал reset перед иницаилизацией праметров, и каждый задал жестко, без дефалтов и все заработало.

Все верно. QSerialDevive в отличии от других библиотек, при открытии порта не устанавливает параметры по умолчанию! Она только пытается определить текущие параметры! Пользователь должен сам конфигурировать порт после его открытия!
Читайте все-таки документацию!
lpn74
Добрый день!
Спасибо за библиотеку.
Существует ли такая проблемма:
При переоткрытии порта (методами OPEN и CLOSE соответственно) не вырабатывается сигнал ReadyRead?
Вернее, происходит следующее:
Переоткрыл - сигнал вырабатывается, ещё раз переоткрыл - НЕ вырабатывается, ещё раз переоткрыл - вырабатывается и т.д.
Заранее спасибо за ответы

В comport.h файле
private:
    AbstractSerial *port;

В comport.cpp

#include "comport.h"

ComPort::ComPort(QObject *parent) :
    QObject(parent)
{
    port = new AbstractSerial(this);
    port->setDeviceName("COM3");
    connect(port, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
}

void ComPort::sendData(const QByteArray &array)
{        

    port->close();
    qDebug()<< "Open port " << port->open(AbstractSerial::ReadWrite);
    qDebug() << "Write data" << port->write(array);        
}

void ComPort::slotReadyRead()
{
    qDebug() << "slotReadyRead()";
    QByteArray array = port->readAll();
    qDebug() << "array.size()=" << array.size();        
}
kuzulis
Какая ОС?
lpn74
Windows7
kuzulis
Только что пересмотрел тот код где вы переоткрываете и не увидел где вы конфигурируете порт! Может все-таки БУДЕМ ЧИТАТЬ ДОКУМЕНТАЦИЮ? ИЛИ КАК?

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

---

Вроде исправил, проверьте.
lpn74
Огромное спасибо!
Теперь работает :)
Гость
Возможно ли при установке параметров порта вместо:

commPort->setBaudRate(AbstractSerial::BaudRate19200);

использовать переменную типа QString, например:

QString baude = "19200";
commPort->setBaudRate(baude);

Если да то как правильно это реализовать?
kuzulis
Можно, только не
QString baude = "19200"

а
QString baude = "19200 baud"


Список всех имен скоростей которые можно подавать на вход см. вызвав метод: listBaudRate.
Гость
Спасибо работает.
Гость
Здравствуйте.
Можно ли с помощью вашей библиотеки открыть одновременно несколько портов?
В хедерном файле я прописал:
AbstractSerial *Por1t, *Port2, *Port3;
Инициализирую:
Port1->setDeviceName("/dev/ttyS0");
if(Port1->open(AbstractSerial::ReadWrite)){
.................
}

Port2->setDeviceName("/dev/ttyS1");
if(Port2->open(AbstractSerial::ReadWrite)){
.................
}

Port3->setDeviceName("/dev/ttyS2");
if(Port3->open(AbstractSerial::ReadWrite)){
.................
}
Открывает только первый.
kuzulis
Цитата
Можно ли с помощью вашей библиотеки открыть одновременно несколько портов?

Конечно можно!

Просто есть такой касяк/фича в *.nix , которая заключается в том, что при некорректном завершении программы (например при нажатии ctrl^c) библиотека не удаляет lock-файлы. И поэтому при следующем запуске оно не может открыть порт. Но если теперь еще раз запустить приложение - то порты корректно откроются... :)

Для меня это пока не существенный касяк, поэтому пока не исправляю его.

Просто необходимо перед закрытием приложения делать close() всем открытым портам и тогда всё будет хорошо.

Виталий
Просто есть такой касяк/фича в *.nix , которая заключается в том, что при некорректном завершении программы (например при нажатии ctrl^c) библиотека не удаляет lock-файлы. И поэтому при следующем запуске оно не может открыть порт. Но если теперь еще раз запустить приложение - то порты корректно откроются... :)

Мене кажется что проблема не в этом. Действительно если не закрыть порт при завершении роботы программы то он следующий раз не откроется. Но проблема состоит в том что после того как я инициирую и открываю первый из группы портов все следующие в списке не будут открыты, lock файл создается только для открытого порта (проверял через файловый менеджер /var/lock), если первый порт не будет открыт то открывается следующий из списка, а все остальные остаются закрытыми.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2022 IPS, Inc.