Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MKGA
0 / 0 / 0
Регистрация: 05.09.2007
Сообщений: 7
#1

Ошибка при работе с портами - C++

06.01.2008, 17:15. Просмотров 816. Ответов 6
Метки нет (Все метки)

Следующ.кусок кода определяет нажата клавиша Esc или F8. После компиляции при запуске проги и при нажатии F8 вызывается функция printf произвольное кол-во раз (по идее должно всего один), но
под дебагером printf вызывается один раз. И в Borlande и в Watcome
одинаковый результат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while (chz!=1)
{
asm {
mov byte ptr [chz],0
 
in al,060h //читаем код клавиши
mov byte ptr [chz],al
 
//cli обнуляем буфер клавиатуры
xor ax,ax
mov es,ax
mov al,es:[41AH]
mov es:[41CH],al
//sti
}
 
switch (chz){
case 0x42: //здесь собственно глюк
printf( '0x42 UP...
' );
        Up();
break;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
06.01.2008, 17:20     Ошибка при работе с портами #2
А ты не думаешь, что у ткебя цикл while крутиться до тех пор пока ты не отпустишь клавишу, а так как нажатие оно всгеда имеет некоторую продолжительность, вот ты и получаешь этот эффект?
Или, по идее, это должно обрабатываться драйвером клавиатуры? Но ты используешь прямое чтение с портов...

С уважением, Владимир
MKGA
0 / 0 / 0
Регистрация: 05.09.2007
Сообщений: 7
06.01.2008, 17:39  [ТС]     Ошибка при работе с портами #3
нет, ты неправ. Даже если перед оператором switch вставить getch()
функц. printf вызывается 2-3 раза
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
06.01.2008, 18:08     Ошибка при работе с портами #4
Может дребезг?

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

Удачи, Владимир
ovalroom
Сообщений: n/a
16.01.2008, 17:46     Ошибка при работе с портами #5
Ты читаешь прямо из порта, а потом зачем-то очищаешь буфер клавиатуры. Но значение порта-то при этом не изменится! Можешь хоть сто раз писать нули в ячейку памяти 0:41А, но при этом из порта по адресу 0х60 упорно будешь считывать код последней нажатой клавиши. Под дебагером программа будет проходить один раз - и это тоже естественно. Если ты ее будешь проходить по шагам - из порта 0х60 при этом будут считываться значения кода клавиши, которой шагаешь. Обычно дебагеры стараются восстановить все изменения в системе перед тем как передать управление обратно в отлаживаемую программу. Но в данном случае это невозможно - в порт физически нельзя записать что-то софтверно.
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
17.01.2008, 11:42     Ошибка при работе с портами #6
господа время ДОС прошло - пользуйте апишные функции что бы узнать кто где у вас что нажал.

GetAsyncKeyState, GetKeyboardState, etc

Igor Soukhov, www.rsdn.ru
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2008, 17:06     Ошибка при работе с портами
Еще ссылки по теме:

Ошибка при работе деструктора C++
Ошибка при работе программы C++
C++ ошибка при работе со стуктурами
Ошибка при работе с очередью C++
C++ Ошибка при работе со строками

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MKGA
0 / 0 / 0
Регистрация: 05.09.2007
Сообщений: 7
17.01.2008, 17:06  [ТС]     Ошибка при работе с портами #7
апи функции это конечно понятно, и спасибо, что они есть. Но ведь интересно же с портами работать? вопрос:'как это работает, интересует меня с детства'. да и спросить нет греха.

С уважением Артур С.
Yandex
Объявления
17.01.2008, 17:06     Ошибка при работе с портами
Ответ Создать тему
Опции темы

Текущее время: 18:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru