Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенос проекта Qt на WinRT, com порт и эпические костыли 
V
    Опции темы
LessNik
Дата 5.12.2015, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Добрый день, форумчане! 
У меня есть проект, разработанный на 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. Но как это сделать?
PM MAIL   Вверх
math64
Дата 6.12.2015, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В Qt 5 есть поддержка QSerialPort. Для старых версий её можно скачать отдельно и подключить к проекту. Она у Вас не работает?
PM   Вверх
LessNik
Дата 6.12.2015, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



QSerialPort тоже работать не будет под WinRT. Если бы под WinRT были API для работы с com портом, то и boost и Qt тоже бы уже давно поддержали работу с com портом. Нужно использовать Win32 API для работы с com портом в WinRT через Brokered Component. Или ждать и надеяться, что Microsoft добавит эти апи под winrt.
PM MAIL   Вверх
kuzulis
Дата 7.12.2015, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Как вариант, использовать FTDI чип с драйвером D2xx: http://www.ftdichip.com/Support/Documents/...nRT%20Guide.pdf

(но, раз USB конвертеры - не вариант - то не вариант smile )
PM MAIL   Вверх
math64
Дата 7.12.2015, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



У меня в XP все было наоборот. COM на материнке отсутствует, используется
1) гаджет, втыкающийся в USB, имеющий два COM порта на выходе
2) Bluetooth-USB на компьютере, Bluetooth-COM на внешнем устройстве, причем второй Bluetooth перед этим нужно подлючить к компьютеру через гаджет из первого пункта для настройки.
Через двайвера этих гаджетов USB превращается в COM, причем номер порта может поменяться при перезарузке.
В программе используется QSerialPort - как работать с USB напрямую из Qt я не знаю.
Наколько я понял, с новым Windows это работать не будет.
PM   Вверх
Guinness
Дата 7.12.2015, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



WinRT делали для создания календариков, просмотра рецептиков и прочей никому не нужной хрени, по крайней мере, пока создается именно такое впечатление. Т.е. явно не для такой низкоуровневой работы, уж если там нельзя полноценно работать с COM\DCOM, то ожидать чего-то большего - оптимистично. Хотя работы в этом направлении ведутся(для 10ки).

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

ЗЫ я так понимаю, Вы использовали Qt, собранную для WinRT, и в лоб решить проблему переноса не получилось?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
LessNik
Дата 7.12.2015, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Цитата

Как вариант, использовать FTDI чип с драйвером D2xx

Даже в этом случае не понятно как подключить .winmd в Qt, что равнозначно с решением на основе Brokered Component, т.е. снова использовать Visual Studio и переписывать GUI на XAML.
Цитата

WinRT делали для создания календариков, просмотра рецептиков и прочей никому не нужной хрени, по крайней мере, пока создается именно такое впечатление.

У меня тоже создаётся такое впечатление.  smile 
Цитата

Я так понимаю, Вы использовали Qt, собранную для WinRT, и в лоб решить проблему переноса не получилось?

Да, Qt для WinRT. В лоб решить не удалось.
Цитата

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

Я, конечно, не силён в серверах, но вот меня настораживает взаимодействие Qt и WCF сервиса. Это возможно? Или будет легче уже XAML выучить?  smile
Или можно как-то обойтись без WCF?
PM MAIL   Вверх
math64
Дата 7.12.2015, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Сервер, как я понял, ещё одна машина, старая, но с работающими com-портами и сетевой картой. На неё лучше поставить linux или старую версию windows. На ней будет крутиться программа, получающая данные по сокету и передающая их на com и обратно. Монитор, клавиатуру и мышь можно не подключать. Можно использовать микроконтроллер, который может выполнить эту программу.

Это сообщение отредактировал(а) math64 - 8.12.2015, 09:05
PM   Вверх
kuzulis
Дата 7.12.2015, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Может это может что-то прояснить (слайды 15-25): https://channel9.msdn.com/events/BUILD/BUILD2011/HW-747T

(взято из конца https://social.msdn.microsoft.com/Forums/en...appsfordevices)

Там вроде-как рассказывают про доступ к кастомным девайсам.

Еще вариант (если есть возможность использовать USB) - это использовать WinUSB API (хотя я не уверен что в WinRT это возможно). В этом случае можно передвавать данные и конфигурить сериал порт можно через USB пайпы (но надо смотреть даташит конкретной микрухи). Так, например в Android делают..

UPD: Посмотрел на описание как это делается для FTDI - там именно такая тема. Девайс устанавливается как "универсальное USB устройство". Для этого достаточно просто написать свой *.inf файлик в котором указать VID/PID и может что-то еще (надо посмотреть как там в FTDI делается). И тогда просто дергаем WinUSB-шные функции и наслаждаемся. smile

Но если сериал порт втроенный в ARM - то это дохлый номер, IMHO.. 

UPD: А Bluetooth, Wifi не устраивают?



Это сообщение отредактировал(а) kuzulis - 7.12.2015, 21:17
PM MAIL   Вверх
Guinness
Дата 8.12.2015, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата

   Там вроде-как рассказывают про доступ к кастомным девайсам.
   

В общем, всё это здорово, но, грубо говоря, необходимо запилить свой драйвер совместимый с WinRT. Кратенький обзорпримерCustomDevice класс.

Цитата

   Я, конечно, не силён в серверах, но вот меня настораживает взаимодействие Qt и WCF сервиса. 
   

А причём здесь WCF? =) Можно и с ним, конечно, но это уже на Ваш выбор.

