Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прерывание СОМ-порта

9.1K
23 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Добрый день господа!

Решил написать программку, использующую прерывания СОМ-порта. Написал тестовый пример, который при каждом вызове прерывания увеличивает счетчик вызовов прерывания на 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 «Конец прерывания»
}

Так что все-таки не так?
259
23 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Gr_Aleks
Добрый день господа!

Решил написать программку, использующую прерывания СОМ-порта. Написал тестовый пример, который при каждом вызове прерывания увеличивает счетчик вызовов прерывания на 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 «Конец прерывания»
}

Так что все-таки не так?


Во первых не сидит ли на этом порту скажем мышка?. Во в торых если нет, то подается ли с модема сигнал на чтение или запись данных в порт?

9.1K
23 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Цитата:
Originally posted by AlexandrVSmirno

Во первых не сидит ли на этом порту скажем мышка?. Во в торых если нет, то подается ли с модема сигнал на чтение или запись данных в порт?



Мыша точно не седит (сейчас почти у всех PS/2 :)). Вчера пробовал сделать так: два СОМ-порта на IBM соеденил нуль-модемом в один порт слал байт, а с другого читал, все работает. Вот только прерывания по-прежнему нет. Кроме того когда регистр передачи пуст, то должно возникнуть прерывание. Т.е. в приведенном выше примере я хотябы раз должен попасть в обработчик прерывания. Да не тут то было...

259
23 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Gr_Aleks


Мыша точно не седит (сейчас почти у всех PS/2 :)). Вчера пробовал сделать так: два СОМ-порта на IBM соеденил нуль-модемом в один порт слал байт, а с другого читал, все работает. Вот только прерывания по-прежнему нет. Кроме того когда регистр передачи пуст, то должно возникнуть прерывание. Т.е. в приведенном выше примере я хотябы раз должен попасть в обработчик прерывания. Да не тут то было...



Ну ежели байт идет, то прерывание должно быть. Хотя я бы на программирование контроллера прерываний забил. Там по умолчанию и так разрешено.

9.1K
23 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Цитата:
Originally posted by AlexandrVSmirno


Ну ежели байт идет, то прерывание должно быть. Хотя я бы на программирование контроллера прерываний забил. Там по умолчанию и так разрешено.



Если есть СОМ-порт, то предлагаю откомпелировать и запустить выше упомянотую тестовую программку. Если на эране увидите бегущие цифорки (не нули), то обработчик прерывания у вас вызвался, тогда что-то у меня с машиной. Хотя это вряд ли, я пробовал и на другой - результат тот же...:???:

259
23 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Gr_Aleks


Если есть СОМ-порт, то предлагаю откомпелировать и запустить выше упомянотую тестовую программку. Если на эране увидите бегущие цифорки (не нули), то обработчик прерывания у вас вызвался, тогда что-то у меня с машиной. Хотя это вряд ли, я пробовал и на другой - результат тот же...:???:


Я пока еще не понял, что не так. С виду все вроде-бы пучком. Попробую у себя. Но дело думая не в компе.

259
23 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by AlexandrVSmirno

Я пока еще не понял, что не так. С виду все вроде-бы пучком. Попробую у себя. Но дело думая не в компе.



Слушай а ты в ДОСЕ или в Винде. В Винде такие штуки не проходят.

9.1K
23 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Цитата:
Originally posted by AlexandrVSmirno


Слушай а ты в ДОСЕ или в Винде. В Винде такие штуки не проходят.



Я в эмуляции DOS из под DosNavigator, т.е. конечно же в Windows 2000. Я понимаю про что ты хочешь сказать, что прямое программирование портов под виндой не идет. Ну так в этом случае вывелось бы сообщение "...вызвало не допустимую операцию...". А этого нет. Так что, видимо проходит. Хотя на всякий случай попробую из под Windows98 (с ним такие штуки проходят).

259
23 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Gr_Aleks


Я в эмуляции DOS из под DosNavigator, т.е. конечно же в Windows 2000. Я понимаю про что ты хочешь сказать, что прямое программирование портов под виндой не идет. Ну так в этом случае вывелось бы сообщение "...вызвало не допустимую операцию...". А этого нет. Так что, видимо проходит. Хотя на всякий случай попробую из под Windows98 (с ним такие штуки проходят).



