第五节 可编程串行通信接口芯片8251A8251A是一个通用串行输入/输出接口,可用来将86系列CPU以同步或异步方式与外部设备进行串行通信。它能将主机以并行方式输入的8位数据变换成逐位输出的串行信号; 也能将串行输入数据变换成并行数据传送给处理机。由于由接口芯片硬件完成串行通信的基本过程,从而大大减轻了CPU的负担, 被广泛应用于长距离通信系统及计算机网络。
8251A是一个功能很强的全双工可编程串行通信接口, 具有独立的双缓冲结构的接收和发送器,通过编程可以选择同步方式或者异步方式。在同步方式下,既可以设定为内同步方式也可以设定为外同步方式,并可以在内同步方式时自动插入一个到两个同步字符。传送字符的数据位可以定义为5~8位, 波特率0~64K可选择。 在异步方式下,可以自动产生起始和停止位,并可以编程选择传送字符为5~8位之间的数据位以及1、1/2位之中的停止位,波特率0~19.2K可选择。同步和异步方式都具有对奇偶错、覆盖错以及帧错误的检测能力。
图8.5.1为8251A结构框图。作为常用的通信接口,和8255A类似,8251A的结构也可以归纳为以下三个部分:
第一部分是和CPU或者总线的接口部分, 其中包括数据总线缓冲器、读/写控制逻辑。 数据总线缓冲器用来把8251A和系统数据总线相连,在CPU执行输入/输出指令期间, 由数据总线缓冲器发送和接收数据,此外,控制字,命令字和状态信息也通过数据总线缓冲器传输,读/写控制逻辑电路用来配合数据总线缓冲器工作。 CPU通过数据总线缓冲器和读写控制逻辑向8251A 写入工作方式和控制命令字,对芯片初始化; 向8251A写入要发送字符的数据代码,送到发送缓冲器进行并行到串行的转换,并且将接收的、已转换成并行代码的接收缓冲器中的字符数据读入CPU。
第二部分是数据格式转换部分,包括发送缓冲器、并行数据到串行数据转换的发送移位器,接收缓冲器和串行数据到并行数据转换的接收移位器,以及发送控制电路和接收控制电路。发送缓冲器把来自CPU的并行数据加上相应的控制信息, 然后利用发送移位器把它们转换成串行数据发送出去。接收缓冲器接收串行数据,并利用接收移位器按照相应的格式将串行数据转换成并行数据。发送和接收控制电路控制并行数据与串行数据之间的转换以及串行数据的发送和接收。发送器准备好TxRDY信号和接收器准备好RxRDY信号反映了发送器和接收器状态,它们可以用作控制8251A和CPU之间传送数据的中断请求信号或程序查询信号。
第三部分是和外设的连接部分,包括连接发送移位器的串行发送信号线TxD、 连接接收移位器的串行接收信号线RxD; 调制/解调控制电路和它的两对联络信号:数据终端请求发送RTS#和数据设备清除请求发送(允许发送)CTS#,数据终端准备好DTR#和数据设备准备好DSR#。 这两对信号在8251A向从调制解调器或其他串行外设发送/接收数据的过程中进行“握手”联络。 这四个信号和并行接口的IBF,OBF#,STB#,ACK#都是有很多相似之处的。
825lA可以按全双工方式工作, 由发送器、接收器、数据总线缓冲存储器、读/写控制电路及调制/解调控制电路等5部分组成。
基本性能:同步/异步传送;5~8位/字符;自动生成和检测启始位、中止位、奇偶位和断缺字符;全双工双缓冲;
波特率:异步:~19Kb/s,同步:~64Kb/s
1.发送器
⑴组成:发送缓冲存储器,发送移位寄存器(并→串转换)及发送控制电路3部分
⑵发送过程:当发送器就绪时,由发送控制电路向CPU发出TxRDY有效信号(或状态),CPU以中断方式(或查询方式)立即向8251A并行输出数据。如果8251A与CPU之间采用中断方式交换信息,那时TxRDY作为向CPU发出的发送中断请求信号。待发送器中的8位数据发送完毕时,由发送控制电路向CPU发出TxEMPTY有效信号/状态,表示发送器中移位寄存器已空。完成一次数据通信。
⑶工作方式:由事先设置(同步或异步),芯片自动为数据包装成帧格式。
⑷ 与发送器有关引脚信号如下:
①TxD——数据发送线,输出串行数据。
②TxRDY——发送器就绪信号,表示8251A的发送数据缓冲存储器已空。输出信号线,高电平有效。只要允许发送(TxEN=1及CTS端有效),则CPU就可向8251A写入待发数据。 TxRDY还可作为中断请求信号用。待CPU向8251A写入一个字符后,TxRDY便被清零变为低电平。
③TxEMPTY——发送器空闲信号,表示8251A的发送移位寄存器已空。输出信号线,高电平有效。当TxEMPTY=1时,CPU可向8251A的发送缓冲存储器写人数据。
④TxC——发送器时钟信号,外部输入。对于同步方式,TxC的时钟频率应等于发送数据的波特率。对于异步方式,由软件定义的发送时钟是发送波特率的1倍(×1),16倍(×16)或64倍(×64),在要求1倍情况时,TxC<64kHz;16倍情况时,TxC<312kHz;64倍情况时,TxC<615kHz。
表8.5.1为TxRDY和TxEMPTY状态。
![]()
2.接收器
⑴组成:接收缓冲存储器,接收移位寄存器(串→并转换)及接收控制电路3部分。
⑵工作过程:在接收时钟RxC的作用下,数据从RxT端逐位进入接收移位寄存器中。如果是同步方式,则要检测同步字符,确认已经达到同步,接收器才可开始串行接收数据,待一组数据接收完毕,便把移位寄存器中的数据并行置入接收缓冲存储器中;如果是异步方式,则应识别并且删除起始位和停止位。 这时RxDRY线输出高电平(或状态),表示接收器已准备好数据,等待向CPU输出。
接收数据的同时进行检验,发现错误,则在状态寄存器中保存,当检验无错误时,才把并行数据放入数据总线缓冲器中,并发出接收器就绪信号(RxRDY=1)。
常见错误类型:
①奇偶错误(Parity Error):接收到的数据中“1”的数量与约定的不符。
②帧错误(Frame Error): 数据格式与规定不符。 如缺少停止位。
③溢出错误(Overflow Error):8251A接收到一个新数据,把它送入“接收数据寄存器”时, 发现前一个数据尚未被CPU取走,则发生溢出错误而掉失数据。
⑶工作方式:由事先设置(同步或异步), 825lA接收数据的速率由RxC端输入的时钟频率决定。
⑷与接收器有关引脚信号如下:
①RxD——数据接收线,输入串行数据。
②RxRDY——接收器已准备就绪信号, 表示接收缓冲寄存器中已接收到一个数据符号,等待向CPU输入。 若8251A采用中断方式与CPU交换数据,则RxRDY信号用作向CPU发出的中断请求。 当CPU取走接收缓冲存储器中数据后,同时将RxRDY变为低电平。
③SYNDET/BRKDET——双功能的检测信号,高电平有效。 对于同步方式,SYNDET是同步检测端。若采用内同步, 当RxD端上收到一个(单同步)或两个(双同步)同步字符时,SYNDET输出高电平,表示已达到同步,后续接收到的便是有效数据。若采用外同步,外同步字符从SYNDET端输入,当SYNDET输入有效,表示已达到同步,接收器可开始接收有效数据。对于异步方式,BRKDET用于检测线路是处于工作状态还是断缺状态。当RxD端上连续收到八个“0”信号,则BRKDET高电平输出,表示当前处于数据断缺状态。
④RxC——接收器时钟,由外部输入。这时钟频率决定825lA接收数据的速率。 若采用同步方式, 接收器时钟频率等于接收数据的频率;若采用异步方式,可用软件定义接收数据的波特率,情况与发送器时钟TxC相似。 一般,接收器时钟应与对方的发送器时钟相同。
3.数据总线缓冲存储器
⑴作用:CPU与8251A之间信息交换的通道。
⑵组成:3个8位缓冲寄存器是用来存放CPU向8251A读取的:a.数据;b.状态;c.存放CPU向8251A写入的数据或控制字。
4.读/写控制电路
⑴作用:接收控制信号并决定825lA当前状态,向825lA内部各功能部件发出有关的控制信号,因此它实际上是825lA的内部控制器。
⑵读/写控制信号:
①RESET——复位。输入信号,RESET有效, 迫使825lA中各寄存器处于复位状态,收、发线路上均处于空闲状态。
②CLK——主时钟。输入信号。用来产生825lA内部的定时信号。
③CS#——选片信号。输入、低电平有效。CS#有效, 表示8251A芯片被选,通常由825lA的高位端口地址译码得到。
④RD#和WR#——读和写信号。输入、低电平有效。
⑤C/D#——控制/数据端口选择。C/D#=l, 表示当前选择了控制端口;C/D#=0,表示当前选择了数据端口。
![]()
5.MODEM控制电路
⑴作用:提供4个与MODEM连接的信号, 利用MODEM可以实现远程通信。
⑵MODEM控制信号:
①DTR#(Data Terminal Ready)——数据终端就绪信号, (向调制/解调器)输出信号,低电平有效。DTR有效,表示CPU已准备好接收数据,它可软件定义。控制字中DTR位=1时,输出DTR为有效信号。
②DSR#(Data Set Ready)——数据装置就绪信号。(从调制/解调器)输入,低电平有效。 DSR有效,表示调制/解调器或外部设备向CPU传送数据已就绪, CPU可以利用IN指令读入8251A状态寄存器,检测DSR位状态, 当DSR=1时,表示DSR有效。DTR与DSR为数据接收的一对联络信号。
③RTS#(Request to Send)——请求发送信号。 (向调制/解调器)输出,低电平有效。RTS有效,表示CPU发送数据已就绪,可由软件定义。控制字中RTS位=1时,输出RTS有效信号。
④CTS#(Clear to Send)——清除发送信号(表示MODEM处于发送就绪)。(由调制/解调器)输入,低电平有效。 CTS有效,表示调制/解调器已作好接收来自CPU数据的准备。只要控制字中位TxEN=1,CTS有效时, 8251A发送器才可串行发送数据。它实际上是对RTS的回答信号。如果在数据发送过程中使CTS无效,或TxEN=0, 发送器将正在发送的字符结束时停止继续发送。
8251A异步工作方式:如果8251A编程为异步方式,在需要发送字符时,必须首先设置TXEN和CTS#为有效状态,TXEN(Transmitter Enable)是允许发送信号, 是命令寄存器中的一位; CTS#(Clear To Send)是由外设发来的对CPU请求发送信号的响应信号。然后就开始发送过程。在发送时,每当CPU送往发送缓冲器一个字符, 发送器自动为这个字符加上1个起始位, 并且按照编程要求加上奇/偶校验位以及1个、1.5个或者2个停止位。 串行数据以起始位开始,接着是最低有效数据位,最高有效位的后面是奇/偶校验位,然后是停止位。按位发送的数据是以发送时钟TXC的下降沿同步的, 也就是说这些数据总是在发送时钟TXC的下降沿从8251A发出。数据传输的波特率取决于编程时指定的波特率因子, 为发送器时钟频率的1、1/16或1/64。当波特率指定为16时,数据传输的波特率就是发送器时钟频率的1/16。CPU通过数据总线将数据送到8251A的数据输出缓冲寄存器以后,再传输到发送缓冲器,经移位寄存器移位,将并行数据变为串行数据,从TxD端送往外部设备。
在8251A接收字符时, 命令寄存器的接收允许位RxE (Receiver Enable) 必须为1。 8251A通过检测RxD引脚上的低电平来准备接收字符,在没有字符传送时RxD端为高电平。 8251A不断地检测RxD引脚,从RxD端上检测到低电平以后, 便认为是串行数据的起始位,并且启动接收控制电路中的一个计数器来进行计数,计数器的频率等于接收器时钟频率。计数器是作为接收器采样定时,我们在前面讲到过,当计数到相当于半个数位的传输时间时再次对RxD端进行采样, 如果仍为低电平,则确认该数位是一个有效的起始位。当时我们讲到的例子是传输一个字符需要16个时钟, 那么就是要在计数8个时钟后采样到低电平。之后,8251A每隔一个数位的传输时间对RxD端采样一次(就是例子中讲到的此后每16个周期采样一次),依次确定串行数据位的值。串行数据位顺序进入接收移位寄存器,通过校验并除去停止位,变成并行数据以后通过内部数据总线送入接收缓冲器,此时发出有效状态的RxRDY信号给CPU, 通知CPU 8251A已经收到一个有效的数据。我们前面说过一个字符对应的数据可以是5~8位。如果一个字符对应的数据不到8位,8251A会在移位转换成并行数据的时候,自动把他们的高位补成0。
在短距离传输时,两个串行接口之间也可以进行无联络信号的传送,在这种情况下,除CTS#以外,其他联络信号都可以不加使用。而CTS#则必须接入有效的低电平。否则8251A将不能向外设发送数据。
同步方式:在同步方式发送字符之前, 也必须设置8251A的TxEN和CTS#有效。如果编程为内同步方式,发送器会根据要求发送一个或者两个同步字符,然后连续地发送数据字符。在发送数据字符时,发送器会按照编程规定对每个数据添加奇/偶校验位。在字符发送的过程中,如果CPU向8251A的数据传送出现间隙, 8251A的发送器会自动插入同步(中止)字符。
当编程为同步接收而且为内同步时, 命令寄存器的RxE也必须为1。8251A首先搜索同步字符,不断检测串行接收线RxD的状态,将RxD线上一个个数据位送入移位寄存器,再将寄存器的内容与设定的同步字符进行比较,如果两者不相等,则接收下一位数据,并且重复上述比较过程。当寄存器的内容与同步符相等时,表示已经实现同步,此时8251A的同步检测信号SYNDET端出现高电平。 同步字符可由程序设定为一个或两个。当编程为外同步方式时,同步是通过控制同步输入信号SYNDET来实现的。只要SYNDET端上出现有效电平,即信号由低变高并持续一个时钟周期,便确认实现同步。之后,接收器以接收器时钟为基准, 连续采样串行数据接收线RxD上传来的串行字符数据位,逐一将它们送入移位器, 组成字符后送到输入缓冲器, 再通过有效RxRDY通知CPU读取。
8251A内部的寄存器很多, 其中可以进行编程的寄存器有:一个工作方式寄存器、一个控制命令寄存器、一个状态寄存器和两个同步字符寄存器。 向工作方式寄存器写入内容可以决定8251A采用同步还是异步的工作模式,还决定了接收和发送的字符的格式,比如字符采用几位表示,采用什么方式校验等等。改变控制命令寄存器的内容可以设置控制8251A工作的各种命令。状态寄存器提供8251A在工作过程中的状态信息,比如数据终端是否已经准备好。同步字符寄存器则用来存放同步方式中所用的同步字符,这个同步字符是可以由用户设定的。
1.方式选择控制字
825lA在使用前要用工作方式控制字对其作初始化, 以确定它的工作方式,传送速率,字符格式以及停止位长度等。控制字应紧接复位后从控制口写入。
工作方式控制字如图8.5.2。
①先由B2B1选择同步/异步方式。
②若为同步方式,再由S2S1选择同步格式。
③若为异步方式,则设置所有方式位。
2.操作命令控制字
命令字在工作方式控制字后通过控制端口写入, 用于命令8251A进行指定的操作(如发送,接收,内部复位,检测同步字符等),或使其处于某种状态(如DTR),以便接收或发送。它对正确使用8251A很重要。
操作命令字如下:
DTR位是数据终端就绪位。DTR=1, 迫使引线DTR=0输出有效,向MODEM表示 CPU已准备好接收数据。
①RxE位是接收允许位。RxE=l, 接收器才能通过RxD线从外部串行接收数据。
②SBRK位是发送断缺字符位。 SBRK=1,使线路空闲时,TxD线一直发送“0”的空号,可减少线路损耗。正常通信过程中SBRK=0。
③ER位是清除错误标志位。ER=l时,将PE、OE以及FE标志同时清“0”。
④RTS位是请求发送信号。RTS=1,迫使8251A输出RTS有效,表示CPU已作好发送数据准备,请求向调制/解调器或外部设备发送数据。
⑤IR位是内部复位信号。IR=1,使8251A复位(或线RESET=1)、此时才能接收方式选择字, 此后所有写入的8251A控制口的都当作操作命令字。
⑥EH位为跟踪方式位。EH位只对同步方式有效,EH=1,表示开始搜索同步字符,因此对于同步方式, 一旦允许接收(RxE=1),必须同时使EH=1,并且使ER=1,清除全都错误标志,才能开始搜索同步字符。
3.状态控制字
8251A备有状态寄存器,可供CPU查询其当前工作状态,CPU可用IN指令从控制口读取。
⑴错误状态:FE、OE、PE。
⑵状态标志:DSR、TxEMPTY、RxRDY、 TxRDY。
SYNDET/BRKDET(异步接收时)=1: 接收端收到线路上的断缺信号(空号)。
TxRDY引脚=TxRDY状态位×(CTS#=0)×(TxEN=1)
当发送缓冲寄存器空时(TxRDY状态=1),如果允许发送(TxEN=1),当MODEM可以发送时(CTS#=0),信号线TxRDY=1变为有效,用户可以用TxRDY线(作中断请求信号)启动CPU向串口送数, 也可以让CPU查询状态TxRDY来决定是否向串口送数。
4.8251A初始化流程
8251A有一个方式寄存器、一个命令寄存器、 一个状态寄存器和两个同步字符寄存器, 再加上数据发送和数据接收缓冲器,一共有7个用户可访问的寄存器。而8251A芯片只提供2个分别用于命令寄存器和数据寄存器的可访问地址。 不难想到,编程8251A的方式字、命令字必须遵循芯片设计的有关约定,按照规定的先后次序来进行设置。芯片设计约定:
凡是初始化有关的方式、命令和同步字或者读取状态字,访问芯片的奇地址,凡是传送数据,访问芯片的偶地址。
复位以后,第一次写入奇地址的是方式选择字。
如果编程8251A的工作方式为同步方式, 紧接着送入奇地址的是同步字。 方式选择字还规定了同步字的个数, 必须根据方式字的设定,向奇地址写入1个或按顺序写入2个同步字。
之后,写入奇地址的数据一概被认为是命令字。命令字中如果包含复位命令,8251A被复位。 其后送入奇地址的字节又被认为是方式字。命令字中如果不包含复位命令,初始化完毕,便可以开始使用偶地址传送数据。
1.假设8251A工作在具有联络信号的全双工异步模式, 数据格式为7位二进制数据位,进行奇校验,1.5个停止位;波特率因子为16。按照前面规定的方式选择字各个数位的含义,那么方式选择字应该为10011010B,也就是9AH,大家可以对照着含义逐一看看这个方式字的每个数位为什么是0或者1。控制命令需要包括:清除出错标志、令请求发送信号RTS处于有效状态、通知调制解调器和外设CPU将要发送信息。令数据终端准备好信号DTR处于有效状态, 通知调制解调器和外设数据终端准备好接收数据。 令发送允许位TxEN和接收允许位RxE为1,使发送和接收允许都处于有效状态。这样, 按照前面规定的命令字的各个数位的含义,命令字就应该设为00110111B,也就是37H,又假设8251A的命令端口地址为82H,数据端口为80H (我们在讲并行接口的时候提到过,8位接口的芯片在连接8086时,仅使用数据线的低8位,为了让传输信息时,数据出现在低8位数据线上,所以CPU访问各个端口是必须使用偶地址来访问的。 为了同时满足8251A对端口的规定, 在硬件连线上把地址线的A1作为地址的最低位来使用,从CPU的角度看,给出的是两个连续的偶地址,而从接口芯片的角度看,两个偶地址分别向右移了一位,也就是除了2,于是就变成了一个奇地址,一个偶地址,于是就满足双方的要求)。
初始化程序汇编语言如下:
MOV AL,9AH ;设置方式选择字,使8251A处于异步模式;波特
率因子为16;
OUT 82H,AL ;数据格式为7个数据位,奇校验,1.5个停止位;
MOV AL,37H ;设置命令字,置请求发送有效、 数据终端准备
好信号有效;
OUT 82H,AL ;置发送标志允许、接收允许标志为1。
2.串行接口芯片仍然选用8251A, 由于8251A和Intel系列微处理器以及ISA总线信号兼容,因此硬件连接十分简单。图8.5.6是两台PC机的串行接口相互连接的逻辑图。 PC机分配给串行口的地址为03F8H~03FBH,命令端口为03FAH,数据端口为03F8H。串行接口和CPU的数据交互方式定义为状态查询方式, 也就是说CPU是采用查询方式来和串行接口通信的,通过不断对串行接口的状态采样来确定串行接口的状态,从而决定应该采取什么样的动作。两台PC机的串行接口之间采用无联络信号的全双工连接,我们在前面也讲到过,只需要将它们的串行数据发送和串行数据接收端互相连接,并把地线连在一起,便可以实现通信。在这里值得注意的是: 为了使8251A能够满足调制解调器在电平方面要求的RS-232-C标准, 要将8251A的TXD的TTL电平转换成RS232电平进行传送, 然后再将它变回TTL电平由另一台PC的8251A接收。 要注意的是尽管使用的无联络信号的传输方式,但两边8251A的CTS#端必须接地。两台PC机可以同时作为数据发送方以及数据接收方,他们运行同样的驱动程序。
如果要求两台PC机间每秒传送1000个ASCII码, 可以设定选用异步工作方式,字符格式为5位字长,偶校验, 一个停止位,波特率为19200,波特率因子为1。方式选择字为01110001B,71H。数据传送前要错误标志复位,并要设定发送允许位和接收允许位为有效状态,因此,控制命令字为00010101B,15H。CPU通过查询状态位TxRDY控制发送数据,通过查询状态位RxRDY来读取接收数据。
控制两台计算机通信的汇编语言程序段如下:
8251A初始化
MOV DX,03FAH ;设定命令端口地址(奇地址)
MOV AL,71H ;设置方式选择字
OUT DX,AL ;写入命令端口,存到方式寄存器中
MOV AL,15H ;设置命令字
OUT DX,AL ;写入命令端口,存到命令寄存器中
以查询方式控制数据发送
MOV AX,TXD-ADDR ;初始化DS
MOV DS,AX ;
MOV SI, OFFSET TXDBUF ;初始化变址寄存器
MOV CX,COUNT ;初始化总共要传输的字符个数
TXD:MOV DX,3FAH
IN AL,DX ;从命令端口读状态字
TEST AL,01 ;查询输入缓冲器是否为空
JZ TXD ;不空则继续查询,直到为空
可以传送数据
MOV AL,[SI] ;读取字符
MOV DX,03F8H ;设定数据端口地址
OUT DX,AL ;向数据端口输入字符
INC SI ;地址加1
DEC CX ;计数器减1
JNZ TXD ;继续传输直到计数器为0
┇
以查询方式控制数据接收
MOV AX,RXD-ADDR ;初始化DS
MOV DS,AX ;
MOV SI,OFFSET RXDBUF ;初始化变址寄存器
MOV CX,COUNT ;初始化总共要接受的字符的个数
RXD:MOV DX,3FAH
IN AL,DX ;读状态字
TEST AL,02 ;接受缓冲区是否为空
JZ RXD ;空则继续查询,直到不空
TEST AL,38H ;是否有出错信息
JNZ ERR ;转出错处理
MOV DX,3F8H
IN AL,DX ;从数据端口读数,接收数据
MOV [SI],AL ;放到内存中
INC SI ;地址加1
DEC CX ;计数器减1
JNZ RXD ;继续接收直到计数器为0
┇
ERR: … ;错误处理程序3.用8251A实现串行接口通信是通过两台微机中RS232串行接口。每个RS232串行接口采用一片8251A芯片。
例:采用查询方式异步传送,半双工通信。
双方实现半双工通信时,初始化程序由两部分组成:一部分是将一方定义为发送器, 另一部分是将对方定义为接收器。发送端CPU每查询到TxRDY有效,则向8251A输出一个字节数据; 接收端CPU每查询到RxRDY有效,则从8251A并行输入一个字节数据;直到全部数据传送完毕为止。
发送端初始化程序与发送控制程序如下所示:
STT:MOV DX,8251A控制端口
MOV AL,7FH ;定义为异步方式
OUT DX,AL ;8位数据,l位
MOV AL, 11H ;停止位,偶校验
OUT DX,AL ;取波特率系数为64
MOV DI,发送数据块首地址 ;允许发送
MOV CX,发送数据块字节数;
NEXT:MOV DX,8251A控制端口
IN AL,DX ;查询TxRDY有效否
AND AL,01H
JZ NEXT
MOV DX,8251A数据端口
MOV AL,[DI] ;输出一个字节数据
OUT DX,AL
INC DI
LOOP NEXT
RET
接收端初始化程序和接收控制程序如下所示:
SRR:MOV DX,8251A控制端口
MOV AL,7FH
OUT DX,AL ;初始化8251A
MOV AL,04H
OUT DX,AL
MOV DI,接收数据块首地址;
MOV CX,接收数据字节数;
COMT:MOV DX,8251A控制端口
IN AL,DX
TEST AL,38H
JNZ ERR ;检测到错误转ERR
TEST AL,02H
JZ COMT
MOV DX 8251A数据端口
IN AL,DX ;输入字节数到接收数据块
MOV [Dl],AL
INC DI
LOOP COMT
RET
ERR:……