crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QIODevice
gpepsi
  опции профиля:
сообщение 9.8.2011, 19:57
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Создавал ли кто свои потоковые устройства ?
Есть несколько вопросов.

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

2. Пытаюсь создать серийный порт на основе QIODevice. Определил readData и writeData.
в open открыл порт и выставил нужные параметры. Задал OpenMode == ReadWrite.
Достаточно ли этого ?

Что еще нужно определить, чтоб работало корректно. И вообще какие методы настоятельно рекомендуется переопределить.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 10.8.2011, 10:27
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


За Вас уже давно всё сделали, см:

1. QSerialDevice: https://gitorious.org/qserialdevice
2. QextSerialPort: http://code.google.com/p/qextserialport/
3. QSerialPort: https://gitorious.org/inbiza-labs/qserialport

Настоятельно рекомендую п.1 .
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gpepsi
  опции профиля:
сообщение 10.8.2011, 20:19
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kuzulis @ 10.8.2011, 10:27) *
За Вас уже давно всё сделали, см:


серийный порт это лишь пример. Устройство может быть сложнее и специфичнее.
Поэтому и вопрос про наследование и реализацию наследника
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 11.8.2011, 7:37
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Ну тогда см. исходники QAbstractSocket/QFile/QLocalSocket и т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 11.8.2011, 7:55
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Цитата


Хотя бы один из них пробовали собирать под WIN CE?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 11.8.2011, 8:45
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата
Хотя бы один из них пробовали собирать под WIN CE?

Нет.
Но п.1 и п.2 точно работать и собираться под WinCE не будут.

ЗЫ: я сейчас пробую добавить поддержку WinCE для п.1, но пока результаты отрицательные.
Конкретную проблему см. тут: http://www.prog.org.ru/index.php?topic=9537.msg128857#new

ЗЫЗЫ:
И, кстати, если у вас, PAFOS, есть возможность доступа к девайсу с WinCE, то напишите тестовый код
в котором попробуйте открыть порт с флагом FILE_FLAG_OVERLAPPED! Откроется он или возвратит ошибку?


Сообщение отредактировал kuzulis - 11.8.2011, 8:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 11.8.2011, 16:57
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


У меня целый арсенал Win CE устройств. Только вот Qt собрана только лишь под armv4i (

А так - как попробую - дам знать)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 12.8.2011, 8:08
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


kuzulis, почитал инфу по ссылке, проблему понял.

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

Теперь по поводу просьбы:

У меня было три устройства (Windows Mobile 6.0, 6.1, 6.5).
На всех успешно выполнился следующий код:

    m_hComm = CreateFile( lpszPortName,  
        GENERIC_READ | GENERIC_WRITE,
        0,
        0,    
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        0);


Сообщение отредактировал PAFOS - 12.8.2011, 8:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 12.8.2011, 9:16
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


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

Нет. Ты не прав. Ты не установишь настройки не открыв порт!

Цитата
У меня было три устройства (Windows Mobile 6.0, 6.1, 6.5).
На всех успешно выполнился следующий код:

Аха, понятно.

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

В этом примере для отслеживания событий от порта создается новый поток в котором крутится WaitCommEvent().

Просьбы:

1. Необходимо проверить возможность выхода из WaitCommEvent() путем вызова функции SetCommMask() в основном потоке приложения.

Для этого в примере нужно открыть порт без FILE_FLAG_OVERLAPPED (см. bool Serial::open()):
...
m_params.hPort = ::CreateFileA(name, GENERIC_READ | GENERIC_WRITE,
                                   0, 0, OPEN_EXISTING, 0, 0);
...


Собрать, запустить проект и посмотреть на консольный вывод:
- отработает ли WaitCommEvent() в потоке? (с успехом, либо с ошибкой)
- отработает ли SetCommMask() в методе setRate()?
- отработает ли сам метод setRate() ?

2. Необходимо проверить возможность установки параметров порта при ожидании WaitCommEvent()
без вызова SetCommMask() в основном потоке приложения.

Для этого в примере нужно открыть порт также как и в п.1, но
в методе setRate() убрать функцию SetCommMask().

Собрать, запустить проект и посмотреть на консольный вывод:
- отработает ли сам метод setRate() ?

3. Необходимо проверить возможность изменения параметров порта при ожидании WaitCommEvent()
и открытии порта с FILE_FLAG_OVERLAPPED.

Для этого в примере нужно открыть порт с флагом FILE_FLAG_OVERLAPPED,
а из метода setRate() удалить функцию SetCommMask().

Собрать, запустить проект и посмотреть на консольный вывод:
- отработает ли сам метод setRate() ?

--
Жду тестов :)



Сообщение отредактировал kuzulis - 12.8.2011, 9:38
Прикрепленные файлы
Прикрепленный файл  ngserwince.zip ( 2,39 килобайт ) Кол-во скачиваний: 120
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 18.8.2011, 8:29
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Протестировал.

WaitCommEvent возвращает TRUE если в другом потоке вызывается SetCommMask, при чем не важно, открыт ли файл с флагом FILE_FLAG_OVERLAPPED или без него.

Короче все работает из твоего примера.

З.Ы. Если один момент - на WIN CE при открытии файла имя надо давать не \\.\COM1, а COM1:
Знаю что первый вариант в обычной винде предпочтительнее, тем не менее если его использовать на WIN CE, то файл не открывается вообще

З.Ы.Ы функция CancelIO на WINCE вроде как отсутствует, во всяком случае у меня ругался компилятор на ее отсутствие
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 15:08