0%

ch10串行通信

串行通信技术

串行通信基本概念

baud rate = 1/T (每second 传字符数)

波特率因子:发送/接收一个数据位所需要的时钟脉冲个数

eg. 波特率=9600bps,波特率因子=16,则(接收和发送)时钟频率=9600×16=153600Hz

调制解调器——Modem。

Modem起着传输信号的作用,数据通讯设备,简称DCE

接收设备和发送设备称为数据终端设备,简称DTE。

  • 连接方式:

    全双工方式:通信双方能同时进行发送和接收操作;

    半双工方式:只有1根数据线传送数据信号,要求通信双方的发送和接收由电子开关切换;

    单工方式:只允许数据按照一个固定的方向传送;

  • 并行通信:将一组数据的各位同时进行传送。

  • 串行通信:把数据的字节分解成单个二进制位依次传输[优势:传输干扰小]

    • 异步串行通信: 在单根数据线上逐字符逐位传输,

      传输一个字符时,依次传输起始位、字符各位、校验位、停止位结束该字符的传输

      帧(Frame):起始位、字符各位、校验位、停止位构成一组完整的信息

      • 起始位 逻辑0 1位
      • 数据位 逻辑0或1 5位、6位、7位、8位
      • 校验位 逻辑0或1 1位或无
      • 停止位 逻辑1 1位、1.5位或2位
      • 空闲位 逻辑1 任意数量

      [帧之间可有任意个空闲位]

      frame

    • 同步串行通信:以一个数据块为传输单位,

      在每个数据并不加起始和停止位,而是将数据顺序连接起来,每个数据块附加一个或多个同步字符,最后以校验字符结束。

      异步传输的错误检测:

      • 奇偶校验错(ParityError)
      • 溢出(超越)错(OverrunError)
      • 帧格式错(FrameError)
  • 校验方法

    • 奇偶校验法
    • 方阵码校验:
      奇偶校验和“异或校验和”综合
    • 循环冗余校验码(CRC)(Cyclic Redundancy Check)

串行总线标准RS-232C

串行通信中,DTE和DCE之间的连接要符合接口标准,计算机通信中使用最普遍的是RS-232C标准

定义了按位串行传输的DTE和DCE之间的接口信息。

eg. PC机上的COM1、COM2接口,就是RS-232C接口,使用9针和25针连接器

见ppt P13,14

RS-232三线通信的连线图

RS232_simple

异步串行通信接口芯片8250

8250芯片是一种通用的异步接收发送器

发送和接收都采用双缓冲器结构

  • 发送时:自CPU的并行数据字符—>转换为连续的数据流—>移位寄存器发送。
  • 接收时: 接收串行数据流—>转换为并行数据—>数据寄存器提供给CPU

支持异步串行通信规程:

  • 发送时可自动插入起始位、停止位和奇偶校验位。接收时能自动删除他们

具有可编程的时钟产生电路:

  • 对外部输入时钟1~65535次分频,据规定Baud rate,可编程选择分频次数

具有由CPU发向MODEM的控制信号

具有优先级排队的中断系统,有多种中断源

8250

8250内部功能、结构

数据输入/输出缓冲器:与CPU总线D7~D0连接。

读/写控制逻辑:接收读写命令和地址信号A2~A0,产生内部控制信号,决定哪寄存器进行操作

接收器:由接收缓冲寄存器,接收移位寄存器、接收同步电路构成

发送器:包括发送缓冲寄存器TBR,发送移位寄存器和发送同步控制。

时钟发生环节:包括波特率发生器和分频次数锁存器。8250的发送和接收时钟为波特率的16倍。

设外部时钟频率为1.8432MHz,则分频次数N=184320/(16*波特率)

传输线控制寄存器&传输线状态寄存器:控制寄存器用来写入控制字,状态寄存器用来记录通讯时状态。

中断控制寄存器:包括中断允许寄存器、中断识别寄存器和中断控制逻辑三部分。

MODEN控制逻辑:包括调制解调控制寄存器、调制解调状态寄存器和调制解调控制逻辑

8250的引脚功能

