[ZX]
-
- Кстати записывание чего-либо в 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)