编程语言

img ui_ppoppopp

Com port (1)

发表于2004/10/26 22:40:00  2625人阅读

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


Transmission parameters Knowledge

 LCR BIT1 BIT0 ---- Word length
      0    0            5 bit
      0    1            6 bit
      1    0            7 bit
      1    1            8 bit


 LCR BIT2 ---- stop bits length
      0   1bits
      2   2bits

 LCR BIT3 ---- Parity or not
      0   disable parity
      1   enable parity

 LCR BIT5 BIT4 ---- Parity control
      0    0  odd parity
      0    1  even parity
      1    0  parity is always 1
      1    1  parity is always 0


 如果我们要设置字长是8,停止位是1,无奇偶校验程序如下:

Sample Code

        mov     dx, base+3
        in      al, dx
        jmp     short $+2
        or      al, 03          ; set 8bit
        and     al, 011111011b  ; set 1 stop bit
        and     al, 011110111b  ; set no parity
        out     dx, al
        jmp     short $+2

    

阅读全文
0 0

相关文章推荐

img
取 消
img