Народ, подскажите где можно почитать о том,
как на Visual C++ 6.0 работать с модемами. Например, как
через последовательный порт посылать модему символы команд.
Последний раз с последовательными портами я работал
на ассемблере и на Borland C, и то в DOS-е. А как в Windows-e
с ними работать?
> Народ, подскажите где можно почитать о том, > как на Visual C++ 6.0 работать с модемами. Например, как > через последовательный порт посылать модему символы команд. > Последний раз с последовательными портами я работал > на ассемблере и на Borland C, и то в DOS-е. А как в > Windows-e > с ними работать?
Привет, Народ.
С интересом прочитал ваши рассуждения, т.к. сейчас сам столкнулся с этой проблемой. Заранее предупреждаю, что не являюсь спецом (пока).
Мне кажется, что гораздо проще было бы использовать прерывание БИОС (14h), т.к. в этом случае прога будет работать как под ДОС, так и под Винды любой версии.
В свою очередь имею вопрос к вам: "Каким образом выставить скорость порта больше 9600?". Нулевая функция БИОСа позволяет установить скорость максимум на 9600, или я ошибаюсь? Варианты можно предлагать любые, но только не использование прерываний ДОС.
Заранее благодарен.
> > Народ, подскажите где можно почитать о том, > > как на Visual C++ 6.0 работать с модемами. Например, > как > > через последовательный порт посылать модему символы > команд. > > Последний раз с последовательными портами я работал > > на ассемблере и на Borland C, и то в DOS-е. А как в > > Windows-e > > с ними работать? > > > Привет, Народ. > С интересом прочитал ваши рассуждения, т.к. сейчас сам > столкнулся с этой проблемой. Заранее предупреждаю, что не > являюсь спецом (пока). > Мне кажется, что гораздо проще было бы использовать > прерывание БИОС (14h), т.к. в этом случае прога будет > работать как под ДОС, так и под Винды любой версии. > В свою очередь имею вопрос к вам: "Каким образом выставить > скорость порта больше 9600?". Нулевая функция БИОСа > позволяет установить скорость максимум на 9600, или я > ошибаюсь? Варианты можно предлагать любые, но только не > использование прерываний ДОС. > Заранее благодарен.
Нормальная работа с COM портом сводится к его
1) инициализации (для этого можно использовать и 14h BIOS, но тогда нет возможности установить скорость больше 9600),
2) установке вектора прерывания (для приема и передачи - ЭТО САМЫЙ ПРИНЦИПИАЛЬНЫЙ МОМЕНТ, так как без данного вектора нет возможности СПОКОЙНО сидеть в резиденте)
3) контроле регистров порта (ЭТО ЕЩЕ БОЛЕЕ ПРИНЦИПИАЛЬНЫЙ МОМЕНТ , так как только приямое чтение регистров позволяет получать всю возможную информацию о состоянии порта. Простой пример. У нас есть нуль модемный кабель и мы конектим два порта. Две главные проблемы, которые встают в данном случае. Распайки нуль модема бывают нескольких вариантов, одни позволяют получать подтверждение передачи, а другие нет. Попробуйте использовать ДОС или BIOS для приема передачи с различными видами кабелей и Вы убедитесь, что можно соплями изойти прежде чем все переданное будет принято.
Второй момент в установке скорости - технический предел - это 115200 и с помощью BIOS он не устанавливается, а устанавливается прямой записью в базовый регистр (БР) и БР+1 двух значений делителся частоты - ЭТО в качестве ответа на вопрос (для более полной информации придется смотреть спец. литературу (практически любой справочник по асемблеру или Фролов "Аппаратное обеспечение" т. 33))) Интересно, что Windows позволяет устанавливать скорость порта (вплоть до 115200) , а вот котролировать его регистры нет.
Если упомянуть о проблеме, которая волнует меня - как в защищенном режиме миновать ограничения таблицы доступа к портам (как это технически правильно звучит я не знаю) или как получить уровень досупа "ядро".
ЗЫ: гарантии, что работа через BIOS будет всегда поддерживаться Windows нет никакой.
> Народ, подскажите где можно почитать о том, > как на Visual C++ 6.0 работать с модемами. Например, как > через последовательный порт посылать модему символы команд. > Последний раз с последовательными портами я работал > на ассемблере и на Borland C, и то в DOS-е. А как в > Windows-e > с ними работать?
v Windows s ljubym ustrojstvom mozhno rabotat' kak s obychnym file-om, t.e. k primeru tebe nado otkryt' dostup k COM1 :
hFile = ::CreateFile("COM1", ....);
nado poslat' dannye :
::WriteFile(hFile, lpBuffer, ....);
nado poluchit' :
::ReadFile(hFile, lpBuffer, ....);
i t.d.....
takim zhe makarom mozhno rabotat' s LPT
eta tema tut mnogo raz obsuzhdalas', luchshe poishi v archive-ax, dumaju najdesh' xoroshuju informaciu.
Методика hFile = ::CreateFile("COM1", ....); предлагается в большинстве литературных источников (Дж. Рихтер "Windows для профессионалов") и, судя по-всему, является единственной документированной возможностью просто работать с COM.
Эта тема действительно уже обсуждалась на форуме, но дальше использования этой функции обсуждение не заходилою
Я пробовал работать с CreateFile, но мне это не подошло (велика потребность использовать прерывания). Я обошел проблему (в своем случае) тем, что напсал на Borland C обработчик прерывания (DOS) и использовал его в Win95 - для решения моей проблемы этого было достаточно. В ОС выше 95-х данный номер уже не проходит ,- там даже при чтении значения регистров неправильные выдаются (хотя в WinXP может быть что-то и снова заработает).
Лично я ничего более умного предложить не могу, но с удовольствием послушал бы человека объяснившего как особо не пыжась состряпать драйверок уровня ядра для портов или хотя бы описал интерфейс каких-нибудь существующих драйверов (функций).
> Методика hFile = ::CreateFile("COM1", ....); предлагается в > большинстве литературных источников (Дж. Рихтер "Windows > для профессионалов") и, судя по-всему, является > единственной документированной возможностью просто работать > с COM. > Эта тема действительно уже обсуждалась на форуме, но дальше > использования этой функции обсуждение не заходилою > Я пробовал работать с CreateFile, но мне это не подошло > (велика потребность использовать прерывания). Я обошел > проблему (в своем случае) тем, что напсал на Borland C > обработчик прерывания (DOS) и использовал его в Win95 - для > решения моей проблемы этого было достаточно. В ОС выше 95-х > данный номер уже не проходит ,- там даже при чтении > значения регистров неправильные выдаются (хотя в WinXP > может быть что-то и снова заработает). > Лично я ничего более умного предложить не могу, но с > удовольствием послушал бы человека объяснившего как особо > не пыжась состряпать драйверок уровня ядра для портов или > хотя бы описал интерфейс каких-нибудь существующих > драйверов (функций).
tvoi preryvania budut rabotat' tol'ko pod win95 i emu podobnyx. eto perezhitki DOS-a.
Ya uveren eto ne rabotaet pod NT, i ochen' nadejus' chto ne budet rabotat' pod XP....
ya pravda ne predstavljaju kakie u teby aser'eznye problemy, no dumaju esli ty poveduesh' o nix narodu, to oni tebe pomogut.
mozhet tebe driver pisat' nado, prichem v kernel mode, togda konechno CreateFile ne goditsya odnoznachno. no dlya bol'shinstva sluchaev - eto dovol'no udobnaya.
i vopros dazhe ne v dokumentacii, a v organizovannosti systemy. ona sama raspoznaet k kakomu ustrojstvu "stuchatsya". tebe zhe nuzhno tol'ko zadat' unikal'nye imena dlja tvoix I/O ustrojstv.
Postarajsya xorosho organizovat' svoju zadachu i napishi na dosku.