Russian Qt Forum
Ноябрь 23, 2024, 23:19
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Дополнительные компоненты
>
Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].
Страниц:
1
...
66
67
[
68
]
69
70
...
88
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА]. (Прочитано 785762 раз)
Bepec
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1005 :
Ноябрь 02, 2012, 16:50 »
Просто программно высчитывать длину кадров получаемых и отправляемых для довольно обширных систем команд, это немного трудновато.
Эх, придётся опять доставать свой полусырой класс и гусарить работу с таймаутами
Кстати, вопрос для общего развития - вроде бы точность системных таймеров в W, не позволяет высчитывать точные отрезки времени. Так же у них как бэ погрешность заявленная в 15 мс :/
Так что на высоком уровне работать с таймерами нереально.
Это так осталось или нет?
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1006 :
Ноябрь 02, 2012, 17:05 »
Нет смысла вообще использовать интервалы времени в десятки мс, есть смысл начиная с сотен.
Например, интервалы можно использовать только при ожидании таймаута пакета при приеме,
поэтому QTimer в самый раз.
Послали пакет, запустили QTimer с неким интервалом ожидания ответного пакета.
Если сработал readyRead() - проверяем сколько байт принято bytesAvailable().
Если принято столько сколько ожидали, то останавливаем QTimer и обрабатываем
принятый пакет. Если принято меньше чем нужно, то ничего не делаем и ждем следующего
readyRead(). Если же сработал QTimer - значит пакет не пришел или пришел не весь,
обрабатываем эту ситуацию. Все предельно просто.
В ином случае я даже не соображу зачем оно (интервалы) нужно.
Записан
ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1007 :
Ноябрь 02, 2012, 17:47 »
Таки до 255 устройств на линии
В цикле обходить надо всех. Время ожидания ответа - 16 мс.
Посчитать насколько будет увеличиваться время опроса на каждую дополнительную мс ответа может каждый
Лучший - 4-5 секунд. Т.е. максимальное время не выдерживается.
А берём плохой результат +15 мс погрешности - 7095.
Добавляем время ответа к обоим результатам.
Итог: Цикл крутиться постоянно, в результате получаем такой нехилый бонус в виде тормозов и снижения частоты опроса...
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1008 :
Ноябрь 02, 2012, 20:47 »
Цитировать
Посчитать насколько будет увеличиваться время опроса на каждую дополнительную мс ответа может каждый
А никто в здравом уме не вешает на шину/линию 255 у-в, обычно 8-10,
в ином случае нужно бить проектировщикам по рукам.
Если полудуплекс (RS485-2W), то тут ничего не поделаешь - тормоза это нормально.
Если же полный дуплекс (RS485-4W) - то запросы можно слать сразу всем девайсам,
но тут многое зависит от протокола обмена и т.п.
Но в любом случае, в QtSerialPort не будет read/write таймаутов.
Максимум о чем можно подумать - это возвращение дескриптора порта
для платформо-зависимых "тонких" настроек.
Записан
ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1009 :
Ноябрь 02, 2012, 21:05 »
Это было бы превосходно
PS когда на шине лежат средства охраны периметра, 100-150 это нормально
255 - это крайность, взятая для примера
Записан
b-s-a
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1010 :
Ноябрь 02, 2012, 21:52 »
Цитата: Bepec от Ноябрь 02, 2012, 16:50
Просто программно высчитывать длину кадров получаемых и отправляемых для довольно обширных систем команд, это немного трудновато.
Эх, придётся опять доставать свой полусырой класс и гусарить работу с таймаутами
Кстати, вопрос для общего развития - вроде бы точность системных таймеров в W, не позволяет высчитывать точные отрезки времени. Так же у них как бэ погрешность заявленная в 15 мс :/
Так что на высоком уровне работать с таймерами нереально.
Это так осталось или нет?
Можно это обойти. Для этого необходимо заюзать Perfomance Counters. В Qt 4.8 они поддержаны через QElapsedTimer. Чтобы сделать точную задержку необходимо:
1. Запустить таймер
2. Выполнить стандартное системное ожидание на время, превышающее 20 мс.
3. Крутиться в цикле, вызывая Sleep(0) до тех пор, пока не истечет время. Есть мнение, что Sleep(0) в этом случае вызывать вредно. Не уверен.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1011 :
Ноябрь 02, 2012, 21:53 »
Цитировать
Максимум о чем можно подумать - это возвращение дескриптора порта
для платформо-зависимых "тонких" настроек.
Упс, отставить. Это тоже не поможет, т.к. read/write происходит автоматически
в/из внутренних кольцевых буферов класса некими постоянными порциями.
Например, при приходе в драйвер реально 100 байт, автоматом вызовется
ф-я ReadFile(ReadChunkSize) (или read(ReadChunkSize)).
Где ReadChunkSize - некая константа (по умолчанию сейчас она 512 байт).
И если даже "тонко" настроить таймауты порта через дескриптор, то получится хрень.
Хотя, в принципе, все-таки дескриптор можно возвращать наверное.
Записан
ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1012 :
Ноябрь 02, 2012, 21:54 »
Сначала, думаю, стоит придумать зачем. А уже потом возвращать.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1013 :
Ноябрь 02, 2012, 21:56 »
Цитата: b-s-a
Сначала, думаю, стоит придумать зачем. А уже потом возвращать.
Это да, согласен.
Но раз уж ты появился - плюсани в Gerrit что-ли и я патч закоммичу.
Записан
ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1014 :
Ноябрь 02, 2012, 21:59 »
В принципе ладно, библиотечка то хорошая, негоже её портить
b-s-a насколько я помню, все (абсолютно) таймеры в системе W работают, основываясь на паре таймеров. И у этих таймеров именно погрешность в 15 мс имеется. Причём совершенно непредсказуемая задержка на разных компьютерах.
К тому же я не совсем понял логики вашего способа.
Запуск таймера, затем стандартный таймер (который реализуется QTimer) и крутиться в Sleep(0) до истечения времени?
Тут слабое место на мой взгляд - Sleep и стандартный таймер имеют эту же погрешность в 15 мс ^_^ К тому же насколько я помню, время спячки потока опять таки имеет погрешность в зависимости от загрузки системы и приоритета процесса.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1015 :
Ноябрь 02, 2012, 22:13 »
Цитата: Bepec от Ноябрь 02, 2012, 21:05
PS когда на шине лежат средства охраны периметра, 100-150 это нормально
255 - это крайность, взятая для примера
В этом случае не отвечающему устройству понижают приоритет скорости опроса (т.е реже его опрашивают или вообще выводят
из опроса на определенное время) с установкой аларма типа: "Связь с у-вом потеряна".
ЗЫ: Это конечно, если речь идет к примеру про пожарку в АСУТП.
Записан
ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1016 :
Ноябрь 02, 2012, 22:50 »
К сожалению не пожарка, а именно средства охраны периметра
И не ответ устройства хотя бы в 2 циклах расценивается как тревога - прорыв периметра/неисправность устройства/саботаж
И сразу пиу пиу выбегают солдатики и бегут разбираться, какой подлец их любимое устройство тыкнул(не опросил). А потом, уходя на гражданку, возьмут с собой запись с камеры, как нарушителя/саботажника/разработчика (
) распинают на плацу
Записан
Phoenix
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1017 :
Ноябрь 03, 2012, 19:27 »
У меня mac тоже в виртуалке. Программы собрались, а открывать порт не хотят. В linux такое тоже было пока пользователя не добавил в нужную группу, а в маке не могу найти где это. Кстати, сначала программа выдает ошибку с кодом 10, а при повторной попытке подключиться - с кодом 2.
«
Последнее редактирование: Ноябрь 03, 2012, 19:41 от Phoenix
»
Записан
Phoenix
Гость
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1018 :
Ноябрь 03, 2012, 20:04 »
Посмотрел права на файл порта /dev/cu.serial1: crw-rw-rw. Должно работать, но не работает. Заметил в /dev еще один похожий файл: tty.serial1. Может не правильно определяется файл устройства?
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
«
Ответ #1019 :
Ноябрь 03, 2012, 20:49 »
Цитата: Phoenix
В linux такое тоже было пока пользователя не добавил в нужную группу, а в маке не могу найти где это.
Фиг его знает как там в маке, но попробуй через su (или sudo) запустить Terminal.
Цитата: Phoenix
Кстати, сначала программа выдает ошибку с кодом 10, а при повторной попытке подключиться - с кодом 2.
Если честно, то не подскажу в чем дело. Код 2 это PermissionDeniedError.
Возможно ты неправильно ассоциировал порт в виртуалке (или вообще не настраивал его),
и что за виртуалка? Если честно, то я не проверял работу с built-in портами в Маке (или проверял - не помню).
Но точно проверял с USB/Serial шнурками - вроде работает.
Попробуй подключи в свой проект (или в пример Terminal) библиотеку напрямую через src-lib.pri и в отладчике
посмотри в файле serialport_unix.cpp как там в методе open() происходит открытие порта, на каком этапе фэйлится
и выведи номер ошибки errno.
Цитата: Phoenix
Заметил в /dev еще один похожий файл: tty.serial1. Может не правильно определяется файл устройства?
Ну попробуй открыть tty.serial1, хотя правильнее все-таки cu.serial1.
Записан
ArchLinux x86_64 / Win10 64 bit
Страниц:
1
...
66
67
[
68
]
69
70
...
88
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...