Люди добрые, подскажите пожалуйста!!! Сломал уже голову свою. Задача: при помощи источника питания (батарейка, аккумулятор), проводников и рук создать (получить, сгенерировать) какое-либо событие на COM-порте, которое бы могло быть "отловлено" функцией Win API WaitCommEvent. Код (Text): // пытаюсь "выловить" любое событие if( !SetCommMask(hComPort, EV_CTS | EV_DSR | EV_RXCHAR | EV_BREAK | EV_ERR | EV_RING | EV_RLSD | EV_TXEMPTY) ) { ... return 1; } if( !WaitCommEvent(hComPort, &dwEventMask, NULL) ) { ... return 1; } Я делаю: Взял две батарейки с материнок, они по 3 В. Соединил последовательно... от них два проводника.. один проводник втыкаю... в GND ... другой.... по очереди... во все pin'ы ... P.S. Пытался делать как в топике http://www.wasm.ru/forum/viewtopic.php?id=19024 но ничего не получается. P.S.S. Со схемотехникой .. и прочим - плохо у меня!(
Прерывание может генериться по приходу единицы на один из входов - CTS DSR RI DCD соответственно ноги 8, 6, 9, 1.(в 9-штырьковом разъёме) А как отлавливать момент прерывания - не скажу, т.к. не знаю как это при помощи ВыньАПИ делается, может их даже надо в цикле опрашивать. Если надо могу помочь технической документацией по RS-232. Батарейки не помогут, так как по стандарту RS-232 вызокий уровень +12 Вольт (низкий -12 Вольт или ноль в урезанных вариантах) да и порт можно сжечь по неосторожности. Питание можно взять с одного из выходов, поставив его в единицу.
В том то и дело, что только передать. На приём надо включать ECP, а это может быть проблемно начинающим. И с такой электроникой как здесь будет риск сжечь порт.
wake <Прерывание может генериться по приходу единицы на один из входов - CTS DSR RI DCD соответственно ноги 8, 6, 9, 1.(в 9-штырьковом разъёме) А как отлавливать момент прерывания - не скажу, т.к. не знаю как это при помощи ВыньАПИ делается, может их даже надо в цикле опрашивать> По хорошему, тебе можно накалякать свой протсенький драйверок и повесить его в таблицу IDT на соответствующее прерывание. Из юзермода читать можно только путём опроса порта, но, если частота импульсов будет большая, то счётчик их будет терять. Напрямую читать порт можно в 9х системах, в NT придётся заюзать giveio. Проще я думаю написать драйверок и пусть он там сам считает,а данные счётчика запрашивать из юзермоде стандартными средствами. Можно конечно и со стандартным драйвером поработать, но я хз как если честно.
С этим полностью согласен. Да, мне именно прерывания и желательно отлавливать, но для начала их надо как-то создать. Из драйвера не знаю как отлавливать, поэтому решил при помощи WinAPI попробовать. Пулингом (опрос в цикле) - работает, но очень криво и загрузка процессора 100% :'-((( Документация по RS-232 имеется. По поводу +12 и -12 Вольт позволю себе не согласиться. для передатчика: -15В ... -5В : низкий уровень -5В ... +5В : зона неопределенности +5В ... +15В : высокий уровень для приемника: -25В ... -3В : низкий уровень -3В ... +3В : зона неопределенности +3В ... +25В : высокий уровень Только я не могу понять.... в некоторых источниках пишут, что логическая '1'ца это -12 Вольт, по-науке же должна быть +12 Вольт? Питание с одного из pin'ов брал... но не знаю... что-то как-то не очень оно хочет взаимодействовать! (((
Все верно, надо с помошью API настроить, инить формат использования сигналов, заставить операционку сообщать в твою программу НУЖНЫЕ события(изменения) на линиях COM порта. Драйвера для этого НЕ нужно! Вот истина программирования и что важно, проффесионально детализировано здесь http://www.realcoding.net/article/view/2416 ОЧЧЧЕНЬ хорошая и проверенная практикой статья! Если конкретно поней, то тебя интересует асинхронное владение портом, тогда проц просто отдыхает! События однако.
Статья неплохая, но автор кажется не имеет представления как устроен порт - только выньАПИ. У всех портов, которые я видел положительная логика ( лог.1=+15В лог.0=-15В) В моих портах например 12,5 вольт Всё зависит от проихводителя. В очень редких случаях при лог. нуле может быть ноль вольт. Вот нашёл доку на ключи, используемые почти на всех новых матерях (я такие видел на 2, 3 и 4 пнях) Там все параметры есть. http://focus.ti.com/lit/ds/symlink/gd75232.pdf
1. Атор уделил внимание ИМЕННО апи и АСИНХРОННОМУ взаимодействию на уровне системы, это не у всех раскрыто... 2. на счет вольтажа, так это не производитель, а диктует стандарт, там как бы от 3...30 в минус и плюс допуск на напруги для распознания входных линий на предмет лог 1 или 0. Ноль вольт у нормальных схем считается зоной неопределенности, поэтому при ассиметричном решении входных цепей (нерационально добывать скажем -12В для подпорки некого контакта ,который хочется завесить на входной пин) делают искуственную подпорку любым удобным по задумке и схеме ВЫХОДым сигналом COM порта, например DTR. При этом нужно позаботиться, при ините, COM порта или не забыть перед началом работы (опроса входа, например) выдать команду DTR установить в статус -12B на выходе.
Исходный пост - есть постановка задачи... и тут либо автор меняет по ходу мнение и доверяется, либо уточняет "жёсткость исходных условий" задачи...
Уважаемые, у вас какая-то путаница с логическими уровнями 0 и 1. Согласно документации на RS-232 логической "1" соответствует -3...-25 В, а "0" - положительное напряжение. Реальный порт нулевое напряжение воспринимает также как отрицательное, по крайней мере вход приемника, логическая "1" на входе - это исходное состояние, т.е. отсутствие сигнала. Прием символа начинается со стартового импульса, котрый дается логическим "0", т.е. плюсовым напряжением. Отлавливать прерывание по принятому символу RXCHAR бесполезно, имитировать старт-стопную комбинацию весьма проблематично. А вот служебные линии - то, что нужно. Кстати, среди них кажется DCD (а может и еще какая) генерит прерывание не по конкретному уровню, а по переходу из 1 в 0 и обратно. На использовании этого принципа в журнале "Радио" году в 2005 были описаны схемки по управлению компьютером с телевизионной дистанционки. Далее, АПИ WaitCommEvent не возвращается, пока на произойдет одно из ожидаемых событий, признак которого она запишет в твою dwEventMask. Если ты хочешь во время ожидания делать еще что-то, вынеси ожидание в отдельный поток и наслаждайся.
wake Действительно ,как сказал один из участников намного удобнее использовать LPT-порт , я как раз этим сейчас и занимаюсь .. и всё очень просто !!! есть драйвер: http://www.energoarhiv.narod.ru/driver.rar ставишь его , перезагружаешься, всё как обычно и всё. С установленым драйвером идут эксэмплы для вижуал си++ и вижуал бэйсика. просто указываешь адрес порта куда будешь писать или откуда читать и читаешь (пишешь). Для справки необходима инфа, вот эта: http://www.vbrussian.com/Article.asp?ID=101 http://www.lpt-port.narod.ru/5.html http://emfl.nm.ru/menu/lpt/lpt.htm можно ставить соответствующий бит на ножках(управлять устройствами) или читать бит (считывать состояние устройства). Сейчас пишу программу , которая будет принимать команды записи и чтения состояния ножек LPT от внешних приложений по UDP-протоколу (127.0.0.1:60000) , чтоб не задумываться есть ли на ножке регистра аппаратная инверсия или нет , а просто посылать команды с указанием номара регистра и ножки.