генерация события COM-порта

Тема в разделе "WASM.ELECTRONICS", создана пользователем wake, 26 мар 2007.

  1. wake

    wake New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    5
    Люди добрые, подскажите пожалуйста!!!
    Сломал уже голову свою.

    Задача: при помощи источника питания (батарейка, аккумулятор), проводников и рук создать (получить, сгенерировать) какое-либо событие на COM-порте, которое бы могло быть "отловлено" функцией Win API
    WaitCommEvent.

    Код (Text):
    1. // пытаюсь "выловить" любое событие
    2.      if( !SetCommMask(hComPort, EV_CTS | EV_DSR | EV_RXCHAR | EV_BREAK | EV_ERR | EV_RING | EV_RLSD | EV_TXEMPTY) )
    3.     {
    4.            ...
    5.                return 1;
    6.     }
    7.  
    8.     if( !WaitCommEvent(hComPort, &dwEventMask, NULL) )
    9.     {
    10.         ...
    11.         return 1;
    12.     }
    Я делаю:

    Взял две батарейки с материнок, они по 3 В.
    Соединил последовательно... от них два проводника..
    один проводник втыкаю... в GND ... другой....
    по очереди... во все pin'ы ...

    P.S. Пытался делать как в топике http://www.wasm.ru/forum/viewtopic.php?id=19024
    но ничего не получается.

    P.S.S. Со схемотехникой .. и прочим - плохо у меня!(
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Прерывание может генериться по приходу единицы на один из входов - CTS DSR RI DCD соответственно ноги 8, 6, 9, 1.(в 9-штырьковом разъёме) А как отлавливать момент прерывания - не скажу, т.к. не знаю как это при помощи ВыньАПИ делается, может их даже надо в цикле опрашивать. Если надо могу помочь технической документацией по RS-232.
    Батарейки не помогут, так как по стандарту RS-232 вызокий уровень +12 Вольт (низкий -12 Вольт или ноль в урезанных вариантах) да и порт можно сжечь по неосторожности. Питание можно взять с одного из выходов, поставив его в единицу.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Имхо удобнее LPT. Можно сразу много битов передать
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    В том то и дело, что только передать. На приём надо включать ECP, а это может быть проблемно начинающим. И с такой электроникой как здесь будет риск сжечь порт.
     
  5. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    wake

    <Прерывание может генериться по приходу единицы на один из входов - CTS DSR RI DCD соответственно ноги 8, 6, 9, 1.(в 9-штырьковом разъёме) А как отлавливать момент прерывания - не скажу, т.к. не знаю как это при помощи ВыньАПИ делается, может их даже надо в цикле опрашивать>

    По хорошему, тебе можно накалякать свой протсенький драйверок и повесить его в таблицу IDT на соответствующее прерывание. Из юзермода читать можно только путём опроса порта, но, если частота импульсов будет большая, то счётчик их будет терять. Напрямую читать порт можно в 9х системах, в NT придётся заюзать giveio. Проще я думаю написать драйверок и пусть он там сам считает,а данные счётчика запрашивать из юзермоде стандартными средствами. Можно конечно и со стандартным драйвером поработать, но я хз как если честно.
     
  6. wake

    wake New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    5
    ОФФТОПИК:
    Спасибо всем большое за ответы!!!
    А почему-тут плюсики не ставяться??:)
     
  7. wake

    wake New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    5
    С этим полностью согласен.
    Да, мне именно прерывания и желательно отлавливать, но для начала их надо как-то создать.
    Из драйвера не знаю как отлавливать, поэтому решил при помощи WinAPI попробовать.
    Пулингом (опрос в цикле) - работает, но очень криво и загрузка процессора 100% :'-(((
    Документация по RS-232 имеется.
    По поводу +12 и -12 Вольт позволю себе не согласиться.
    для передатчика:
    -15В ... -5В : низкий уровень
    -5В ... +5В : зона неопределенности
    +5В ... +15В : высокий уровень

    для приемника:
    -25В ... -3В : низкий уровень
    -3В ... +3В : зона неопределенности
    +3В ... +25В : высокий уровень
    Только я не могу понять.... в некоторых источниках пишут, что логическая '1'ца это -12 Вольт, по-науке же должна быть +12 Вольт?

    Питание с одного из pin'ов брал... но не знаю... что-то как-то не очень оно хочет взаимодействовать! (((
     
  8. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Все верно, надо с помошью API настроить, инить формат использования сигналов, заставить операционку сообщать в твою программу НУЖНЫЕ события(изменения) на линиях COM порта. Драйвера для этого НЕ нужно!
    Вот истина программирования и что важно, проффесионально детализировано
    здесь http://www.realcoding.net/article/view/2416
    ОЧЧЧЕНЬ хорошая и проверенная практикой статья! Если конкретно поней, то тебя интересует асинхронное владение портом, тогда проц просто отдыхает! События однако. :)
     
  9. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Статья неплохая, но автор кажется не имеет представления как устроен порт - только выньАПИ.
    У всех портов, которые я видел положительная логика ( лог.1=+15В лог.0=-15В) В моих портах например 12,5 вольт :derisive: Всё зависит от проихводителя. В очень редких случаях при лог. нуле может быть ноль вольт.

    Вот нашёл доку на ключи, используемые почти на всех новых матерях (я такие видел на 2, 3 и 4 пнях) Там все параметры есть.
    http://focus.ti.com/lit/ds/symlink/gd75232.pdf
     
  10. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    1. Атор уделил внимание ИМЕННО апи и АСИНХРОННОМУ взаимодействию на уровне системы, это не у всех раскрыто...
    2. на счет вольтажа, так это не производитель, а диктует стандарт, там как бы от 3...30 в минус и плюс допуск на напруги для распознания входных линий на предмет лог 1 или 0. Ноль вольт у нормальных схем считается зоной неопределенности, поэтому при ассиметричном решении входных цепей (нерационально добывать скажем -12В для подпорки некого контакта ,который хочется завесить на входной пин) делают искуственную подпорку любым удобным по задумке и схеме ВЫХОДым сигналом COM порта, например DTR. При этом нужно позаботиться, при ините, COM порта или не забыть перед началом работы (опроса входа, например) выдать команду DTR установить в статус -12B на выходе.
     
  11. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    А не проще ли поставить обычную заглушку и не париться с батарейками, уровнями напряжений и т.п.?
     
  12. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Исходный пост - есть постановка задачи... и тут либо автор меняет по ходу мнение и доверяется, либо уточняет "жёсткость исходных условий" задачи...
     
  13. mostik

    mostik New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2007
    Сообщения:
    3
    Уважаемые, у вас какая-то путаница с логическими уровнями 0 и 1. Согласно документации на RS-232 логической "1" соответствует -3...-25 В, а "0" - положительное напряжение.
    Реальный порт нулевое напряжение воспринимает также как отрицательное, по крайней мере вход приемника, логическая "1" на входе - это исходное состояние, т.е. отсутствие сигнала. Прием символа начинается со стартового импульса, котрый дается логическим "0", т.е. плюсовым напряжением.
    Отлавливать прерывание по принятому символу RXCHAR бесполезно, имитировать старт-стопную комбинацию весьма проблематично. А вот служебные линии - то, что нужно.
    Кстати, среди них кажется DCD (а может и еще какая) генерит прерывание не по конкретному уровню, а по переходу из 1 в 0 и обратно. На использовании этого принципа в журнале "Радио" году в 2005 были описаны схемки по управлению компьютером с телевизионной дистанционки.
    Далее, АПИ WaitCommEvent не возвращается, пока на произойдет одно из ожидаемых событий, признак которого она запишет в твою dwEventMask. Если ты хочешь во время ожидания делать еще что-то, вынеси ожидание в отдельный поток и наслаждайся.
     
  14. ksacvet777

    ksacvet777 Александр

    Публикаций:
    0
    Регистрация:
    9 ноя 2006
    Сообщения:
    180
    Адрес:
    Кемеровская обл.
    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) , чтоб не задумываться есть ли на ножке регистра аппаратная инверсия или нет , а просто посылать команды с указанием номара регистра и ножки.