![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 29.07.2008
Сообщений: 4
|
![]()
Напиал простой kernel-mode драйвер, который по запросу user-mode программы, устанавливает или очищает в регистре 3FCh порта COM1 бит номер 0. Т.е. тем самым он управляет состоянием линиии DTR порта. По крайней мере так должно быть. Замеряя уровень сигнала на линии DTR равный -12В и выдавая команду драйверу на изменение состояния линии DTR, уровень не меняется на +12В. Почему ???
P.S. Если предварительно открыть порт стандартными win-средствами (api-функция CreateFile), то все работает. Что же делает стандартный драйвер с портом такого, что после этого, мой драйвер нпчинает реально управлять линией DTR??? |
![]() |
![]() |
![]() |
#2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
Во-первых, при написании таких вещей под Windows рекомендуется использовать стандартные средства Windows, так как возможно не только ты один пользуешься этим портом.
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 29.07.2008
Сообщений: 4
|
![]()
Согласен, но не в данном случае. Мне как раз и надо чтобы другое приложение работало с COM портом, как обычно, стандартными функциями Window. А моё user-mode приложение в это же самое время могло управлять линией DTR. Собственно для этого и писался kernel-mode "драйвер". И моё приложение не использует API CreateFile, т.к. в противном случае, только моё приложение получит монопольный доступ у порту. Вопрос в том почему линия DTR управляется только после открытия порта функцией CreateFile, вызываемой из какого либо приложения, напр. HyperTerminal, а если порт закрыт, то не управляется посредством mov DX,3FCh mov AL,1 out DX,AL
|
![]() |
![]() |
![]() |
#4 |
Регистрация: 06.09.2008
Сообщений: 4
|
![]()
У меня немного другая проблема, но тоже по COM порту, так что решил не создавать новую тему.
Я начал писать ASM программу под DOS, которая представляет собой некое подобие терминала. Программа должна работать без использования прерываний от микросхем COM порта (т.е. опрашивая порт сама). Использует только COM1 порт (диапазон ввода/вывода: 03F8-03FF). Написал часть программы, но всё нуждается в проверке и, возможно, исправлении, или дополнении, т.к. пишу такое впервые. Также нужна часть, реализующая отправку и приём AT команд. Вот мои наработки: Код:
Кстати, а задержка вида "jmp $+2" - действительно сработает как задержка? Последний раз редактировалось Steve_s; 06.09.2008 в 22:45. |
![]() |
![]() |
![]() |
#5 |
Регистрация: 29.07.2008
Сообщений: 4
|
![]()
Можешь указать источник откуда взят код подготовки порта, где происходит сбрасывание регистров путем чтения из них. Что-то такое припоминаю, но не помню откуда. Впрочем я уже отказался от своей первоначальной идеи.
А дальше видится так, подготовишь строку с АT-командой, и выводишь её в цикле в порт (регистр данных) побайтно, каждый раз проверяя возможность записи байта в порт. Затем пауза. И чтение из порта аналогично, но есть вероятность пропуска части данных, и с прерываниями все же попроще будет. А jmp $+2, здесь как ты знаешь, делает переход на следующую команду сразу за собой, при этом процессор затрачивает на ее выполнение сколько-то тактов, за которые в порту успевают завершится переходные процессы связанные с выводом/вводом в него. Правда я не знаю насколько они нужны в твоем случае, поскольку с помощью этой инструкции разделяют следующие подряд друг за другом инструкция ввода/вывода (in/out). Последний раз редактировалось Prot; 06.09.2008 в 22:13. |
![]() |
![]() |
![]() |
#6 | ||||
Регистрация: 06.09.2008
Сообщений: 4
|
![]() Цитата:
![]() Цитата:
![]() ![]() ![]() Цитата:
Цитата:
Последний раз редактировалось Steve_s; 07.09.2008 в 00:40. |
||||
![]() |
![]() |
![]() |
#7 |
Регистрация: 29.07.2008
Сообщений: 4
|
![]()
Попробуй не только "код возврата каретки", но и добавить код "перевода строки" ( т.е. 0Ah, ODh или 0Dh, 0Ah - последовательность сейчас не помню
![]() А вот почему "бит говорит что ничего не принято", непонятно. А считанный байт равен последнему отправленному потому что, при посылке каждого байта модему, модем возвращает его обратно (эхо), (на терминале это хороше видно). Так по крайней мере у меня модем делал. И только после этого шлет ответ на AT-команду. Насчет "предугадывают прыжок" ничего умного не скажу. Вероятность пропуска части данных есть вот потому. Читал что, без FIFO, буфер современного последовательного порта состоит из 3 регистров, собственно того откуда ты читаешь байт, сдвигового регистра и еще какогото одного. И если пришел еще один байт, а все эти регистры уже заняты, то есть после их приема, не было чтения из порта, то выставляется ошибка и новый байт и все последующие не принимаются (теряются). Вроде ничего не напутал ![]() |
![]() |
![]() |
![]() |
#8 | |||
Регистрация: 06.09.2008
Сообщений: 4
|
![]() Цитата:
![]() ![]() Цитата:
Цитата:
В общем мне всё ещё нужна помощь ![]() Последний раз редактировалось Steve_s; 11.09.2008 в 17:58. |
|||
![]() |
![]() |
![]() |
#9 |
Регистрация: 06.09.2008
Сообщений: 4
|
![]()
Ух ты... кажется заработало... Только я не понял почему 0_о =)
Такой вопрос: как можно устроить задержку не по количеству тактов процессора (на разных процессорах частоты разные и в таком варианте время задержек будет разное на разных процах, если я правильно понимаю), а по времени? P.S. ...или я не правильно понимаю? =) |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Старый серер перенести на новый, а старый заглушить, при этом не потерять настроек. | Spartak | Помощь студентам | 1 | 28.01.2008 12:07 |
компилятор у меня старый и программа в нем не хочет компилироваться | Vofka | Общие вопросы C/C++ | 3 | 12.12.2007 00:26 |
Старый добрый тетрис | Format C: | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 15 | 05.07.2007 16:02 |