-
- В общем, други мои, разобрался я с асинхронным чтением из компорта :) Mebius(1080 знак., 19.03.2016 21:09)KLIM83
- Читайте MSDN, там все нормальным англицким написано, кто, что, куда и какие при этом ошибки. - Xитpый Kитaeц(20.03.2016 12:50)
- Ну да, написано... в ReadFile. Работаешь-то с UART. Там и ищешь ответы. А их там нет, а есть то что вообще редко бывает нужно :) - Mebius(20.03.2016 23:49)
- Там индусским английским написано. Давно уже говорил о том, почему технологии Microsoft прошли мимо меня: понять тот же RSDN -- невозможно. Слов много, ничего не понятно. Документация из мира unix и opensource на порядок более доходчивая и менее fk0(107 знак., 20.03.2016 13:03)
- Не RSDN, а MSDN... - fk0(20.03.2016 13:05)
- Только чем все это будет отличаться от обычного ReadFile открытого без OVERLAPPED? - AlexBi_(20.03.2016 11:50,
)
- Тем что можно любым евентом прервать процесс в любой момент времени, а не городить в юзерспейсе циклы опроса "а не пришло-ли что от клавиатуры"? Mebius(283 знак., 20.03.2016 23:36 - 23:40)
- Я тебе открою большую тайну: всё современное программирование сколько-нибудь большших систем -- событийное. Ждём событие (любое из), обрабатываем, _и_ _так_ _в_ _цикле_. - fk0(21.03.2016 12:13)
- Я тоже так делаю. Но стараюсь чтобы этот цикл был основным и единственным. - Mebius(23.03.2016 22:09)
- А, вот теперь я понял! Спасибо :) Не, я реально просто колоссальный пласт сейчас понял. Как стена перед глазами рухнула. Люди вовсе не идиоты. Это просто действительно намного сложнее — отделить отъемлемые свойства от неотъемлемых. Николай Коровин(2578 знак., 21.03.2016 00:05 - 00:41)
- Только у Топикстартера, как я понял, так как он хотел - не заработало :) - Скрипач(21.03.2016 00:46)
- Почему Вы так решили? Просто интересно. Я в этом топике по нескольку раз объяснял "как я хотел" и в конце концов написал отдельный пост КАК НАДО СДЕЛАТЬ чтобы заработало как я хотел. Но тема продолжает расти измышлизмами про овец, "современном Mebius(477 знак., 23.03.2016 22:05)
- Мне вспоминается фотка из «оружейной энциклопедии
ляпсуса-трубецкогоне совсем, но похожая фамилия», где мудожник плагиатил фотку пулемёта и часть подставки с фотки нарисовал вместе с пулемётом, приняв её за часть оного :) Николай Коровин(1811 знак., 23.03.2016 22:39 - 22:41)- Мой бардак в голове позволяет мне писать более логичные (по вашему же признанию) алгоритмы. А Ваш бардак позволяет Вам писать целые повести на вольную тему с колоссальной производительностью. Вам бы в журнал "Нева" или "Крокодил" что-ли. А Вы Mebius(171 знак., 25.03.2016 07:07)
- Да сколько угодно. Небольшой кусочек самоиронии насчёт мастшаба («человечество»), я вижу, прокатил за чистую монету :-D Но поскольку я, в отличие от, не свожу холивар к фаллометрии, мне как-то сравнение «я-вы» не столь важно, как что-то типа… Николай Коровин(1671 знак., 25.03.2016 12:51)
- Является ли автомобиль телегой? А при условии что мы его купили, а не собрали сами? Скрипач(104 знак., 25.03.2016 16:59 - 17:12)
- Подсветка логической ошибки. «Велосипед» — когда делаешь что-то, что уже давно «украдено до нас». Тогда почему другой способ реализации автоматически снимает статус велосипеда, хотя функционал не меняется? Николай Коровин(175 знак., 25.03.2016 17:17 - 17:21)
- А откуда мне знать, меняется ли функционал? Он разный бывает. Есть такая тема: "авторские права", она - функционал, аль нет? :) Скрипач(58 знак., 25.03.2016 17:41 - 17:43)
- Подсветка логической ошибки. «Велосипед» — когда делаешь что-то, что уже давно «украдено до нас». Тогда почему другой способ реализации автоматически снимает статус велосипеда, хотя функционал не меняется? Николай Коровин(175 знак., 25.03.2016 17:17 - 17:21)
- Является ли автомобиль телегой? А при условии что мы его купили, а не собрали сами? Скрипач(104 знак., 25.03.2016 16:59 - 17:12)
- Да сколько угодно. Небольшой кусочек самоиронии насчёт мастшаба («человечество»), я вижу, прокатил за чистую монету :-D Но поскольку я, в отличие от, не свожу холивар к фаллометрии, мне как-то сравнение «я-вы» не столь важно, как что-то типа… Николай Коровин(1671 знак., 25.03.2016 12:51)
- Мой бардак в голове позволяет мне писать более логичные (по вашему же признанию) алгоритмы. А Ваш бардак позволяет Вам писать целые повести на вольную тему с колоссальной производительностью. Вам бы в журнал "Нева" или "Крокодил" что-ли. А Вы Mebius(171 знак., 25.03.2016 07:07)
- Мне вспоминается фотка из «оружейной энциклопедии
- А пофиг :) Главное — он помог понять механизм, почему люди постоянно делают такие дорогие ошибки в проектах! В лестнице мышления ступенек очень много. Понять, на которой именно мозг обычно спотыкается — дорогого стоит, знаешь ли! :) Николай Коровин(1879 знак., 21.03.2016 00:53 - 01:26)
- Я вообще ничего не понял. Видимо, предлагается альтернатива "внезапного открытия" банальным инвестициям для получения результата. А уж как инвестировать - сверху вниз или внизу вверх - дело десятое ;) - VL(21.03.2016 12:02,
)
- Вы говорите о проектировании "снизу вверх" и "сверху вниз". Просто заумно :) - Скрипач(21.03.2016 10:21)
- Не, так глубоко я ещё не думал :) Дальше «откуда в голове берётся бардак» не шёл. - Николай Коровин(21.03.2016 12:13)
- Я вообще ничего не понял. Видимо, предлагается альтернатива "внезапного открытия" банальным инвестициям для получения результата. А уж как инвестировать - сверху вниз или внизу вверх - дело десятое ;) - VL(21.03.2016 12:02,
- Почему Вы так решили? Просто интересно. Я в этом топике по нескольку раз объяснял "как я хотел" и в конце концов написал отдельный пост КАК НАДО СДЕЛАТЬ чтобы заработало как я хотел. Но тема продолжает расти измышлизмами про овец, "современном Mebius(477 знак., 23.03.2016 22:05)
- Вы можете сколь угодно тешить своё ЧСВ тем что способны сначала создать себе проблемы, а потом их так грациозно и высокоинтеллектуально решить. Но меня это не трогает. И не задевает, да :) - Mebius(21.03.2016 00:16)
- Только у Топикстартера, как я понял, так как он хотел - не заработало :) - Скрипач(21.03.2016 00:46)
- Я тебе открою большую тайну: всё современное программирование сколько-нибудь большших систем -- событийное. Ждём событие (любое из), обрабатываем, _и_ _так_ _в_ _цикле_. - fk0(21.03.2016 12:13)
- Вот и мне хотелось бы подробное обстоятельное объяснение. Может, мы все что-то делаем не так, и при совпадении положения пятна на Юпитере, погоды на Марсе и фазы Луны у нас может, скажем, кэширование отказать? - Николай Коровин(20.03.2016 11:58)
- Тем что можно любым евентом прервать процесс в любой момент времени, а не городить в юзерспейсе циклы опроса "а не пришло-ли что от клавиатуры"? Mebius(283 знак., 20.03.2016 23:36 - 23:40)
- Читайте MSDN, там все нормальным англицким написано, кто, что, куда и какие при этом ошибки. - Xитpый Kитaeц(20.03.2016 12:50)
- Так, всё. У меня глаза кровоточат этот тред читать. «Произвольную длину» (в пределах возможностей буфера), надеюсь, сделать не проблема? Николай Коровин(3875 знак., 19.03.2016 19:42)
- Это указатель. - Ациль Шифер(19.03.2016 17:24)
- Где? - Mebius(19.03.2016 17:26)
- А сколько возвращать должно? Как поймёт где конец посылки? И таймаута у тебя нет, на первом принятом байте считает, что приняли. Но пока соображает что и как -- ещё три принять успевает... - fk0(19.03.2016 00:18)
- Кстати записывание чего-либо в cto.ReadIntervalTimeout никак не влияет на ситуацию. Похоже с GetOverlappedResult надо работать немного не так. После выходных продолжу изыскания. - Mebius(19.03.2016 11:08)
- Оно ждёт либо таймаута, либо приёма данных. Ты хочешь странного. Напиши цикл -- принимать пока не выйдет таймаут, или пока не будет получено N байт. Вообще асинхронный IO для ком-портов в данном случае не нужен: ком-порты позволяют задать таймаут fk0(38 знак., 19.03.2016 13:19)
- Я?! Странного?! Это ты тут что-то странное предлагаешь. Я просто хочу чтобы драйвер дождался EventCar-а который я ему указал в DCB и выдал мне по этому поводу событие. Куда уж прозрачнее и понятнее? Тем более что это всё описано в документации. Mebius(100 знак., 19.03.2016 17:19)
- Имхо нужно без таймаута сразу вываливаться из read и анализировать сколько байт прочитано. А все таумауты просчитывать в самом приложении. Мало ли пользователь отмену нажмет - 1111111(19.03.2016 16:01)
- Оно ждёт либо таймаута, либо приёма данных. Ты хочешь странного. Напиши цикл -- принимать пока не выйдет таймаут, или пока не будет получено N байт. Вообще асинхронный IO для ком-портов в данном случае не нужен: ком-порты позволяют задать таймаут fk0(38 знак., 19.03.2016 13:19)
- Неправда! У меня в DCB записано: dcb.EvtChar = 0x03; А маску на событие я устанавливаю SetCommMask(s.port, EV_RXFLAG) - это означает что драйвер должен генерировать событие по приёму байта 03h. - Mebius(19.03.2016 11:04)
- У Вас нет операции ReadFile ПЕРЕД GetOverlappedResult, откуда Get'у знать, что вы читаете, а не пишете. Все операции с событиями не запускают операции ввода-вывода а устанавливают event'ы в сигнальное состояние. Для получения количества байт в Xитpый Kитaeц(35 знак., 19.03.2016 12:46)
- Я и не питал иллюзий по поводу запуска ввода-вывода событиями. Если смотреть код - я жду WaitFof Single Object потом получаю кол-во байт в буфере (почему там именно 4 вообще не понятно) и использую это число для ReadFile. Как я запущу чтение не Mebius(121 знак., 19.03.2016 17:13)
- Ещё раз, используйте ClearCommError. Если в буфере уже есть то количество байт которое нужно, асинхронная операция не нужна. Цимес асинхронщины в том, что Вы запрашиваете заранее и ожидаете доставки, копая и ковыряясь в другом месте :). - Xитpый Kитaeц(20.03.2016 08:12)
- Мне именно этот цимес и нужен. Странно что Вы это до сих пор не понимаете. Я ж писал об этом в самом первом посте. Я не знаю какое количество байт мне нужно. Мне нужны все (до паузы в передаче или конца выделенного буфера естественно). - Mebius(20.03.2016 23:43)
- Кстати да. Здесь же _явное_ ожидание завершения асинхронной операции. Обычный ReadFile вполне подошёл бы. - fk0(20.03.2016 13:04)
- Объяснять долго. Рекомендую обратиться к литературе. Твоя проблема в том, что ты не представляешь принципов работы подсистемы ввода-вывода современных ОС (она, кстати, мало чем отличается между linux и windows, принципы одни, названия функций fk0(528 знак., 19.03.2016 17:28, ссылка)
- Спасибо, почему-то не встречалась. На всякий зацепил с прилагаемыми сорцами Vit(61 знак., 20.03.2016 13:46, ссылка)
- Зачем тогда все эти SelectCommMask и WaitCommEvent? - Mebius(19.03.2016 17:36)
- Это они пытались сделать жалкое подобие интерфейса терминалов юникса. Только не факт что драйвер компорта это поддерживает. Зачем искать сложности, когда можно сделать проще? А если твой EvtChar никогда в потоке не появится, но зато будет fk0(181 знак., 19.03.2016 17:57)
- Ещё раз, используйте ClearCommError. Если в буфере уже есть то количество байт которое нужно, асинхронная операция не нужна. Цимес асинхронщины в том, что Вы запрашиваете заранее и ожидаете доставки, копая и ковыряясь в другом месте :). - Xитpый Kитaeц(20.03.2016 08:12)
- Я и не питал иллюзий по поводу запуска ввода-вывода событиями. Если смотреть код - я жду WaitFof Single Object потом получаю кол-во байт в буфере (почему там именно 4 вообще не понятно) и использую это число для ReadFile. Как я запущу чтение не Mebius(121 знак., 19.03.2016 17:13)
- У Вас нет операции ReadFile ПЕРЕД GetOverlappedResult, откуда Get'у знать, что вы читаете, а не пишете. Все операции с событиями не запускают операции ввода-вывода а устанавливают event'ы в сигнальное состояние. Для получения количества байт в Xитpый Kитaeц(35 знак., 19.03.2016 12:46)
- Кстати записывание чего-либо в cto.ReadIntervalTimeout никак не влияет на ситуацию. Похоже с GetOverlappedResult надо работать немного не так. После выходных продолжу изыскания. - Mebius(19.03.2016 11:08)
- М б тупо взять мой терминал (один из)
и сравнить, что не так в настройкахпросто тупо взять мой терминал :-D - Николай Коровин(18.03.2016 22:26)- Терминалов полно. Хороших и разных. Если б мне нужен был терминал, я б вообще вопросов не задавал. - Mebius(19.03.2016 11:14)
- Не, «хороший» тут неуместен, в нём разбираться, чтобы прикрутить нужный приём нужного пакета — дольше, чем своё писать. Тут нужен «тупой и азбучный», уровня лабораторной работы. Потому что из него можно сделать всё, что нужно. Николай Коровин(148 знак., 19.03.2016 12:09, ссылка)
- Тут синхронный приём. Неужели так всю жизнь и будем в глухих циклах сидеть? Зачем тогда скромные труженики Майкрософт все эти события, потоки, семафоры придумывали? - Mebius(19.03.2016 17:25)
- А асинхронный, после которого надо его Wait — сильно неглухой, ага… Вообще обычно в отдельный тред суют весь свой протокол — он и в цикле сидит, и первый байт ждёт, и тело, и последний, и контрольную смотрит — а потом уже сигналит о приёме. Николай Коровин(276 знак., 19.03.2016 17:35 - 17:43)
- Wait можно MultipleObject Я в последствии собирался всю работу в отдельный дочерний поток выделить а в главном соорудить что-то вроде shell-а и из него посылать дочернему Event-ы. WaitForSingle заменить WaitFor Multiple и тогда программа могда бы Mebius(136 знак., 19.03.2016 17:51)
- Если ты такой квалифицированный, что ж ты элементарную программу приёма данных из компорта написать не можешь и здесь странные вопросы задаёшь? - fk0(19.03.2016 17:58)
- Я как раз себя и имел в виду под неквалифицированным. И хочу написать квалифицированно. Но меня опять к плохому склоняют! - Mebius(19.03.2016 18:05)
- Ну ХЗ, ХЗ. Я уж не помню, как он кэшируется, но когда мне надо было сделать то же самое, я не городил огородов с тредами, а просто время от времени выгребал пришедшее и в цикле зря не сидел. Вроде не терялось ничего. - Николай Коровин(19.03.2016 18:21)
- Читать ReadFile, как у Вас, по одному байту в приложении пользователя это весьма брутально. По ембеддерски :) - Mebius(19.03.2016 18:28)
- По одному — потому что это терминал. Никто не запрещает читать как угодно. - Николай Коровин(19.03.2016 18:33)
- Читать ReadFile, как у Вас, по одному байту в приложении пользователя это весьма брутально. По ембеддерски :) - Mebius(19.03.2016 18:28)
- Ну ХЗ, ХЗ. Я уж не помню, как он кэшируется, но когда мне надо было сделать то же самое, я не городил огородов с тредами, а просто время от времени выгребал пришедшее и в цикле зря не сидел. Вроде не терялось ничего. - Николай Коровин(19.03.2016 18:21)
- Я как раз себя и имел в виду под неквалифицированным. И хочу написать квалифицированно. Но меня опять к плохому склоняют! - Mebius(19.03.2016 18:05)
- Если ты такой квалифицированный, что ж ты элементарную программу приёма данных из компорта написать не можешь и здесь странные вопросы задаёшь? - fk0(19.03.2016 17:58)
- Wait можно MultipleObject Я в последствии собирался всю работу в отдельный дочерний поток выделить а в главном соорудить что-то вроде shell-а и из него посылать дочернему Event-ы. WaitForSingle заменить WaitFor Multiple и тогда программа могда бы Mebius(136 знак., 19.03.2016 17:51)
- А асинхронный, после которого надо его Wait — сильно неглухой, ага… Вообще обычно в отдельный тред суют весь свой протокол — он и в цикле сидит, и первый байт ждёт, и тело, и последний, и контрольную смотрит — а потом уже сигналит о приёме. Николай Коровин(276 знак., 19.03.2016 17:35 - 17:43)
- Тут синхронный приём. Неужели так всю жизнь и будем в глухих циклах сидеть? Зачем тогда скромные труженики Майкрософт все эти события, потоки, семафоры придумывали? - Mebius(19.03.2016 17:25)
- Не, «хороший» тут неуместен, в нём разбираться, чтобы прикрутить нужный приём нужного пакета — дольше, чем своё писать. Тут нужен «тупой и азбучный», уровня лабораторной работы. Потому что из него можно сделать всё, что нужно. Николай Коровин(148 знак., 19.03.2016 12:09, ссылка)
- Терминалов полно. Хороших и разных. Если б мне нужен был терминал, я б вообще вопросов не задавал. - Mebius(19.03.2016 11:14)
- ИМХО возьмите питон и через пару минут получите ответ... - sav6622(18.03.2016 19:00)
- => - Ксения(18.03.2016 15:54, ссылка)
- Ничего не пойму. Что такое nNumberOfBytesToWrite в ответах? Это что, таким способом вообще невозможно принимать неизвестное кол-во байт? - Mebius(18.03.2016 16:56)
- На то она и асинхронная передача. Попробуйте, теста ради, сделать паузу между передачей и приемом - тоже 2 байта примет или больше? - Ксения(18.03.2016 17:09)
- Да писюк только принимает. Передаёт микроконтроллер. - Mebius(18.03.2016 17:29)
- И что именно он передает? - Bill(19.03.2016 10:00)
- 14 байт последний 03h - Mebius(19.03.2016 11:05)
- Я этой функций никогда не пользовалась. Читала обычно через ReadFile(), и от него же узнавала число байт. - Ксения(18.03.2016 17:55)
- Да я тоже не понимаю, зачем какой-то асинхронно-тредовый велосипед городить, когда «всё уже украдено до нас» — в ReadFile всё это уже штатным образом работает. Особенно, когда протокол из одной элементарной структуры. Николай Коровин(171 знак., 19.03.2016 18:36)
- Ничего там не работает. Как научить ReadFile элементарной вещи: чтобы она сначала бесконечно долго ждала либо байта из компорта, либо евента от пользователя. По пришествию 1-го байта измеряла время между следующими байтами и при превышении Mebius(44 знак., 19.03.2016 18:50)
- Легко! Одеть его в функцию, в которой всё это запрограммировать. Вы зажрались и ждёте будто бы "Майкрософт вам должен". - Скрипач(19.03.2016 18:59)
- Угу. Принимая по одному байту в цикле. Детский сад, штаны на лямках. Повторяю вопросы: Чем тогда занимается драйвер? Зачем SetCommMask? Зачем WaitCommEvent? - Mebius(19.03.2016 19:09)
- Не надо сворачивать тему в ленту своего имени :) - Николай Коровин(19.03.2016 19:46)
- Профиль таймаутов задается в dcb-структуре. Остальное - ручками. Sad but true. Скрипач(33 знак., 19.03.2016 19:16)
- На самом деле всё не так как кажется :) - Mebius(19.03.2016 19:59)
- ...не так как в действительности :) - Скрипач(19.03.2016 20:29)
- На самом деле всё не так как кажется :) - Mebius(19.03.2016 19:59)
- Угу. Принимая по одному байту в цикле. Детский сад, штаны на лямках. Повторяю вопросы: Чем тогда занимается драйвер? Зачем SetCommMask? Зачем WaitCommEvent? - Mebius(19.03.2016 19:09)
- Легко! Одеть его в функцию, в которой всё это запрограммировать. Вы зажрались и ждёте будто бы "Майкрософт вам должен". - Скрипач(19.03.2016 18:59)
- Ничего там не работает. Как научить ReadFile элементарной вещи: чтобы она сначала бесконечно долго ждала либо байта из компорта, либо евента от пользователя. По пришествию 1-го байта измеряла время между следующими байтами и при превышении Mebius(44 знак., 19.03.2016 18:50)
- Да я тоже не понимаю, зачем какой-то асинхронно-тредовый велосипед городить, когда «всё уже украдено до нас» — в ReadFile всё это уже штатным образом работает. Особенно, когда протокол из одной элементарной структуры. Николай Коровин(171 знак., 19.03.2016 18:36)
- И что именно он передает? - Bill(19.03.2016 10:00)
- Да писюк только принимает. Передаёт микроконтроллер. - Mebius(18.03.2016 17:29)
- На то она и асинхронная передача. Попробуйте, теста ради, сделать паузу между передачей и приемом - тоже 2 байта примет или больше? - Ксения(18.03.2016 17:09)
- Ничего не пойму. Что такое nNumberOfBytesToWrite в ответах? Это что, таким способом вообще невозможно принимать неизвестное кол-во байт? - Mebius(18.03.2016 16:56)
- В общем, други мои, разобрался я с асинхронным чтением из компорта :) Mebius(1080 знак., 19.03.2016 21:09)KLIM83