其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Com port (1)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

Port Address

    一般而言,COM口的I/O地址是固定的,

    3F8/2F8     BaseAdd + 0    Transmit/Receive Buffer

    3F9/2F9     BaseAdd + 1    IER

    3FA/2FA    BaseAdd + 2    IIR(Read)/FCR(write)

    3FB/2FB    BaseAdd + 3    LCR

    3FC/2FC    BaseAdd + 4    MCR

    3FD/2FD    BaseAdd + 5    LSR

    3FE/2FE     BaseAdd + 6    MSR

    3FF/2FF     BaseAdd + 7    Scratch Pad Register

 

Abbreviate

    CD   - Carrier Detect

    CTS  - Clear to Send

    DCD  - Data Carrier Detect

    DCE  - Data communication Equipment

    DDCD - Delta Data Carrier Detect 

    DLAB - baud rate divisor

    DSR  - Data set ready

    DTE  - Data Terminal Equipment

    DTR  - Data terminal ready

    FCR  - FIFO Control Register

    FIFO - First In First Out

    IER  - Interrupt Enable Register

    IIR  - Interrupt Identification Register

    LCR  - Line Control Register

    LSR  - Line Status Register

    MCR  - Modem Control Register

    MSR  - Modem Status Register

    RD   - Receive Data

    RI   - Ring indicator 

    RTS  - Request to Send

    TD   - Transmit Data

    THRE - Transmitter Holding Register Empty 

    TSRE - Transmitter Shift Register Empty

 

Set Baud Rate

    当LCR(Base Address+3) BIT7是1的时候,往Base+0/Base+1这两个端口写的数据就是要设置的波特率。

Baud Rate Base+1 Base+0 Baud Rate Base+1 Base+0
50 0x09 0x00 2400 0x00 0x30
110 0x04 0x17 3600 0x00 0x20
150 0x03 0x00 4800 0x00 0x18
300 0x01 0x80 7200 0x00 0x10
600 0x00 0xC0 9600 0x00 0x0C
1200 0x00 0x60 19200 0x00 0x06
1800 0x00 0x40 38400 0x00 0x03
2000 0x00 0x3A 57600 0x00 0x02
115200 0x00 0x01

 Example Code:
BaudRateTable:
    dw     01h         ; 115200     0
    dw     02h         ; 57600      1
    dw     03h         ; 38400      2
    dw     06h         ; 19200      3
    dw     0Ch         ; 9600       4

    mov     dx, Base+3
    in      al, dx 
    jmp     short $+2  ; delay
    or      al, 80h
    out     dx, al     ; set LCR BIT7
    jmp     short $+2
    push    ax         ; save the data

    lea     si, cs:BaudRateTable
    shl     bx, 1      ; bx =0/1/2/3/4
    add     si, bx     ; si point the divisor

    mov     ax, word ptr cs:[si]
                       ; al, base+0 value
                       ; ah, base+1 value 

    mov     dx, Base+0
    out     dx, al
    jmp     short $+2
    xchg    ah, al
    inc     dx
    out     dx, al
    jmp     short $+2

    pop     ax
    and     al, 07fh     ; clear BIT7
    mov     dx, base+3
    out     dx, al
    jmp     short $+2




相关文章

相关软件