QIODevice |
Здравствуйте, гость ( Вход | Регистрация )
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 |
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 |
Цитата 1. QSerialDevice: https://gitorious.org/qserialdevice 2. QextSerialPort: http://code.google.com/p/qextserialport/ 3. QSerialPort: https://gitorious.org/inbiza-labs/qserialport Хотя бы один из них пробовали собирать под 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). На всех успешно выполнился следующий код:
Сообщение отредактировал 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()):
Собрать, запустить проект и посмотреть на консольный вывод: - отработает ли 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
Прикрепленные файлы
|
|
|
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 вроде как отсутствует, во всяком случае у меня ругался компилятор на ее отсутствие |
|
|
Текстовая версия | Сейчас: 1.12.2024, 9:10 |