Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Этот @#%*& Com порт!  (Прочитано 12639 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Xeysan
Гость
« : 05-04-2004 17:15 » 

Вопрос по программированию последовательного порта.
Для того, что отследить состояние "Буфер передачи пуст" или "Данные приняты" перехватываю IRQx ( x - так как проверял на обоих портах ). Далее идут настройки и снятие еденицы с маски 8259А:

Для передачи данных разрешаю прерывание в через IER ( int enable reg ) и передаю байт в порт (03F8h - 0Ch, 02F8h - 0Bh ).
По идее, после того как уйдет байт, будет вызвано перехваченное прерывание, только этого не проиходит... И я вот уже 6 часов не могу понять почему. Я слышал, такое происхоит на старых контроллерах, но у меня Атлон с сопутствующими прибамбасами. Тестирую под Win98, кабель Com1-Com2. Кстати, первый байт приходит, как положено, а вот остальные из-за отсутствия прерывания - нет. Приема же нет вообще...
Если форсировать события и самому вызвать прерывание, то в отладчике оно открутиться в цикле для всех данных, а в живую - зависнет.

Ссылки на примеры тоже бы очень НЕ помешали!

Инициализация:
Код:

; Set interrupt handler
movzx bx, bPortCurrentInd ; 0, 0 - Com1, 1 - Com2
mov ah, 35h
mov dl, byte ptr bActivateMasks[bx( ;
mov al, byte ptr bSerialHandlers[bx(
mov bControllerMask, dl
push bx
push ax
int 21h

mov word ptr dwPrevHandler , bx
mov word ptr dwPrevHandler + 2 , es

pop ax
pop bx
mov ah, 25h
mov dx, offset SerialHandler ; COM file
int 21h

; Set current serial port address
add bx, bx
mov dx, word ptr wSerialPorts[bx( ; wSerialPorts - Port map
mov wSerialCurrent, dx

; Disable interrupts
add dx, COM_IER ; dx = 3F9h
xor al, al
out dx, al

; Set device characteristics
; 1. Set device speed
; 2. Set check parameters
; 3. Set interrupt parameters

;1. NAU_SPEED
SETPORT dx, COM_LCR
mov al, 80h
out dx, al

mov al, NAU_SPEED ; 6 - 19200 b/s
SETPORT dx, COM_LDB
out dx, al

xor al, al
SETPORT dx, COM_HDB
out dx, al

; 2. 8n1
SETPORT dx, COM_LCR
mov al, NAU_LINE ; 0011b
out dx, al

; 3. Enable
SETPORT dx, COM_IER
mov al, NAU_INTR ; 05h
out dx, al

; Enable irqx, x = |3, 4"
in al, 21h
and al, bControllerMask ; 0EFh -> IRQ4
out 21h, al



Transmit:
Код:

; ... check parameters, save pointer to data block, length, position, etc...
; ............

; Allow 'Transmit buffer is empty' interrupt
SETPORT dx, COM_IER ; 3F9h
in al, dx
or al, 02h
out dx, al

; Send first char to initiate interrupts
SETPORT dx, COM_DAT ; 3F8h
mov al, byte ptr es{[si(
out dx, al
; ... exit proc

Записан
s_n
Постоялец

ru
Offline Offline

« Ответ #1 : 08-04-2004 11:26 » new

Посмотри http://www.codenet.ru/progr/other/comport.php.

Из кода тяжело понять где какие порты ты инициализируеш, про 3F9 не забыл?
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #2 : 08-04-2004 11:33 » 

Xeysan, Все современный порты идут с FIFO. И прирывание по приему генерится при заполнении FIFO до определенного уровня. Тригер переполнения FIFO обычно можно настроить. Тебе скорее всего надо копать в этом направлении.
Записан

Megabyte be with you!
s_n
Постоялец

ru
Offline Offline

« Ответ #3 : 08-04-2004 12:34 » 

Цитата: Lex
Xeysan, Все современный порты идут с FIFO. И прирывание по приему генерится при заполнении FIFO до определенного уровня. Тригер переполнения FIFO обычно можно настроить. Тебе скорее всего надо копать в этом направлении.


Это по идее должно прописываться отдельно, т.к. в противном случае не будет совместимости со старыми программами, которые про FIFO и не слышали.
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #4 : 08-04-2004 12:47 » 

s_n, Этот фифо был уже в двушках(i286, не путать с PII Отлично)
На счет XT не помню, но это могло и там быть. По умолчанию триггер настраивается кажется на 16 байт. И все потому, что IBM изначально использовала не интеловский USART, а более продвинутую микросхему от кого-то еще(если надо раскопаю производителя и партнамбер(что-то типа 16с550), а так ломы искать)
Записан

Megabyte be with you!
s_n
Постоялец

ru
Offline Offline

« Ответ #5 : 08-04-2004 13:02 » 

Если FIFO был еще на двойках, то проблема врядли в нем. Я писал драйвер мыша на 486: данные приходили по байтно, а FIFO (насколько я помню) я не конфигурил.
Скорее всего ошибка в иницализации.
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #6 : 08-04-2004 13:07 » 

Может быть. Давно я на ассемблере под x86 ничего не писал. Забывать стал Улыбаюсь
Записан

Megabyte be with you!
Slider
Гость
« Ответ #7 : 08-04-2004 13:52 » 

to Xeysan,
если не ошибаюсь (давно этим занимался) чтобы возникло это прерывание надо считать байт из порта. Те для тестирования работоспособности программы нужны 2 компа соединенные кабелем. На одном - отлаживаемая программа, а на другом заглушка-имитатор которая только дуром считывает/записывает в цикле данные из порта.
Те просто записать в него не достаточно. Обязательно надо чтобы этот байт ушел физически.
Записан
Xeysan
Гость
« Ответ #8 : 08-04-2004 17:10 » 

Slider, Ну это понятно  Отлично
Lex, s_n, Я уже сам разобрался, но все равно спасибо Отлично
Проблема была в недостаточной инциализации, действительно нужно было подключить ФИФО, а также установить RTS and DTS, и все заработало, правда windows-сканер эти данные перестал понимать.
Кстати, путем опытов я выяснил, что в Windows 98 ФИФО ,буфер = 16 байт.
Всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines