В КиевРазве не красиво в Киеве?

Переписка по прерываниям COM-порта

В 2007 году один товарищ попросил помочь ему с прерываниями com-порта. Вот что из этого вышло.
Судя по IP, человек из под Новосибирска или Барнаула (Spassk).

nikkidemo:
COM.

Символы выводятся только при запуске маленьких программ под DOS - на ввод символа в порт и на считывание из порта и отображаются на экране.
То есть, если исключить запуск этих программ, и просто подвесить резидента, то при организации связи между PC и ноутбуком с DOS'ом при посылки с PC какого-либо символа по COM1, прерывание не сработает (оно вообще ни разу не сработало). Хотя в порту ноутбука точно есть этот переданный символ.

Еще раз: о наличие переданного с компа символа в порт ноутбука я узнаю
лишь по результату запуска проги под dos, которая и считывает состояние порта 3f8, а не по работе моего обработчика прерывания.

Кстати, volkov commander показывает, что мой обработчик на прерывание на самом деле установлен (при нажатии alt f5 выводится список процессов).

Мне просто хотелось бы понять логику возникновения прерываний от порта - почему на каком-то шаге оно не срабатывает. Перехват, как говорил, прерывания 0Ch.

Евгений:
COM. ну что я могу сказать. вероятно, вы неправильно обрабатываете прерывания.

nikkidemo:
Насчет прерываний.
Я уже и так догадался что дело в прерывании:) Вопрос в каком? и где?

Я указывал на три места, где необходимо было разрешить их. Вроде все согласно докам.

Евгений:
они разрешены. их нужно перехватить. вероятно, вы неправильно их перехватываете.

nikkidemo:
Перехват стандартный:
установка перехвата посредством 21h прерывания и использования функций 35 и
25 этого int'а.

Вначале сохраняю адрес старого обработчика(загоняю в ax 350Ch), затем ставлю свое смещение (загоняю в ax 250Сh). И подвешиваю резидента.

Но в начале, при инициализации com-порта(для этого у меня другая программка служит), последним действием я демаскирую флаги контроллера прерываний ICW1 путем записи в порт 20h 11110111b. Правда по контроллеру так и не нашел стоящую доку. Может здесь не правильно что-то.

Евгений:
зачем вам нужно маскировать их?

nikkidemo:
Маскировка прерываний - лишь общая фраза, встречаюшаяся в доках. Как я понял, на деле, это просто разрешение контроллеру IRQ обрабатывать прерывания устройств. Например записав в порт 21h единицу в позицию xxx-го бита ( просто не помню какого :) - сейчас нет под рукой рабочего места ) можно добиться запрета на работу клавы. Или что-то в этом роде:).

Евгений:
да. 21-ый порт - нулевой бит - это таймер. и т.д. но тебе они не нужны. перехватывай прерывание мыши и вперёд.

nikkidemo:
Перехват мыши не моя задача:)
В вопросе еще на rusfaq'е я говорил о приборе, а не о мыши. То есть мне просто надо поймать тот момент, когда данные придут из прибора на COM-порт, с тем, чтобы я мог их записать куда мне надо.

По приходу символа в COM-порт, в нем в одном из внутренних адресов возникает "исключение", ситуация, генерирующее прерывание. Вот его то мне и хоца поймать:). Поэтому весь сыр-бор.

И когда через терминал на обычном PC я подсоединяюсь к COM порту ноутбука (через обычный нуль-модем), и посылаю символ, то резидент в памяти DOS - тупо ничего не делает.

Евгений:
нуль-модем - это отдельная тема. там вроде другие сигналы.

nikkidemo:
нуль-модем - для связи по rs-232(COM-порту) между двумя компами - в моем случае это ноутбук и обычный комп. В нуль модеме - три перекрестные пары. А для связи с прибором потом я буду использовать обычный модемный кабель.
Но здесь все подключено верно и ошибки в кабелях не должно быть.

Спасибо, что уделяете время моей проблеме.
Завтра на рабочем месте попробую еще один вариант. Посмотрим что получится.

Евгений:
нуль-модем - это другие сигналы, вроде. не стандартный вариант. нужна поддержка какая-то, или инициализация. я в этом не разбирался, не могу ничего подсказать.