crossplatform.ru

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

> 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
  опции профиля:
сообщение 12.8.2011, 9:16
Сообщение #2


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

Группа: Участник
Сообщений: 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 килобайт ) Кол-во скачиваний: 125
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 26.2.2025, 13:45