Проблема в следующем: запрограммировал COM1 порт (скорость, стоп-биты, четность, прерывания...), затем начинаю передавать через регистр данных (3f8h) команды модему, а он молчит. смотрел исходники Menuet, но разобраться не смог, там все через int 40h делается. прочитал Фролова - "Программирование модемов", вроде все так делаю Может чего-то не понимаю? Вот текст программы: code segment org 100h base equ 3f8h assume cs:code, ds:code start: jmp short entry at db 'at dp 490497' label entry near ;инициализация порта COM1 ;записать нулевое заначение в регист управления модемом ;чтобы обнулить сигналы DTR и RTS mov dx,base+4 xor al,al out dx,al ;обнуляем регистры: состояния линии, данных и регистр состояния модема mov dx,base ;регистр данных xor al,al out dx,al mov dx,base+5 ;состояния линии out dx,al mov dx,base+6 ;регистр состояния модема out dx,al ;устанавливаем скорость порта mov dx,base+3 mov al,80h out dx,al mov dx,base mov al,60h ;скорость 1200 bod out dx,al mov dx,base+1 xor al,al out dx,al ;устанавливаем кол-во стоп бит, четность и прерывания mov dx,base+3 mov al,03h out dx,al mov dx,base+1 xor al,al out dx,al ;устанавливаем сигналы DTR и RTS mov dx,base+4 in al,dx or al,03h out dx,al ;ожидаем когда освободится регистр передатчика _wait: mov dx,base+5 in al,dx test al,40h jz _wait ;передаем модему команду AT xor si,si mov dx,base mov al,at[si] out dx,al inc si mov dx,base mov al,at[si] out dx,al mov al,13h out dx,al ;передаем команду ATD xor si,si mov dx,base mov al,at[si] out dx,al _at: inc si mov dx,base mov al,at[si] out dx,al cmp si,11 jnz _at mov al,13h out dx,al _exit: mov ax,4c00h int 21h code ends end start
Сначала мадом надо сбросить командой ATZ, а то мало-ли чем он был до этого занят и для выхода если модем завис. Затем посылаем нужные команды. Команды начинаются с префикса AT и далее код команды и ее параметры и между ними никаких пробелов!!. Я делаю так, смотри ниже и у меня все работает. Инициализируем модем следующим образом Код (Text): mov dx,3FBh ; Регистр управления линией mov al,80h ; Устанавливаем бит 7 в 1 out dx,al mov dx,3F9h mov al,0h ; Старший байт делителя out dx,al mov dx,3F8h mov al,3h ; Младший байт делителя out dx,al mov dx,3FBh ; Порт управления линией mov al,3h ; 00000011b 8 бит 1 стоповый out dx,al mov dx,3FCh ; Порт управления линией mov al,0Bh ; 00001011b DTR, RTS, OUT1 OUT2 out dx,al mov dx,3F9h mov al,1h ; 00000001b вкличаем управление работой FIFO out dx,al Программирование прерывания от COM порта возлагается на тебя, регистр 3F9h Пример послания команды инициализации модема ATZ, AT префикс команд. Каждая команда должна заканчиваться символ с ASCII кодом 13 Код (Text): mov dx,3F8h mov al,65 ; A out dx,al mov dx,3F8h mov al,84 ; T out dx,al mov dx,3F8h mov al,90 ; Z out dx,al mov dx,3F8h mov al,13 ; символ с ASCII кодом 13 out dx,al Прилагаю полный набор команд.
mov dx,3FCh ; Порт управления линией mov al,0Bh ; 00001011b DTR, RTS, OUT1 OUT2 out dx,al объясни пожалуйста для чего нужны линии OUT1 и OUT2 и почему ты установил OUT2 (00001011b), а OUT1 не трогал?
Вообще, регистр букв модему не важен, во всех доках об этом написано. Также ему не важны и пробелы. Главное, чтобы их небыло между командой и её параметром. Линия OUT1 не используется, а установка OUT2 разрешает прерывания от стыка RS-232. То есть если их разрешить в регистре управления прерываниями, но не разрешить здесь, их не будет. А как вы узнаёте, что модем ничего не ответил, или здесь толькокусок программы? Зачем вам прерывания, если обработчика нет? И перед тем как писать в порт, нужно проверить, готов ли модем. Высылаю одну из крутейших док по RS-232 на русском языке. (из IO.PRT, дораб.)