Russian Qt Forum
Май 04, 2024, 13:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 66 67 [68] 69 70 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 752791 раз)
Bepec
Гость
« Ответ #1005 : Ноябрь 02, 2012, 16:50 »

Просто программно высчитывать длину кадров получаемых и отправляемых для довольно обширных систем команд, это немного трудновато.

Эх, придётся опять доставать свой полусырой класс и гусарить работу с таймаутами Улыбающийся

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

Это так осталось или нет?

Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1006 : Ноябрь 02, 2012, 17:05 »

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

Послали пакет, запустили QTimer с неким интервалом ожидания ответного пакета.
Если сработал readyRead() - проверяем сколько байт принято bytesAvailable().
Если принято столько сколько ожидали, то останавливаем QTimer и обрабатываем
принятый пакет. Если принято меньше чем нужно, то ничего не делаем и ждем следующего
readyRead(). Если же сработал QTimer - значит пакет не пришел или пришел не весь,
обрабатываем эту ситуацию. Все предельно просто.

В ином случае я даже не соображу зачем оно (интервалы) нужно.
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1007 : Ноябрь 02, 2012, 17:47 »

Таки до 255 устройств на линии Веселый В цикле обходить надо всех. Время ожидания ответа - 16 мс.

Посчитать насколько будет увеличиваться время опроса на каждую дополнительную мс ответа может каждый Веселый

Лучший - 4-5 секунд.  Т.е. максимальное время не выдерживается.
А берём плохой результат +15 мс погрешности - 7095.

Добавляем время ответа к обоим результатам.

Итог: Цикл крутиться постоянно, в результате получаем такой нехилый бонус в виде тормозов и снижения частоты опроса... Грустный
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1008 : Ноябрь 02, 2012, 20:47 »

Цитировать
Посчитать насколько будет увеличиваться время опроса на каждую дополнительную мс ответа может каждый
А никто в здравом уме не вешает на шину/линию 255 у-в, обычно 8-10,
в ином случае нужно бить проектировщикам по рукам. Улыбающийся

Если полудуплекс (RS485-2W), то тут ничего не поделаешь - тормоза это нормально.

Если же полный дуплекс (RS485-4W) - то запросы можно слать сразу всем девайсам,
но тут многое зависит от протокола обмена и т.п.

Но в любом случае, в QtSerialPort не будет read/write таймаутов.
Максимум о чем можно подумать - это возвращение дескриптора порта
для платформо-зависимых "тонких" настроек.


Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1009 : Ноябрь 02, 2012, 21:05 »

Это было бы превосходно Улыбающийся

PS когда на шине лежат средства охраны периметра, 100-150 это нормально Улыбающийся 255 - это крайность, взятая для примера Улыбающийся

Записан
b-s-a
Гость
« Ответ #1010 : Ноябрь 02, 2012, 21:52 »

Просто программно высчитывать длину кадров получаемых и отправляемых для довольно обширных систем команд, это немного трудновато.

Эх, придётся опять доставать свой полусырой класс и гусарить работу с таймаутами Улыбающийся

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

Это так осталось или нет?
Можно это обойти. Для этого необходимо заюзать Perfomance Counters. В Qt 4.8 они поддержаны через QElapsedTimer. Чтобы сделать точную задержку необходимо:
1. Запустить таймер
2. Выполнить стандартное системное ожидание на время, превышающее 20 мс.
3. Крутиться в цикле, вызывая Sleep(0) до тех пор, пока не истечет время. Есть мнение, что Sleep(0) в этом случае вызывать вредно. Не уверен.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1011 : Ноябрь 02, 2012, 21:53 »

Цитировать
Максимум о чем можно подумать - это возвращение дескриптора порта
для платформо-зависимых "тонких" настроек.
Упс, отставить. Это тоже не поможет, т.к. read/write происходит автоматически
в/из внутренних кольцевых буферов класса некими постоянными порциями.

Например, при приходе в драйвер реально 100 байт, автоматом вызовется
ф-я ReadFile(ReadChunkSize)  (или read(ReadChunkSize)).

Где ReadChunkSize - некая константа (по умолчанию сейчас она 512 байт).

И если даже "тонко" настроить таймауты порта через дескриптор, то получится хрень.

Хотя, в принципе, все-таки дескриптор можно возвращать наверное.
Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #1012 : Ноябрь 02, 2012, 21:54 »

Сначала, думаю, стоит придумать зачем. А уже потом возвращать.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1013 : Ноябрь 02, 2012, 21:56 »

Цитата: b-s-a
Сначала, думаю, стоит придумать зачем. А уже потом возвращать.
Это да, согласен.

Но раз уж ты появился - плюсани в Gerrit что-ли и я патч закоммичу.  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1014 : Ноябрь 02, 2012, 21:59 »

В принципе ладно, библиотечка то хорошая, негоже её портить Улыбающийся

b-s-a насколько я помню, все (абсолютно) таймеры в системе W работают, основываясь на паре таймеров. И у этих таймеров именно погрешность в 15 мс имеется. Причём совершенно непредсказуемая задержка на разных компьютерах.

К тому же я не совсем понял логики вашего способа.
Запуск таймера, затем стандартный таймер (который  реализуется QTimer) и крутиться в Sleep(0) до истечения времени?

Тут слабое место на мой взгляд - Sleep и стандартный таймер имеют эту же погрешность в 15 мс ^_^ К тому же насколько я помню, время спячки потока опять таки имеет погрешность в зависимости от загрузки системы и приоритета процесса.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1015 : Ноябрь 02, 2012, 22:13 »

PS когда на шине лежат средства охраны периметра, 100-150 это нормально Улыбающийся 255 - это крайность, взятая для примера Улыбающийся

В этом случае не отвечающему устройству понижают приоритет скорости опроса (т.е реже его опрашивают или вообще выводят
из опроса на определенное время) с установкой аларма типа: "Связь с у-вом потеряна".

ЗЫ: Это конечно, если речь идет к примеру про пожарку в АСУТП.
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1016 : Ноябрь 02, 2012, 22:50 »

К сожалению не пожарка, а именно средства охраны периметра  Подмигивающий И не ответ устройства хотя бы в 2 циклах расценивается как тревога - прорыв периметра/неисправность устройства/саботаж  Шокированный

И сразу пиу пиу выбегают солдатики и бегут разбираться, какой подлец их любимое устройство тыкнул(не опросил). А потом, уходя на гражданку, возьмут с собой запись с камеры, как нарушителя/саботажника/разработчика ( Плачущий ) распинают на плацу Веселый

Записан
Phoenix
Гость
« Ответ #1017 : Ноябрь 03, 2012, 19:27 »

У меня mac тоже в виртуалке. Программы собрались, а открывать порт не хотят. В linux такое тоже было пока пользователя не добавил в нужную группу, а в маке не могу найти где это. Кстати, сначала программа выдает ошибку с кодом 10, а при повторной попытке подключиться - с кодом 2.
« Последнее редактирование: Ноябрь 03, 2012, 19:41 от Phoenix » Записан
Phoenix
Гость
« Ответ #1018 : Ноябрь 03, 2012, 20:04 »

Посмотрел права на файл порта /dev/cu.serial1: crw-rw-rw. Должно работать, но не работает. Заметил в /dev еще один похожий файл: tty.serial1. Может не правильно определяется файл устройства?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #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   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.