Прерывание СОМ-порта
Решил написать программку, использующую прерывания СОМ-порта. Написал тестовый пример, который при каждом вызове прерывания увеличивает счетчик вызовов прерывания на 1. Текущее значение счетчика вывожу на экран в основной программе. Вот только беда, прерывания не возникает.
Вот кратко какие действия я делаю.
1. В регистр управления модемом (BasePor+4) устанавливаю линию Out2=1.
2. В регистре разрешения прерывания (BasePor+1) устанавливаю первые четыри бита в 1 (разрешаю все прерывания).
3. Для контроллера прерываний 8259 (21h) устанавливаю все биты в 0 (все IRQ разрешены).
4. Далее все как обычно....(вот только что-то не работает).
Вот маленький пример:
#include <DOS.h>
#define BasePort 0x3F8
void interrupt far work(void); // функция обработки прерывания
void (interrupt far *old_handler)(); // вектор прежнего прерывания
volatile int i=0; // счетчик вызовов обработчика прерывания
void main()
{
outp(BasePort+4,15); // четырем битам регистра управления модемом присвоено 1 (OUT2=1)
outp(BasePort+1,15); // разрешили все прерывания для СОМ1
outp(0x21,inp(0x21)&0xEF); // установили маску для контроллера 8259
_disable();
old_handler = _dos_getvect(0x0C); // запомнили старый вектор
_dos_setvect(0x0C, work); // установили новый обработчик
_enable();
while(!kbhit())
{
printf("%d \n",i);
}
_dos_setvect(0x0C, old_handler); // вернули прежний вектор
}
void interrupt far work(void) // функция обработки прерывания
{
++i; // увеличиваем счетчик на 1
outp(0x20,0x20); // сигнал контроллеру 8259 «Конец прерывания»
}
Так что все-таки не так?
Добрый день господа!
Решил написать программку, использующую прерывания СОМ-порта. Написал тестовый пример, который при каждом вызове прерывания увеличивает счетчик вызовов прерывания на 1. Текущее значение счетчика вывожу на экран в основной программе. Вот только беда, прерывания не возникает.
Вот кратко какие действия я делаю.
1. В регистр управления модемом (BasePor+4) устанавливаю линию Out2=1.
2. В регистре разрешения прерывания (BasePor+1) устанавливаю первые четыри бита в 1 (разрешаю все прерывания).
3. Для контроллера прерываний 8259 (21h) устанавливаю все биты в 0 (все IRQ разрешены).
4. Далее все как обычно....(вот только что-то не работает).
Вот маленький пример:
#include <DOS.h>
#define BasePort 0x3F8
void interrupt far work(void); // функция обработки прерывания
void (interrupt far *old_handler)(); // вектор прежнего прерывания
volatile int i=0; // счетчик вызовов обработчика прерывания
void main()
{
outp(BasePort+4,15); // четырем битам регистра управления модемом присвоено 1 (OUT2=1)
outp(BasePort+1,15); // разрешили все прерывания для СОМ1
outp(0x21,inp(0x21)&0xEF); // установили маску для контроллера 8259
_disable();
old_handler = _dos_getvect(0x0C); // запомнили старый вектор
_dos_setvect(0x0C, work); // установили новый обработчик
_enable();
while(!kbhit())
{
printf("%d \n",i);
}
_dos_setvect(0x0C, old_handler); // вернули прежний вектор
}
void interrupt far work(void) // функция обработки прерывания
{
++i; // увеличиваем счетчик на 1
outp(0x20,0x20); // сигнал контроллеру 8259 «Конец прерывания»
}
Так что все-таки не так?
Во первых не сидит ли на этом порту скажем мышка?. Во в торых если нет, то подается ли с модема сигнал на чтение или запись данных в порт?
Во первых не сидит ли на этом порту скажем мышка?. Во в торых если нет, то подается ли с модема сигнал на чтение или запись данных в порт?
Мыша точно не седит (сейчас почти у всех PS/2 :)). Вчера пробовал сделать так: два СОМ-порта на IBM соеденил нуль-модемом в один порт слал байт, а с другого читал, все работает. Вот только прерывания по-прежнему нет. Кроме того когда регистр передачи пуст, то должно возникнуть прерывание. Т.е. в приведенном выше примере я хотябы раз должен попасть в обработчик прерывания. Да не тут то было...
Мыша точно не седит (сейчас почти у всех PS/2 :)). Вчера пробовал сделать так: два СОМ-порта на IBM соеденил нуль-модемом в один порт слал байт, а с другого читал, все работает. Вот только прерывания по-прежнему нет. Кроме того когда регистр передачи пуст, то должно возникнуть прерывание. Т.е. в приведенном выше примере я хотябы раз должен попасть в обработчик прерывания. Да не тут то было...
Ну ежели байт идет, то прерывание должно быть. Хотя я бы на программирование контроллера прерываний забил. Там по умолчанию и так разрешено.
Ну ежели байт идет, то прерывание должно быть. Хотя я бы на программирование контроллера прерываний забил. Там по умолчанию и так разрешено.
Если есть СОМ-порт, то предлагаю откомпелировать и запустить выше упомянотую тестовую программку. Если на эране увидите бегущие цифорки (не нули), то обработчик прерывания у вас вызвался, тогда что-то у меня с машиной. Хотя это вряд ли, я пробовал и на другой - результат тот же...:???:
Если есть СОМ-порт, то предлагаю откомпелировать и запустить выше упомянотую тестовую программку. Если на эране увидите бегущие цифорки (не нули), то обработчик прерывания у вас вызвался, тогда что-то у меня с машиной. Хотя это вряд ли, я пробовал и на другой - результат тот же...:???:
Я пока еще не понял, что не так. С виду все вроде-бы пучком. Попробую у себя. Но дело думая не в компе.
Я пока еще не понял, что не так. С виду все вроде-бы пучком. Попробую у себя. Но дело думая не в компе.
Слушай а ты в ДОСЕ или в Винде. В Винде такие штуки не проходят.
Слушай а ты в ДОСЕ или в Винде. В Винде такие штуки не проходят.
Я в эмуляции DOS из под DosNavigator, т.е. конечно же в Windows 2000. Я понимаю про что ты хочешь сказать, что прямое программирование портов под виндой не идет. Ну так в этом случае вывелось бы сообщение "...вызвало не допустимую операцию...". А этого нет. Так что, видимо проходит. Хотя на всякий случай попробую из под Windows98 (с ним такие штуки проходят).
Я в эмуляции DOS из под DosNavigator, т.е. конечно же в Windows 2000. Я понимаю про что ты хочешь сказать, что прямое программирование портов под виндой не идет. Ну так в этом случае вывелось бы сообщение "...вызвало не допустимую операцию...". А этого нет. Так что, видимо проходит. Хотя на всякий случай попробую из под Windows98 (с ним такие штуки проходят).
Я тебе на всякий случай ссылочку на очень интересный сайт кину. Может быть поможет. rs232.ru
Я тебе на всякий случай ссылочку на очень интересный сайт кину. Может быть поможет. rs232.ru
За ссылку спасибо. Если у вас получиться вызвать прерывание СОМ-порта, то сообщите как вы это сделали. Если можно, укажите на ошибки, допущенные мною.
"...вызвало не допустимую операцию...".
Ничего подобного! Такое происходит далеко не с каждым приложением. Оно просто не работает так как надо, например:
прога коннектится через СОМ - порт, выдает сообщение, что все в норме и через секунду что кранты всему! И так в бесконечном цикле... При чем винда на это ни как не реагирует (кроме загрузки ЦП в 100%:)).
А на счет 98 ты прав. Там эта програ работает замечательно. Вот только кому сейчас нужна новая программа под 98?
Я в эмуляции DOS из под DosNavigator, т.е. конечно же в Windows 2000. Я понимаю про что ты хочешь сказать, что прямое программирование портов под виндой не идет. Ну так в этом случае вывелось бы сообщение "...вызвало не допустимую операцию...". А этого нет. Так что, видимо проходит. Хотя на всякий случай попробую из под Windows98 (с ним такие штуки проходят).
Винда просто обрубит то что ей не нравится - и концы в воду. Нафига такой гемор да еще и на ДОСЕ? Драйвера, драйвера и еще раз драйвера....
Винда просто обрубит то что ей не нравится - и концы в воду. Нафига такой гемор да еще и на ДОСЕ? Драйвера, драйвера и еще раз драйвера....
В Windows 98 эта программка тоже не заработала. Так что здесь что-то не то (т.е. винда не виновата). Надо будет подумать... А может сам BorlandC 3.1 что-то химичет? (хотя вряд ли).
В Windows 98 эта программка тоже не заработала. Так что здесь что-то не то (т.е. винда не виновата). Надо будет подумать... А может сам BorlandC 3.1 что-то химичет? (хотя вряд ли).
Одно непонятно - нафига тебе такой изврат? Напиши с использованием WinAPI и не мучайся ерундой. Будет работать в любой винде (оговорка: это по заверению мелкомягких, на деле кое-что работает только в серии NT, а в 9х просто виснет).
Проблема разрешилась, когда вместо сервиса BIOS (при посылки и чтении байта) использовал функции прямого программирования порта.
Что касается WinAPI, то дело втом, что необходимо программировать под Dos (для контроллера). А на другой стороне будет готовая программа под Windows. Спасибо всем за помощь.
дело втом, что необходимо программировать под Dos (для контроллера). А на другой стороне будет готовая программа под Windows.
Если не лень, то поясни, что за контроллер работает под досей. Не слышал о таких.
Если не лень, то поясни, что за контроллер работает под досей. Не слышал о таких.
Под контроллером я имел ввиду промышленный IBM PC совместимый контроллер, который работает под ОС, совместимой с DOS 6.22.
Под контроллером я имел ввиду промышленный IBM PC совместимый контроллер, который работает под ОС, совместимой с DOS 6.22.
Не можешь скинуть его основные характеристики или дать ссылку (хотя бы название чипа)? Есть тут у товарищей задумка на данную тему, да и самому интересно!
З.Ы. Это точно контроллер, а не процессор?