8250_2

  • 双向数据线(D0~D7)

  • 地址&地址控制线

    CS0,CS1,$\overline{CS2}$—输入片选信号。当CS0与CS1为高、$\overline{CS2}$为低时,该芯片被选中

    A0,A1,A2—寻找8250内部寄存器。+ 除数锁存器访问位DLAB==>芯片内部可供处理机访问10寄存器

    $\overline{ADS}$—地址选通信号: 锁存片选(CS0,CS1,$\overline{CS2}$ )&& 寄存器选择(A0,A1,A2)

    DDIS—-收发器禁止,==1 禁止处理器对8250写操作;

    MR—主复位,==1 清除内部寄存器(除接收器数据、发送保持寄存器和除数锁存器)& 控制逻辑;

    XTAL1、XTAL2—外时钟输入/输出,外部时钟XTAL1—->芯片内,芯片—->XTAL2基准时钟信号输出脚

    CSOUT—芯片选择输出, 开始数据传输; [when芯片已由CS0,CS1,CS2输入所选中时],

    INTRPT—中断,8250内部有四种类型中断源。[any中断类型有效&&中断允许时]===>该输出端==1

  • 调制解调器控制逻辑

    $\overline{DSR}$数传机就绪(输入)Modem就绪==> ==0,允许使用通讯设备进行数据传送—>8250;

    $\overline{DTR}$数据终端8250就绪(输出)$\overline{DTR}$==0 ==> 通知调制解调器或数传机8250已准备好通信;

    $\overline{RTS}$ 8250请求发送(输出)$\overline{RTS}$==0 ==> 8250要求向Modem输出串行数据

    $\overline{CTS}$ 清除发送 (输入) ==0 ==> MODEM已同意8250的发送请求

    $\overline{RLSD}$ 接收线路信号检测(输入)==0 ==> 说明MODEM接收数据载波,8250立即接收解调后的数据

    $\overline{RI}$ 振铃指示(输入)MODEM要求8250予以回答。==0 + 若它已准备好==>$\overline{DTR}$输出==0作为MODEM应答信号

    OUT1 输出1,MODEM控制寄存器的位2编程来控制OUT1输出电平

    OUT2 输出2,MODEM控制寄存器的位3编程来控制OUT2输出电平

  • 接收器逻辑(接收器移位寄存器、数据寄存器、相应接收控制逻辑)

    RCLK 接收器时钟 :输入Baud rate X 16 时钟信号

    SIN 串行输入

  • 发送器逻辑

    BAUDOUT 波特率输出: 输出Baud rate X 16 时钟信号

    SOUT 串行输出

    DISTR、$\overline{DISTR}$ 数据输入选通,一个有效=>被选中寄存器内容可被读出。常与系统总线$\overline{IOR}$相连

    DOSTR、$\overline{DOSTR}$ 数据输出选通,一个有效=>被选中寄存器内容可写入数据或控制字。常与系统总线$\overline{IOW}$相连

