
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ты работаешь с Сом портом через TDCВ???Если да, то в DCB.Flags проверь биты установки режима HandShake для fDTRControl,FDsrSensitivity,fRTSControl.И обязательно должен быть включен fOutCTSFlow. Какие биты я не помню,но в нете по Flags полно инфы. Да кстати по поводу снятия трубки на другом конце. Года 2 назад я эту проблему решил путем подключения дополнительного девайса на МК51 к компу. Если интересно, могу поподробнее. |
Сообщ.
#17
,
|
|
|
Что такое TDCВ? Я пример приводил, как я с портом работаю.
|
Сообщ.
#18
,
|
|
|
Аппаратный контроль данных - работа с линиями RTS/CTS. Они включаются модемом или компом, когда их буфер приема заполнен полностью.
Есть еще DTR/DSR. Они устанавливаются когда приемный буфер заполнен на 3/4. (тоно насчет доли не уверен) Добавлено Это нужно в первую очередь для модема, иначе он может не успеть обработать твои данные и освободить буфер. Добавлено Цитата medved_68 @ Года 2 назад я эту проблему решил путем подключения дополнительного девайса на МК51 к компу. Если интересно, могу поподробнее. Интересно. Особенно схематика подключения к линии. |
Сообщ.
#19
,
|
|
|
Prince
Цитата Prince @ Что такое TDCВ? Я пример приводил, как я с портом работаю. Ты с портом работаешь через WriteFile, readFile. Это я понял. Но как ты его настраиваешь перед работой, после того как открыл CreateFile???? Откуда он у тебя знает с какой скоростью работать, какие таймауты и т.д. Поэтому я и спрашиваю: Цитата medved_68 @ Ты работаешь с Сом портом через TDCВ??? Цитата Prince @ Что такое TDCВ? Обволакивающий класс для структуры DCВ, в которой должны быть прописаны настройки компорта при его открытии. После открытия порта выполняется команда SetCommState (Handle,lpDCB)(за синтаксис не ручаюсь),которая настроит порт согласно тем данным, которые ты занес в структуру DCВ, а если в дельфях то TDCВ.Flags. И после этого только можно с ним работать. ![]() ![]() Testudo Цитата Testudo @ Интересно. Особенно схематика подключения к линии. Сегодня пороюсь в архивах.Там только был небольшой нюанс - вероятность определения 50-70%, а на блокированных линиях вообще грустно где то 10-20%, но у нас сейчас почти их не осталось, хотя кто его знает. Помню только, что сама линия заводилась на устройство через обычный диодный мост на КЦ407. Тогда меня порадовало одно-отсутствие ложных срабатываний, типа когда никто трубку не снял, а датчик сработал. И еще не сделал в свое время усреднение в зависимости от АТС к кому подключаешься, там несильно, но были различия во времени ответа станции. Но шел путем АОНа на ВМ80 + АОНа на Z80 это я точно помню. |
Сообщ.
#20
,
|
|
|
Цитата Аппаратный контроль данных - работа с линиями RTS/CTS. Они включаются модемом или компом, когда их буфер приема заполнен полностью. Есть еще DTR/DSR. Они устанавливаются когда приемный буфер заполнен на 3/4. (тоно насчет доли не уверен) А как именно с ними работать? Вот я отправляю какой-то буфер командой writefile. Как узнать, какой размер данных можно отправить за раз? И когда можно отправлять новую порцию данных? Добавлено Цитата После открытия порта выполняется команда SetCommState (Handle,lpDCB)(за синтаксис не ручаюсь),которая настроит порт согласно тем данным, которые ты занес в структуру DCВ, а если в дельфях то TDCВ.Flags. И после этого только можно с ним работать. Может у тебя все в норме в проге и просто порт не настроен, судя по твоему последнему письму??? А, понял. Да, через DCB. Ну я посмотрел вначале настройки через GetCommState, а что именно и как нужно настроить для передачи голосовых данных, не знаю. Работает - и работает. Хотя вот уже знаю, что должен быть включён аппаратный контроль данных. Буду пробовать. |
Сообщ.
#21
,
|
|
|
Цитата Prince @ А как именно с ними работать? Вот я отправляю какой-то буфер командой writefile. Как узнать, какой размер данных можно отправить за раз? И когда можно отправлять новую порцию данных? ты можешь отправить сразу хоть все данные только при работе в синхроне writefile тебе не вернет управление пока все не отправит. А если в этот момент случится авария на линии то все зависнет, причем наглухо. Я же тебе говорю: "переходи на асинхрон". Тогда структура Overlap тебе вернет количество реально переданных в линию байт, даже если случится внезапный Break. А момент когда можно отправить очередную порцию отслеживается наблюдением за событием EV_TXEMPTY (из буфера передачи послан последний символ). В это же время и произойдет установка события Overlap.Event, привязанного к записи. |
Сообщ.
#22
,
|
|
|
Если в синхроне, то отправлять данные модему желательно по одному байту, при этом проверяя сигнал CTS. Если он установлен - писать можно. Если нет - нужно подождать.
|
Сообщ.
#23
,
|
|
|
Testudo
Цитата Testudo @ Если в синхроне, то отправлять данные модему желательно по одному байту, при этом проверяя сигнал CTS Почему??? Если настроен аппаратный контроль, то драйвер сам будет приостанавливать передачу по сбросу CTS и ждать пока пока модем его выставит. |
Сообщ.
#24
,
|
|
|
Другими словами, нужно просто включить аппаратный контроль и забыть про этот самый контроль? Драйвер всё сделает сам? А мне остаётся только написать команду writefile и ждать, пока она не выполнится?
Цитата ты можешь отправить сразу хоть все данные только при работе в синхроне writefile тебе не вернет управление пока все не отправит. А если в этот момент случится авария на линии то все зависнет, причем наглухо. А можно ли избежать зависания, выставив таймауты? |
Сообщ.
#25
,
|
|
|
Цитата medved_68 @ За модем не отвечаю. Если настроен аппаратный контроль, то драйвер сам будет приостанавливать передачу по сбросу CTS и ждать пока пока модем его выставит. Я же сказал, что работал с самодельными устройствами. У них делал все как положено, но аппаратный контроль ничего не проперал. |
Сообщ.
#26
,
|
|
|
Цитата Prince @ Другими словами, нужно просто включить аппаратный контроль и забыть про этот самый контроль? Драйвер всё сделает сам? А мне остаётся только написать команду writefile и ждать, пока она не выполнится? Да,если ты правильно настроишь TDCB.Flags. Надо ожидать завершения writefile и анализировать сколько байт передано, хотя она все равно не вернет управление пока все заявленное не передаст,если не выставлен таймаут по времени записи. Но его надо устанавливать при каждой операции, если передаешь блоки разной длинны, или на время передачи самого длинного блока, тогда нужен анализ, сколько байт передано, если меньше чем нужно, то повторить writefile с передачей того что не допередал. Цитата Prince @ А можно ли избежать зависания, выставив таймауты? Именно для этого они и придуманы!!!! Testudo Цитата Testudo @ Я же сказал, что работал с самодельными устройствами. У них делал все как положено, но аппаратный контроль ничего не проперал. Значит неправильно настроил порт на аппаратный контроль. По умолчанию плевать он хотел на все управляющие сигналы. ![]() ![]() А по самопалу могу сказать, что я по прерыванию от порта на микроконтроллере сразу выставляю CTS, затем считываю байт из регистра приемника, обрабатываю его, и только потом снимаю CTS. Т.е. делаю как ты говорил, но только со стороны самопала, со стороны компа это все уже продумали за меня. |
Сообщ.
#27
,
|
|
|
Цитата medved_68 @ И плохо, что думать не хочешь. Значит неправильно настроил порт на аппаратный контроль. По умолчанию плевать он хотел на все управляющие сигналы. А по самопалу могу сказать, что я по прерыванию от порта на микроконтроллере сразу выставляю CTS, затем считываю байт из регистра приемника, обрабатываю его, и только потом снимаю CTS. Т.е. делаю как ты говорил, но только со стороны самопала, со стороны компа это все уже продумали за меня. |
Сообщ.
#28
,
|
|
|
Testudo
Цитата Testudo @ И плохо, что думать не хочешь. Изобретать велосипед конечно полезно, но зачем??? ![]() |
Сообщ.
#29
,
|
|
|
Цитата Да,если ты правильно настроишь TDCB.Flags А как правильно настроить? |
Сообщ.
#30
,
|
|
|
![]() ![]() А как правильно настроить? Просто обнули DCB.Flags и хлопни нужные маски Or. Файл в аттаче. ![]() Прикреплённый файл ![]() |