Цитата

   Сервер, как я понял, ещё одна машина
   

В особо тяжёлых случаях это может быть та же машина.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
LessNik
Дата 8.12.2015, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Цитата

Сервер, как я понял, ещё одна машина, старая, но с работающими com-портами и сетевой картой. На неё лучше поставить linux или старую версию windows. На ней будет крутиться программа, получающая данные по сокету и передающая их на com и обратно. Монитор, клавиатуру и мышь можно не подключать. Можно использовать микроконтроллер, который может выполнить эту программу.

Это вообще не вариант. Напоминает ералаш про батарейки к часам http://www.youtube.com/watch?v=uG2sgVH-r7o
Цитата

UPD: Посмотрел на описание как это делается для FTDI - там именно такая тема. Девайс устанавливается как "универсальное USB устройство". Для этого достаточно просто написать свой *.inf файлик в котором указать VID/PID и может что-то еще (надо посмотреть как там в FTDI делается). И тогда просто дергаем WinUSB-шные функции и наслаждаемся. smile

Но если сериал порт втроенный в ARM - то это дохлый номер, IMHO.. 

UPD: А Bluetooth, Wifi не устраивают?

Цитата

В общем, всё это здорово, но, грубо говоря, необходимо запилить свой драйвер совместимый с WinRT. Кратенький обзор, пример, CustomDevice класс.


Вопрос не в том, как запилить драйвер, а как его подключить и использовать в Qt Creator, чтобы не переписывать GUI на XAML.

Если писать новый проект с нуля в Visual Studio на C# + XAML, то проблем вообще никаких нет. Мне же нужно, чтобы проект оставался в Qt, где GUI написаны на QML и работали ком порты.

Цитата

А причём здесь WCF? =) Можно и с ним, конечно, но это уже на Ваш выбор.

А можно пример, как сделать по-другому? (используя Qt)
PM MAIL   Вверх
Guinness
Дата 8.12.2015, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(LessNik @  8.12.2015,  14:33 Найти цитируемый пост)
А можно пример, как сделать по-другому? (используя Qt) 

Через QTcpSocket, что с той, что с другой стороны. Или в WinRT QTcpSocket не работает? В целом у меня работало и в случае, если со стороны сервера был QTcpSocket, со стороны WinRT их сокеты.

Цитата(LessNik @  8.12.2015,  14:33 Найти цитируемый пост)
Вопрос не в том, как запилить драйвер, а как его подключить и использовать в Qt Creator, чтобы не переписывать GUI на XAML.

А GUI переписывать не нужно, тут вопрос стоит в том, как взаимодействовать с COM-портом, верно? Так вот, чтобы наладить это взаимодействие, силами одного Qt можно и не обойтись, т.к. осуществлять передачу команд и данных через сокеты - это костыль в чистом виде из-за ограничений данной подсистемы.

Собственно, пока что предложено два варианта как осуществить взаимодействие с COM-портом:
1) Написать драйвер совместимый с WinRT и работать с ним через CustomDevice. Ссылку на пример я выложил.
2) Костыльнуть, разбив искомое приложение на клиент/сервер.

PM MAIL   Вверх
math64
Дата 8.12.2015, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(LessNik @  8.12.2015,  13:33 Найти цитируемый пост)
А можно пример, как сделать по-другому?

Пишешь в Visual Studio сервер, без ГУИ, который делает тоже самое:
Цитата(math64 @  7.12.2015,  18:26 Найти цитируемый пост)
 На ней будет крутиться программа, получающая данные по сокету и передающая их на com и обратно.

Твоя программа через сокеты подключается к этому серверу - разница в использовании QTcpSocket вместо QSerialPort, оба наследуются от QIODevice, поэтому разница будет только в конструкторах.

Добавлено через 13 минут и 15 секунд
Цитата(LessNik @  8.12.2015,  13:33 Найти цитируемый пост)
Это вообще не вариант. Напоминает ералаш про батарейки к часам

А тут по любому получается как в этом ералаше, вопрос только в том сколько будут весить эти дополнительные батарейки - отдельньный комп, отдельный гаджет или сервер (драйвера) на том же компьютере.
PM   Вверх
LessNik
Дата 11.12.2015, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Спасибо всем откликнувшимся!
Остановился на варианте клиент/сервер на одной машине. Клиент работает в winrt, а сервер в win32.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.