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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: qextserialport windows gui  (Прочитано 11499 раз)
lecas
Гость
« : Июль 09, 2010, 18:04 »

Для работы с портами использую qextserialport, если в файле проекта закоментировать
Код:
CONFIG  +=console
приложение не компилется
Код:
c:/qt/2010.02.1/mingw/bin/../lib/gcc/mingw32/4.4.0\libgcc_eh.a(unwind-dw2.o): In function `Unwind_Resume':
C:\MinGW\src\gccbf\mingw32\libgcc/../../../gcc-4.4.0/libgcc/../gcc/unwind.inc:220: multiple definition of `_Unwind_Resume'
./serialport/build\libqextserialportd.a(d000016.o):(.text+0x0): first defined here
collect2: ld returned 1 exit status
Записан
labview
Гость
« Ответ #1 : Август 06, 2010, 13:11 »

Я этой настройки в qextserialport.pro не нашёл, и даже если она там была бы, зачем её закоменнтировать?
У меня компилируется нормуль, сначала
qmake qextserialport.pro
а потом
make

Но у меня есть другая проблема, не компилируется пример enumerator, при чём на работе получилось его скомпилировать, а дома не могу. Комп один и тот же. У меня такое чуство, что там есть небольшой, но очень неприятный баг, при обращении к registry. Сегодня ещё раз попробую скомпилировать на работе, и если получится, то подтвердится.
Дело в том, что у меня заинсталлировано около 30 портов. Все они виртуальные, 4 из них USB-шные, а остальные Ethernet-ские. При этом, если USB адаптер не подключен, то и порт из device manager исчезает, но Ethernet-ские хоть подключены, хоть нет остаются в device manager. То есть адаптера нет, а порт есть (но наполовину). И мне кажется в этом месте компайлер ошибочно ищет инфу в registry. Ошибка какая то, что референс не найден. Хотя по идее компайлер должен компилировать приложение, а не искать данные в регистрах.
Может быть я ошибаюсь.

Другие два примера прекрасно компилируются и выполняются.
Записан
labview
Гость
« Ответ #2 : Август 06, 2010, 14:03 »

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

Спасибо.