Я тебе на всякий случай ссылочку на очень интересный сайт кину. Может быть поможет. rs232.ru

9.1K
23 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Цитата:
Originally posted by AlexandrVSmirno


Я тебе на всякий случай ссылочку на очень интересный сайт кину. Может быть поможет. rs232.ru



За ссылку спасибо. Если у вас получиться вызвать прерывание СОМ-порта, то сообщите как вы это сделали. Если можно, укажите на ошибки, допущенные мною.

243
24 декабря 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Gr_Aleks

"...вызвало не допустимую операцию...".


Ничего подобного! Такое происходит далеко не с каждым приложением. Оно просто не работает так как надо, например:
прога коннектится через СОМ - порт, выдает сообщение, что все в норме и через секунду что кранты всему! И так в бесконечном цикле... При чем винда на это ни как не реагирует (кроме загрузки ЦП в 100%:)).
А на счет 98 ты прав. Там эта програ работает замечательно. Вот только кому сейчас нужна новая программа под 98?

487
24 декабря 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Gr_Aleks


Я в эмуляции DOS из под DosNavigator, т.е. конечно же в Windows 2000. Я понимаю про что ты хочешь сказать, что прямое программирование портов под виндой не идет. Ну так в этом случае вывелось бы сообщение "...вызвало не допустимую операцию...". А этого нет. Так что, видимо проходит. Хотя на всякий случай попробую из под Windows98 (с ним такие штуки проходят).



Винда просто обрубит то что ей не нравится - и концы в воду. Нафига такой гемор да еще и на ДОСЕ? Драйвера, драйвера и еще раз драйвера....

9.1K
24 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Цитата:
Originally posted by ddnh_bc


Винда просто обрубит то что ей не нравится - и концы в воду. Нафига такой гемор да еще и на ДОСЕ? Драйвера, драйвера и еще раз драйвера....



В Windows 98 эта программка тоже не заработала. Так что здесь что-то не то (т.е. винда не виновата). Надо будет подумать... А может сам BorlandC 3.1 что-то химичет? (хотя вряд ли).

243
25 декабря 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Gr_Aleks


В Windows 98 эта программка тоже не заработала. Так что здесь что-то не то (т.е. винда не виновата). Надо будет подумать... А может сам BorlandC 3.1 что-то химичет? (хотя вряд ли).


Одно непонятно - нафига тебе такой изврат? Напиши с использованием WinAPI и не мучайся ерундой. Будет работать в любой винде (оговорка: это по заверению мелкомягких, на деле кое-что работает только в серии NT, а в 9х просто виснет).

9.1K
27 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
:D Добрый день господа!
Проблема разрешилась, когда вместо сервиса BIOS (при посылки и чтении байта) использовал функции прямого программирования порта.
Что касается WinAPI, то дело втом, что необходимо программировать под Dos (для контроллера). А на другой стороне будет готовая программа под Windows. Спасибо всем за помощь.
243
29 декабря 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Gr_Aleks
дело втом, что необходимо программировать под Dos (для контроллера). А на другой стороне будет готовая программа под Windows.


Если не лень, то поясни, что за контроллер работает под досей. Не слышал о таких.

9.1K
29 декабря 2004 года
Gr_Aleks
8 / / 23.12.2004
Цитата:
Originally posted by pacific_7

Если не лень, то поясни, что за контроллер работает под досей. Не слышал о таких.



Под контроллером я имел ввиду промышленный IBM PC совместимый контроллер, который работает под ОС, совместимой с DOS 6.22.

243
30 декабря 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Gr_Aleks


Под контроллером я имел ввиду промышленный IBM PC совместимый контроллер, который работает под ОС, совместимой с DOS 6.22.


Не можешь скинуть его основные характеристики или дать ссылку (хотя бы название чипа)? Есть тут у товарищей задумка на данную тему, да и самому интересно!
З.Ы. Это точно контроллер, а не процессор?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог