Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Перенос проекта Qt на WinRT |
Автор: LessNik 5.12.2015, 09:28 |
Добрый день, форумчане! У меня есть проект, разработанный на Qt C++, который работает с последовательными портами (аппаратными RS-232) под windows 7 используя boost. Gui сделан с использованием Qt Quick. Мне необходимо перенести проект на windows 8.1 под WINRT и добавить новые функции. В процессе переноса столкнулся со следующими проблемами: - Под winrt отсутствует поддержка последовательных портов (USB CDC, конвертеры - не вариант).Решается проблема с использованием костылей Brokered Component, писанном только на C# в visual studio. - Далее надеялся подгрузить то что получилось (dll) в Qt с использованием Active Qt. Однако Active Qt не поддерживается для winrt. Может кто-то уже сталкивался с подобными проблемами? Подскажите самый простой способ перенести проект и подружить Qt, QML, C++ , boost, STL и VS2013, WINRT, C#, MS COM. Я C# совсем не знаю и учить ради работы с Rs-232 желания особого нет. Также нет знаний и желания переписывать gui на XAML. Идеальный вариант - подгрузить в qt библиотеку, работающую с com портом, а всё остальное сделать в Qt. Но как это сделать? |
Автор: math64 6.12.2015, 02:37 |
В Qt 5 есть поддержка QSerialPort. Для старых версий её можно скачать отдельно и подключить к проекту. Она у Вас не работает? |
Автор: LessNik 6.12.2015, 09:07 |
QSerialPort тоже работать не будет под WinRT. Если бы под WinRT были API для работы с com портом, то и boost и Qt тоже бы уже давно поддержали работу с com портом. Нужно использовать Win32 API для работы с com портом в WinRT через Brokered Component. Или ждать и надеяться, что Microsoft добавит эти апи под winrt. |
Автор: kuzulis 7.12.2015, 12:14 |
Как вариант, использовать FTDI чип с драйвером D2xx: http://www.ftdichip.com/Support/Documents/InstallGuides/AN_271%20D2xx%20WinRT%20Guide.pdf (но, раз USB конвертеры - не вариант - то не вариант ![]() |
Автор: math64 7.12.2015, 12:22 |
У меня в XP все было наоборот. COM на материнке отсутствует, используется 1) гаджет, втыкающийся в USB, имеющий два COM порта на выходе 2) Bluetooth-USB на компьютере, Bluetooth-COM на внешнем устройстве, причем второй Bluetooth перед этим нужно подлючить к компьютеру через гаджет из первого пункта для настройки. Через двайвера этих гаджетов USB превращается в COM, причем номер порта может поменяться при перезарузке. В программе используется QSerialPort - как работать с USB напрямую из Qt я не знаю. Наколько я понял, с новым Windows это работать не будет. |
Автор: Guinness 7.12.2015, 12:43 |
WinRT делали для создания календариков, просмотра рецептиков и прочей никому не нужной хрени, по крайней мере, пока создается именно такое впечатление. Т.е. явно не для такой низкоуровневой работы, уж если там нельзя полноценно работать с COM\DCOM, то ожидать чего-то большего - оптимистично. Хотя работы в этом направлении ведутся(для 10ки). Единственное обходное решение, которое можно попробовать реализовать, это зафигчить локальный сервер, к которому можно подключиться через сокет. Этот сервер будет принимать команды и работать с подсистемой Win32. ЗЫ я так понимаю, Вы использовали Qt, собранную для WinRT, и в лоб решить проблему переноса не получилось? Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Perenos-proyekta-Qt-na-WinRT-id5662846aae2015536e8b4567#findElement_E7045_566554aaae20155f603b607d_0 |
Автор: LessNik 7.12.2015, 17:06 | ||||||||
Даже в этом случае не понятно как подключить .winmd в Qt, что равнозначно с решением на основе Brokered Component, т.е. снова использовать Visual Studio и переписывать GUI на XAML.
У меня тоже создаётся такое впечатление. ![]()
Да, Qt для WinRT. В лоб решить не удалось.
Я, конечно, не силён в серверах, но вот меня настораживает взаимодействие Qt и WCF сервиса. Это возможно? Или будет легче уже XAML выучить? ![]() Или можно как-то обойтись без WCF? |
Автор: math64 7.12.2015, 18:26 |
Сервер, как я понял, ещё одна машина, старая, но с работающими com-портами и сетевой картой. На неё лучше поставить linux или старую версию windows. На ней будет крутиться программа, получающая данные по сокету и передающая их на com и обратно. Монитор, клавиатуру и мышь можно не подключать. Можно использовать микроконтроллер, который может выполнить эту программу. |
Автор: kuzulis 7.12.2015, 21:11 |
Может это может что-то прояснить (слайды 15-25): https://channel9.msdn.com/events/BUILD/BUILD2011/HW-747T (взято из конца https://social.msdn.microsoft.com/Forums/en-US/4565b565-60d1-41d8-a8d0-8cf34596625c/is-there-any-way-to-use-winusb-from-a-metro-app?forum=tailoringappsfordevices) Там вроде-как рассказывают про доступ к кастомным девайсам. Еще вариант (если есть возможность использовать USB) - это использовать WinUSB API (хотя я не уверен что в WinRT это возможно). В этом случае можно передвавать данные и конфигурить сериал порт можно через USB пайпы (но надо смотреть даташит конкретной микрухи). Так, например в Android делают.. UPD: Посмотрел на описание как это делается для FTDI - там именно такая тема. Девайс устанавливается как "универсальное USB устройство". Для этого достаточно просто написать свой *.inf файлик в котором указать VID/PID и может что-то еще (надо посмотреть как там в FTDI делается). И тогда просто дергаем WinUSB-шные функции и наслаждаемся. ![]() Но если сериал порт втроенный в ARM - то это дохлый номер, IMHO.. UPD: А Bluetooth, Wifi не устраивают? |
Автор: Guinness 8.12.2015, 08:31 | ||||||
В общем, всё это здорово, но, грубо говоря, необходимо запилить свой драйвер совместимый с WinRT. https://dzone.com/articles/metro-answers-can-i-use-serial, https://code.msdn.microsoft.com/windowsapps/Custom-device-access-sample-43bde679, https://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.custom.customdevice.aspx.
А причём здесь WCF? =) Можно и с ним, конечно, но это уже на Ваш выбор.
В особо тяжёлых случаях это может быть та же машина. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Perenos-proyekta-Qt-na-WinRT-id5662846aae2015536e8b4567#findElement_E7045_56666b30ae201549743b6678_0 |
Автор: LessNik 8.12.2015, 13:33 | ||||||||
Это вообще не вариант. Напоминает ералаш про батарейки к часам http://www.youtube.com/watch?v=uG2sgVH-r7o
Вопрос не в том, как запилить драйвер, а как его подключить и использовать в Qt Creator, чтобы не переписывать GUI на XAML. Если писать новый проект с нуля в Visual Studio на C# + XAML, то проблем вообще никаких нет. Мне же нужно, чтобы проект оставался в Qt, где GUI написаны на QML и работали ком порты.
А можно пример, как сделать по-другому? (используя Qt) |
Автор: math64 8.12.2015, 14:06 | ||
Пишешь в Visual Studio сервер, без ГУИ, который делает тоже самое:
Твоя программа через сокеты подключается к этому серверу - разница в использовании QTcpSocket вместо QSerialPort, оба наследуются от QIODevice, поэтому разница будет только в конструкторах. Добавлено через 13 минут и 15 секунд А тут по любому получается как в этом ералаше, вопрос только в том сколько будут весить эти дополнительные батарейки - отдельньный комп, отдельный гаджет или сервер (драйвера) на том же компьютере. |
Автор: LessNik 11.12.2015, 05:41 |
Спасибо всем откликнувшимся! Остановился на варианте клиент/сервер на одной машине. Клиент работает в winrt, а сервер в win32. |