Код:
C:\MinGW\bin\mingw32-make.exe: Entering directory `D:/C++/qextserialport-1.2win-alpha/examples/enumerator-build-desktop' 
C:/MinGW/bin/mingw32-make.exe -f Makefile.Debug
mingw32-make.exe[1]: Entering directory `D:/C++/qextserialport-1.2win-alpha/examples/enumerator-build-desktop'
g++ -c -g -Wall -frtti -fexceptions -mthreads -D_TTY_WIN_ -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I'c:/Qt/4.6.3/include/QtCore' -I'c:/Qt/4.6.3/include/QtGui' -I'c:/Qt/4.6.3/include' -I'../../../qextserialport-1.2win-alpha' -I'c:/Qt/4.6.3/include/ActiveQt' -I'moc' -I'.' -I'c:/Qt/4.6.3/mkspecs/win32-g++' -o obj/main.o ../enumerator/main.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-subsystem,console -mthreads -Wl -o debug/enumerator.exe obj/main.o -L'../../build' -L'c:/Qt/4.6.3/lib' -lqextserialportd -lQtGuid4 -lQtCored4
mingw32-make.exe[1]: Leaving directory `D:/C++/qextserialport-1.2win-alpha/examples/enumerator-build-desktop'
C:\MinGW\bin\mingw32-make.exe: Leaving directory `D:/C++/qextserialport-1.2win-alpha/examples/enumerator-build-desktop'
../../build/libqextserialportd.a(qextserialenumerator.o): In function `ZN20QextSerialEnumerator17getDevicePropertyEPvP16_SP_DEVINFO_DATAm':
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:53: undefined reference to `_imp__SetupDiGetDeviceRegistryPropertyW@28'
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:55: undefined reference to `_imp__SetupDiGetDeviceRegistryPropertyW@28'
../../build/libqextserialportd.a(qextserialenumerator.o): In function `ZN20QextSerialEnumerator12setupAPIScanER5QListI12QextPortInfoE':
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:68: undefined reference to `_imp__SetupDiGetClassDevsW@16'
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:83: undefined reference to `_imp__SetupDiEnumDeviceInterfaces@20'
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:87: undefined reference to `_imp__SetupDiGetDeviceInterfaceDetailW@24'
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:96: undefined reference to `_imp__SetupDiGetDeviceInterfaceDetailW@24'
D:/C++/qextserialport-1.2win-alpha/qextserialenumerator.cpp:106: undefined reference to `_imp__SetupDiOpenDevRegKey@24'
collect2: ld returned 1 exit status
mingw32-make.exe[1]: *** [debug/enumerator.exe] Error 1
C:\MinGW\bin\mingw32-make.exe: *** [debug] Error 2
Записан
labview
Гость
« Ответ #3 : Август 07, 2010, 14:23 »

Скомпилировать и слинковать удалось, но только если используется динамическая линковка.
Вопрос по самой библиотеке - в ней используются несколько DEFINE для Baud Rate. Неужели нельзя самому задать свою Baud Rate?
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #4 : Август 07, 2010, 21:08 »

можно добавить BAUD до мегабита.
Записан
labview
Гость
« Ответ #5 : Август 08, 2010, 21:49 »

Я нашёл только вот это:

Код:
00078                   {
00079     BAUD50,                //POSIX ONLY
00080     BAUD75,                //POSIX ONLY
00081     BAUD110,
00082     BAUD134,               //POSIX ONLY
00083     BAUD150,               //POSIX ONLY
00084     BAUD200,               //POSIX ONLY
00085     BAUD300,
00086     BAUD600,
00087     BAUD1200,
00088     BAUD1800,              //POSIX ONLY
00089     BAUD2400,
00090     BAUD4800,
00091     BAUD9600,
00092     BAUD14400,             //WINDOWS ONLY
00093     BAUD19200,
00094     BAUD38400,
00095     BAUD56000,             //WINDOWS ONLY
00096     BAUD57600,
00097     BAUD76800,             //POSIX ONLY
00098     BAUD115200,
00099     BAUD128000,            //WINDOWS ONLY
00100     BAUD256000             //WINDOWS ONLY
00101 };

Как можно добавить другие?
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #6 : Август 09, 2010, 09:07 »

Придется поправить файл win_qextserialport.cpp.
В void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) для Windows добавить

после
            /*256000 baud*/
            case BAUD256000:
                TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 256000 baud operation.");
                Win_CommConfig.dcb.BaudRate=CBR_256000;
                break;

добавить

            /*512000 baud*/
            case 22:
            /*1024000 baud*/
            case 23:
               
                Win_CommConfig.dcb.BaudRate=baudRate;
                break;


Для Линукс аналогично поправить файл posix_qextserialport.cpp
Записан
labview
Гость
« Ответ #7 : Август 09, 2010, 11:18 »

Благодарю!!!
Записан
labview
Гость
« Ответ #8 : Август 09, 2010, 15:38 »

Скажите, а можно ведь просто добавить кейс default, ведь на самом деле ядро поддерживает "любую" Baud Rate !?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Август 09, 2010, 15:40 »

обычно на компе более чем 128кб/с работать не будет. на редких компах 256кб/с работает.
Записан

Юра.
labview
Гость
« Ответ #10 : Август 09, 2010, 15:52 »

Дело в том, что некоторые USB и многие Ethernet адаптеры поддерживают более высокие скорости передачи, но на самом деле обычный настоящий UART не поддерживает их.
Записан
labview
Гость
« Ответ #11 : Август 09, 2010, 17:18 »

В win_qextserialport.cpp добавил следующее:

Код:
        default:
                Win_CommConfig.dcb.BaudRate=baudRate;
                break;

В своей функции для конфигурации сделал следующее:

Код:
void SerialThread::open(QString newport, QString baud)
{
    BaudRateType baudrate = (BaudRateType)baud.toULong();
    port = new QextSerialPort(newport);
    port->setBaudRate(baudrate);
    port->setFlowControl(FLOW_OFF);
    port->setParity(PAR_NONE);
    port->setDataBits(DATA_8);
    port->setStopBits(STOP_2);
    port->setTimeout(500);
}

Вроде что то неправильно, скажите плиз почему  Улыбающийся
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #12 : Август 09, 2010, 19:18 »

Что неправильно то. В чем вопрос.  ф скорость более 256 реально использовал
Записан
labview
Гость
« Ответ #13 : Август 09, 2010, 19:50 »

Всё ок, перепутал передаваемые параметры сначала, всё ок теперь.
Да, скорости выше 256000 реально использовал, отвечаю.

Вот с этим адаптером под Виндой если что:
http://www.cooldrives.com/ettose.html
Записан
labview
Гость
« Ответ #14 : Август 09, 2010, 20:26 »

Сделал так:

Код:
void SerialThread::run()
{
    char buff[1024];
    int numBytes = 0;
    if(port->isOpen())
        {
            numBytes = port->bytesAvailable();
            if(numBytes >0)
            {
                port->read(buff, numBytes);
                emit this->RX(buff);
            }
            else
            {
                this->msleep(100);
            }
        }
    else
        {
            this->msleep(100);
        }
}

Но уже при старте проги при закрытом порте, по какой то причине port->isOpen() выдаёт TRUE, и прога вылетает.
Что то не так?

Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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