Вопрос по программированию последовательного порта.
Для того, что отследить состояние "Буфер передачи пуст" или "Данные приняты" перехватываю 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