8250内部寄存器 && 控制字及状态字

  • 初始化命令控制寄存器共5个

    传输线控制寄存器LCR [A2A1A0 = 011, LCR地址为3F8H+011B=3FBH]

    • A2A1A0 = 011

      LCR

      D7-DLAB除数锁存

      0-寻址RBR、TBR、IER寄存器;

      1-寻址DLL、DLH;

      D6-SB设置间断

      0-禁止间断产生;

      1-设置间断,SOUT发送空号。据此,收方能识别发送设备已中止发送;

      D5-SP附加奇偶标志位选择位

      0-无奇偶保持位选择位;

      1 -PEN=1时,在奇偶校验位和停止位之间插入一个奇偶标志位。采用偶校验,此奇偶标志位为0。采用奇校验,此奇偶标志位为1。

      D4-EPS奇偶类型

      0-奇校验(当D3=1);

      1-偶校验(当D3=1);

      D3-PEN奇偶校验允许

      0-无奇偶校验;

      1-有奇偶校验;

      D2-STB停止位选择

      0-1位停止位;

      1-1.5位停止位(数据位5位);

      1-2位(数据位6、7、8);

      D1,D0-WLS1,WLS0数据位数

      00-5位

      01-6位

      10-7位

      11-8位

      eg. 用串口COM1,LCR地址为3FBH,假定要求的

      数据位长7位=>D1D0=10,2位停止位=>D2=1,奇校验=>D3=1,D4=0。

      0-寻址RBR、TBR、IER寄存器=>D7=0。那么向LCR写入控制字程序

      1
      2
      3
      MOV 	DX, 3FBH
      MOV AL, 00001110B
      OUT DX, AL

    MODEM控制寄存器MCR [A2A1A0=100]

    • 控制8250连接外部MODEM的信号线

      MCR

  • D0-数据终端就绪

    1=DTR#为低电平; 0=DTR#为高电平;

    D1-请求发送

    1=RTS#输出低电平;0=RTS#输出高电平;

    D2-输出1(OUT1#)

    1=用户指定辅助输出1,OUT1#为低电平;

    0=OUT1#为高电平;

    D3-输出2(OUT2#)

    1=用户指定辅助输出2,OUT2#为低电平;

    0=OUT2#为高电平;

    D4-用来控制循环检测,实现8250的自测试。

    1=芯片循环反馈,提供诊断测试,即发送的数据立即被接收, 完成8250的自检。允许CPU来验证8250的发送和接收通路是否正常;

    0=8250正常工作

    中断允许寄存器IER [A2A1A0=001, 地址3F9H]

  • IER高4位固定为0。

    D0-允许接收数据就绪中断;

    D1-允许发送保持寄存器空中断;

    D2-允许接收字符错误或接收到间断状态中断(也称接收线路状态中断);

    D3-允许MODEM状态改变中断

    除数锁存器低8位DLL(分频次数N低8位锁存器) [A2A1A0=000, 地址3F8H]

    除数锁存器高8位DLH(分频次数N高8位锁存器) [A2A1A0=001, 地址3F9H]

  • 前提DLAB==1[DLAB为LCR的最高位]

    XTAL1输入基准时钟信号(1.8432MHz )—->N分频——>16倍波特率波特率发生器时钟(BAUDOUT)

    波特率=1843200/(分频系数N×16)

    eg. 分频系数寄存器为16位,高8位DLH,地址3F9H,低8位DLL,地址3F8H。

    波特率为4800Baud,外部基准时钟频率1.8432MHz 。分频系数N=1843200/(4800×16)=24=18H

    1
    2
    3
    4
    5
    6
    7
    8
    9
    MOV DX,03FBH
    MOV AL, 80H
    OUT DX, AL ;set DLAB==1[DLAB为LCR的最高位]
    MOV DX,03F8H
    MOV AL, 18H ;set N 低8位DLL = 18H = 24
    OUT DX, AL
    MOV DX,03F9H
    MOV AL, 00H ;set N 低8位DLH = 0H
    OUT DX, AL
  • 状态寄存器3个

    传输线状态寄存器LSR [A2A1A0=101]

    • 得到发送数据缓冲器和接收数据缓冲器的状态值

      LSR

    • D0-接收器数据就绪。

      1=接收数据寄存器收到一个完整的输入字符;

      0=读出接收数据寄存器的内容后,该位变0。

      D1-超越错,8250接收下一个字符前,接收数据寄存器中的数据尚未取走。

      1=出现超越错;

      ​ 0=CPU读出接收缓冲寄存器的内容时使该位清0;

      D2-奇偶错

      1=检验出奇偶错;

      0=处理器读该状态寄存器时使其复位为0;

      D3-帧格式错

      1=接收到的数据停止位不正确时置1

      D4-线路间断标志

      1=接收的间断状态超过一个完整的数据字传输时间,则使该位置1;

      0=读出该状态寄存器时使其复位为0 ;

      出现上述4种错误会使8250发出线路状态错中断。

      D5-发送保持寄存器空

      ​ 1=准备好接收下一个要求发送的字符或本次发送的字符已从保持寄存器传送到发送移位寄存器;

      0=处理机将字符装入到发送保持寄存器后复位0;

      D6-发送移位寄存器空

      1-发送移位寄存器空闲。

      0-数据由保持寄存器送到移位器后复位0。

      D7-恒为0

    MODEM状态寄存器MSR [A2A1A0=110]

    • D7~4调制解调器控制线当前状态,D3~0四位控制输入状态变化

      MSR

    • D0-清除发送

      ​ 该位逻辑1表示从处理机上一次读出以后,输入的CTS已改变状态;

      D1-数传机就绪

      ​ 该位逻辑1表示从处理机上一次读出以后,输入的DSR已改变状态;

      D2-振铃标志

      ​ 该位逻辑1表示RI已由接通(逻辑1)变成断开(逻辑0)状态;

      D3-接收线路信号检测

      ​ 该位逻辑1表示RLSD已改变状态;

      D4~D7位反映MODEM 控制输入的相应状态

    中断标志寄存器IIR [地址3FAH, A2A1A0=010]

    • 四种类型中断优先级依次: [默认D0=0]

      接收线路状态中断 [D2D1=11]

      接收数据就绪中断 [D2D1=10]

      发送保持寄存器空中断 [D2D1=01]

      MODEM状态改变中断 [D2D1=00]

    • IIR

      高5位恒为0=> 判别系统是否存在异步通讯接口

      D2和D1表示内部4类中断源。

      D0为0,表示有中断源请求中断,1无中断请求

      eg. 判别系统是否存在异步通讯接口=>D7D6D5D4D3=11111, D2D1D0=000

      1
      2
      3
      4
      MOV DX, 3FAH
      IN AL, DX
      TEST AL, 0F8H
      JZ INITIALIZATION
  • 数据寄存器2个

    发送缓冲器TBR [A2A1A0 = 000, DLAB = 0,write]

    • 写入数据保持寄存器,串行发送从字节的最低位开始发送

    接收缓冲器RBR [A2A1A0 = 000, DLAB = 0,read]

    • 寄存器存放接收字符

    8250_2

10个寄存器寻址由A2,A1,A0决定:2^3 +2 = 10

ps. 地址共用同样A2A1A0==000 or 001:两个分频次数寄存器&&其他两个寄存器

DLAB=1时,寻址分频次数寄存器;[DLAB为LCR的最高位]

DLAB=0时,寻址其他寄存器。

8250_state

串行通信8250初始化编程

基本步骤

1.确认串行口地址

COM1为2F8~2FFH,COM2为3F8~3FFH。

各端口地址= 3F8H + A2A1A0

  • DLL(000)地址3F8H, DLH(001)地址3F9H [先将LCR的D7置1(DLAB)]
  • LCR(011)地址为3FBH
  • MCR(100)地址3FCH
  • IER(000)地址3F9H [先将LCR的D7置0(DLAB)]
  • MSR(110)地址3FDH

2.设置分频次数(波特率)

据波特率,计算和查表得到分频系数16位,分别放入DLL和DLH。先将LCR的D7置1(DLAB),然后再写入。

1
2
3
4
5
6
7
8
9
MOV DX, 3FBH
MOV AL, 80H
OUT DX, AL ;DLAB=1
MOV DX, 3F8H
MOV AL, 0CH
OUT DX, AL ;设置分频系数DLL==0CH
MOV DX, 3F9H
MOV AL, 00H
OUT DX, AL ;设置分频系数DLH==0H

3.设置通信数据格式

字符代码位数、停止位、奇偶校验位等,初始化LCR

eg. 数据位长7位=>D1D0=10,1位停止位=>D2=0,奇校验=>D3=1->D4=1,0-寻址RBR、TBR、IER寄存器=>D7=0,D6D5默认00

D4D3D2D1D0=11010,D7D6D5=000==>D7~D0=1AH

1
2
3
MOV DX, 3FBH
MOV AL, 0001 1010B
OUT DX, AL

4.设置MODEM控制寄存器MCR

一般情况MCR设置为03H<=正常情况下,D4=0,

RTS#=0,DSR#=0。

MCR

1
2
3
MOV DX, 3FCH	;MCR
MOV AL, 03H ;set 03H
OUT DX, AL

5.设置中断允许寄存器IER(3F9H)

IER高4位固定为0。[中断次序如下:]

D0-允许接收数据就绪中断;

D1-允许发送保持寄存器空中断;

D2-允许接收字符错误或接收到间断状态中断(也称接收线路状态中断);

D3-允许MODEM状态改变中断

发送:开放发送缓冲器空中断,使IER中D1=1。

接收:开放接收数据出错中断,使IER中D2=1。开放接收数据就绪中断,使IER中D0=1

eg. 禁止中断==>D3D2D1D0=0000=>D7~D0=00H

1
2
3
MOV DX, 3F9H	;  IER
MOV AL, 00H ;禁止中断
OUT DX, AL

eg. 允许接收 数据寄存器满产生中断==>D3D2D1D0=0101=>D7~D0=05H

1
2
3
MOV DX, 3F9H	;  IER
MOV AL, 05H ; 允许接收 数据寄存器产生中断
OUT DX, AL

PS附加. TEST检验D4~D1任一位为1出错

1
2
3
4
   MOV DX,3FDH	;LSR传输线状态寄存器
IN AL,DX
TEST AL,1EH ;D4~D1任一位为1出错
JNZ ERROR

实例

eg. 以查询方式发送数据,

发送字符数据顺序放在SENTDATA开始的单元。

以中断方式接收数据,接收到的字符数据放在变量RECDATA开始的存储单元。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
	MOV DX, 3FBH
MOV AL, 80H
OUT DX, AL ;DLAB=1
MOV DX, 3F8H ;规定波特率9600Baud
MOV AL, 0CH
OUT DX, AL ;设置分频系数DLL
MOV DX, 3F9H
MOV AL, 00H
OUT DX, AL ;设置分频系数DLH

MOV DX, 3FBH
MOV AL, 1AH ;长度7位,1位停止,奇校验
OUT DX, AL

MOV DX, 3FCH ;MCR
MOV AL, 0BH ;0000 1011B
OUT DX, AL

MOV DX, 3F9H ; IER
MOV AL, 05H ; 允许接收数据寄存器满产生中断
OUT DX, AL

STI
MOV SI, OFFSET SENTDATA
MOV BX, OFFSET RECDATA

;接收中断服务程序:
RECVE: PUSH AX
PUSH BX
PUSH DX
PUSH DS
MOV DX,3FDH ;LSR传输线状态寄存器
IN AL,DX
TEST AL,1EH ;D4~D1任一位为1出错
JNZ ERROR
MOV DX, 3F8
IN AL, DX
AND AL, 7FH
MOV [BX], AL
INC BX
MOV AL,20H
MOV DX,0020H
OUT DX,AL
POP DS
POP DX
POP BX
POP AX
STI
IRET

异步串行通信接口芯片8251

同步方式或异步方式:

  • 同步方式下,波特率为0~64Kbps,

    每一个字符可为5、6、7或8位,

    能自动检测同步字符,

    可进行奇/偶校验;

  • 异步方式下,波特率为0~19.2Kbps,

    每一个字符可为5、6、7或8位,

    启动位1位,校验位1位,能根据编程为每个数据增加1、1.5或2位停止位。

8251

8251管脚

  • 与CPU的连接信号

    读/写控制信号:

    包括读信号RD#、写信号WR#、控制/数据信号C/D#

    8251_wr

    片选信号CS#

    数据信号D7~D0

    收发联络信号:

    • TXRDY 发送器准备好
    • TXE 发送器空
    • RXRDY 接收器准备好
    • SYNDET 同步检测信号
  • 与外设的连接信号

    数据信号: TxD、RxD;

    和外设的联络信号:

    • DTR#(data terminal ready):数据终端准备好信号;
    • DSR#(data set ready):数据设备准备好信号;
    • RTS#(request to send):请求发送信号;
    • CTS#(clear to send):清除发送信号;

    使用时,一般将DTR#和DSR#连接接收器,将RTS#和CTS#连接发送器。

    时钟信号: 系统时钟CLK;发送时钟TXC;接收时钟RXC;

8251内部寄存器

8251_reg1

8251_reg2

异步模式:

  • 发送时钟TxC、接收时钟RxC由专门的时钟发生器供给;

    发送和接收波特率分别由TxC、RxC与波特率因子决定:

    波特率=时钟频率/波特率因子

    异步发送数据时,在控制寄存器中允许发送位TxEN有效,且CTS#信号有效时,开始发送过程;

    异步接收数据时,在控制寄存器中允许发送位RxEN有效时,RxRDY信号表示收到了一个有效数据

同步模式:

  • 发送时钟TxC、接收时钟RxC由调制解调器和有关通信设备控制;

    发送和接收波特率分别和TxC、RxC引脚上的时钟频率相等;

    同步发送时,在控制寄存器中允许发送位TxEN有效,且CTS#信号有效时,开始发送过程:

    • 根据编程要求发送1个或2个同步字符,然后发送数据块;

      当CPU来不及提供数据时,8251自动插入同步字符;

    同步接收时,8251首先搜索同步字符,将接收到的字符与同步字符寄存器内容比较

    • 根据编程,需较1或2个同步字符

模式字&控制字&状态字

8251A有一奇一偶两个端口地址。

偶地址对应数据输入寄存器和数据输出寄存器。

奇地址对应状态寄存器、模式寄存器、控制寄存器和同步字符寄存器。

8251的初始化

  1. 芯片复位后,第一次对 模式字——->奇地址—->模式寄存器;

  2. if模式字=>同步模式,往奇地址写入同步字符,

    then if 规定同步字符为2个,则分别写入第一个和第二个同步字符寄存器;

  3. 此后,只要不是复位命令,不分同步、异步模式,往奇地址写的作为控制字送到控制寄存器,往偶地址写的作为数据送到数据发送缓冲器

eg. 异步模式初始化程序

模式字和控制字都必须写入“奇地址”端口,这里假设为42H。异步模式下必须给出波特率因子。

假设:字符用7位数据位表示、偶校验、2位停止位,波特率因子16。

模式字:1111 10 10B 0FAH

控制字:0011 0111B 37H

1
2
3
4
MOV   AL, 0FAH  ;设模式字:异步模式、波特率因子16、
OUT 42H, AL ; 7位数据位、偶校验、2位停止位
MOV AL, 37H ;设置控制字:使发送启动、接收启动
OUT 42H, AL

eg. 同步模式初始化程序

假设“奇地址”端口为42H。程序往此端口设置的数据依次为模式字、同步字符和控制字符

假设:字符用7位数据位表示、偶校验,用两个同步字符,采用内同步模式。同步字符16H

模式字:00111000B 38H

控制字:1001 0111B 97H

1
2
3
4
5
6
7
MOV   AL, 38H   ;设置模式字:同步模式、2个同步字符
OUT 42H, AL ; 7位数据位、偶校验
MOV AL, 16H
OUT 42H, AL ;两个同步字符均为16H;
OUT 42H, AL
MOV AL, 97H ;设置控制字:使发送启动、接收启动
OUT 42H, AL

eg.

1
2
3
MOV   DX,209H
IN AL,DX;状态字
AND AL,02H;RXRDY?

eg.

1
2
3
MOV   DX,209H
IN AL,DX ;状态字
AND AL,01H ;TXRDY?

综合实例

8251_ini

eg. 输入80个字符。

假设8251控制和状态端口为42H,数据输入和输出地址为40H。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	MOV   AL, 0FAH ;设模式字:异步模式、波特率因子16、
OUT 42H, AL ; 7位数据位、偶校验、2位停止位
MOV AL, 37H ;设置控制字:使发送启动、接收启动
OUT 42H, AL
MOV DI, 0
MOV CX, 80
BEGIN: IN AL, 42H
TEST AL,02H ;测试RxRDY
JZ BEGIN
IN AL, 40H
MOV DX,OFFSET BUFFER
MOV [DX+DI], AL
INC DI
IN AL, 42H
TEST AL,38H ;测试是否有错
JNZ ERROR
LOOP BEGIN
JMP EXIT
ERROR: CALL ERROR_OUT
EXIT:
...

eg. 8251异步模式下的接收和发送程序,完成256个字符的发送和接收,

设端口地址:208H,209H,波特率因子16,

1起始位,1停止位,无奇偶校验,每字符8位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
;接收程序
Data segment
buf DB 256 dup(?)
Data ends
...
MOV DX, 209H
MOV AL, 40H;复位
OUT DX, AL
MOV AL, 01001110B;模式字
OUT DX, AL
MOV AL, 00110111B;控制字
OUT DX, AL
MOV CX, 256 ;接收256字节
MOV SI, 0
NEXT:MOV DX,209H
IN AL,DX ;状态字
AND AL,02H ;RXRDY?
JZ NEXT
MOV DX,208H
IN AL,DX ;接收1字符
MOV buf[SI],AL
INC SI
LOOP NEXT
;发送程序
MOV DX, 209H
MOV AL, 40H ;复位命令。
OUT DX, AL
MOV AL, 01001110B ;模式字
MOV DX, AL
MOV AL, 00110111B ;控制字
OUT DX, AL
MOV CX, 256 ;发送256字节
NEXT:MOV DX, 209H
IN AL, DX ;状态字
AND AL, 01H ;TXRDY?
JZ NEXT
MOV AL, CL
MOV DX, 208H
OUT DX, AL ;发送
LOOP NEXT