? 通过对 【计算机与UNIX汇编原理 ① ~ ?】我们已经大致掌握了学习的相关知识
接下来,我将其列名改为 计算机原理和接口技术(UNIX) 】,重点将放在 “” 上
串行通信程序设计-具体例子(上机试验:微机系统串行口试验) 文章末尾详细分析说明了简单的演示图。
文章目录
- 一、导语(并行与串行)
- 二、串行通信基础
-
- 2.1 串行异步通信
- 2.2 串行同步通信
- 2.3 串行数据传输模式
- 2.4 串行异步通信协议
-
- 2.4.1 一帧数据的格式
- 2.4.2 通信速率
- 2.4.3 调制和解调信号
- 2.4.4 串行通信接口标准 —— RS232C标准
-
- 2.4.4.1 定义控制信号(机械特性)
- 2.4.4.2 信号电平标准(电气特性)
- 三、可编程串行异步通信接口芯片 8250 ???
-
- 3.1 8250 的内部结构
- 3.2 8250 —— 内部10 重要的寄存器
-
- 3.2.1 第一类:数据传输(包括 2 种)
- 3.2.2 第二类:控制字寄存器 (有 4 种) ──> ④ MODEM 控制寄存器
- 3.2.3 第三类:状态寄存器(包括) 3 种)
- 3.3 8250 初始编程
- 四、串行通信程序设计的基本知识点
-
- 4.1 串行通信的外部环境
- 4.2 BIOS 通信软件
-
- 4.2.1 串口初始化【INT 14H 的 0 号功能】
- 4.2.2 发送一帧数据【INT 14H 的 1 号功能】
- 4.2.3 接收一帧数据【INT 14H 的 2 号功能】
- 4.2.4 测试通信线的状态【INT 14H 的 3 号功能】
- 五、串行通信程序设计-具体例子
-
- 5.1 样例一
- 5.2 样例二 —— 上机试验:微机系统串行口试验 ???
- 六、参考附录
英语通信:Communication
计算机原理和接口技术(UNIX)?】——中断系统 [ 总结2.5万字,8259A ]. 计算机原理和接口技术(UNIX)?】——并行 I/O 接口 [ 芯片8255A ].
一、导语(并行与串行)
● CPU 与外部信息交换称为通信,而与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,与外部信息交换称为通信,和是 CPU 信息交换与外设的基本方式。:
● :电路复杂,成本高,但传输速度快。主要用于计算机内部和近距离外设传输。
● :电路简单,成本低,但传输速度慢。主要用于远程传输、通信线路(如电话线、无线电等)。
● :并行通信 > 串行同步通信 > 串行异步通信
二、串行通信基础
● 串行通信按串行数据的时钟控制方式可分为:、(这就是我们通常所说的串行通信)。
2.1 串行异步通信
● :指一个字符(一帧数据)用起始和停止来完成收发同步。下图是串行异步通信的标准数据格式:
-
: ① :
1
位逻辑“0” ② :5~8
0、1代码 ③ :0~1
位:0或1 ④ :1
、1.5
、2
位逻辑“1” -
: ① 串行异步通信时,一个字符从起始位开始,然后是数据位和奇偶校准位,最后以停止位结束,起始位后是数据的最低位。 ② 当检测到一系列传输线时,接收设备将继续检测传输线
1
然后检测一个0
,启动内部计数器开始计数,…(一波与数据传输相关的硬件运动)…,只有无帧错误和无奇偶验证错误的接收数据才是正确的。 ③ 接收一个字符后,接收设备将继续测试传输线,并测试下一个字符起始信号的到来。
● :在串行异步通信中,不要求双方使用严格的时钟同步,但为了确保一定的时钟精度,时钟信号的速率往往是数据信号的速度16
、32
或64
倍。
2.2 串行同步通信
● :收发双方(严格要求时钟同步)的同步通信由同步字符完成。
● 串行异步通信需要在每个字符前后附加起始位和停止位,约为20%
传输效率低的附加信号位。
● 所有串行同步通信数据格式没有起始位和停止位,一次传送的字符个数可以变化。其数据格式演示如下:
- : ① 串行同步通信时,接收设备首先搜索同步字符,接收同步字符后开始接收数据。 ② 在传输过程中,发送设备和接收设备应完全同步。(如果由于某些原因接收泄漏,则后续数据接收错误,可通过验证字找到) ③ 接收一个字符后,接收设备将继续测试传输线,并测试下一个字符起始信号的到来。
2.3 串行数据传输模式
● 串行数据通信系统模型如下图所示:(MODEM
我们会学到,这就是我们常说的 ,有关上网的 “摸登” )
●
2.4 串行异步通信协议
● 为了能够正常通信,发送方和接收方都必须共同遵守一些通信协议,包括收、发双方的同步方式、差错检验方式、数据编码、数据传输速率等等。(就好像我们用美国人交流时,我们得用英语。这里遵守的“通信协议”即为:英语语法,我们也不能说的太快,不然对方听不清)
●
2.4.1 一帧数据的格式
●
① 起始位:传输线上若没有数据传输时,处于逻辑
1
状态。一帧字符开始传送时,首先发送起始位(即一位逻辑0
)。接收设备检测到逻辑0
信号后,开始接收数据。起始位的作用:使收、发双方在传送数据位前协调同步。② 数据位:起始位之后是数据位,数据位从最低位开始发送,个数共
5~8
位。③ 奇偶校验位:数据位发送完毕后,接着发送奇偶校验位。通信双方约定采用一致的奇偶校验方式,由发送方设置校验位,由接收方负责校验。奇校验:数据位与校验位中
1
的个数为奇数。偶校验:数据位与校验位中1
的个数为偶数。(当然也可以进行无校验传输)④ 停止位:之后发送的是停止位。停止位可以是 1、1.5 或 2 位的逻辑
1
信号。在传送完成一个字符(一帧数据),即发送完规定的停止位之后,到开始传送下一个字符(一帧数据)之间,可以有任意的空间间隔,这个空闲间隔用逻辑1
信号表示。(正因为这种通信方式中两个字符的间隔是任意的,因此称为串行异步通信方式)
●
● 数据帧格式如下: ●
说明 :传输时,数据位是逆序传送。
2.4.2 通信速率
● 在数据通信中,往往使用 “数据通信速率” 的概念。
● 严格地说,数据通信中 “数据信号速率” 和 “数据通信速率” 是两个不同的概念。
● 1/s
。(故它又被称为 “波特率” 或 “信号速率” )
● 1bps
或1b/s
。(故它又被称为 “比特率” 或 “通信速率”)
● 本章中,所涉及的穿行数据通信均使用二进制信号传输(这时两者在数值上是相等的),因此并未严格区分
● 收、发双方的数据帧格式也必须一致。
2.4.3 信号的调制和解调
● 数据通信传输的是300 ~ 3000
Hz ,因此若直接传输数字信号,信号就要发生畸变。如下图所示:(红色波形信号)
● 因此,需用调制器将数字信号转换成模拟信号(不易发生畸变) ——> 再传输 ——> 再用解调器将其转换成数字信号。
● 图中的 “MODEM” 即是调制解调器,是一种计算机硬件。功能:既能调制信号,又能解调信号。如下图所示:【腾达d820b adsl2调制解调器 modem 上网猫 宽带猫 电信猫 电脑猫】
●
2.4.4 串行通信接口标准 —— RS232C标准
● 要进行串行通信,还要解决一个问题:
● 若要进行以上操作,那么这个接口的 机械特性、电气特性、功能特性 都要遵循一定的规范,也就是要遵循一个标准。
● 目前计算机通信使用最普遍的是 “
2.4.4.1 控制信号的定义(机械特性)
● 9
针和·25
针两种连接器,符合 RS-232C 接口标准。如下图所示·:
● 在微型计算机异步通信中常用的只有9
个引脚,下表给出了计算机异步通信接口常用的 RS-232C 信号标准:【9
针的串行接口
2.4.4.2 信号电平标准(电气特性)
● 1
” 信号,电平在–3V ~ -15V
之间;逻辑 “0
” 信号,电平在+3V ~ +15V
之间。因此,使用 RS-232C 与微机接口时,需要将 TTL 电平(0 ~ 5V
)与 RS-232C 电平进行转换。
● 可用现成的转换芯片(如MC1488、MC1489等)转换,它俩的
●
三、可编程串行异步通信接口芯片 8250 ⭐️⭐️
● 40
个引脚,双列直插式封装,使用单一的+5V
电源。【
3.1 8250 的内部结构
● 8250 内部包括数据总线缓冲器、发送器、接收器和调制解调控制电路等等。【就好比,一个政府机构,不仅有服务大厅、发送和接受情报的信息部等等】,它的内部结构图如下:
●
①
8250 —— 数据总线缓冲器 :接收来自 CPU 的各种控制信息,从而确定操作方式。②
8250 —— 选择和控制逻辑 :他是 8250 和 CPU 之间的数据通道。③
8250 —— 发送器 :由 “发送保持寄存器”、“发送移位寄存器” 和 “发送同步控制” 这3
部分构成。 [1] 发送保持寄存器:装载待发送的数据。 [2] 发送移位寄存器:数据发送时,“发送保持寄存器” 内的内容会自动转到这里面。 [3] 发送同步控制:能将 “发送移位寄存器” 里的内容添加起始位、校验位和停止位,并将数据转换为串行数据,经SOUT
引脚发送出去。④
8250 —— 接收器 :由 “接收移位寄存器”、“接收缓冲寄存器” 和 “接收同步控制” 这3
部分构成。 [1] 接收同步控制:能将来自引脚SIN
的串行数据逐位存入接收移位寄存器,并在存入的过程中进行自动校验,并去掉起始位、停止位和校验位。 [2] 接收移位寄存器:会自动将其内部的数据内容转到 “接收缓冲寄存器”。 [3] 接收缓冲寄存器:装载接收的数据,等待 CPU 读取。⑤
8250 —— 调制解调控制电路 :使 8250 可直接与调制解制器相连的控制电路,以完成远程通信任务。⑥
8250 —— 通信线控制寄存器 :指定串行通信的数据格式。⑦
8250 —— 通信线状态寄存器 :提供串行数据发送和接收时的状态,供 CPU 读取和处理。⑧
8250 —— 波特率发生控制电路 :由波特率发送器、存放分频系数低位和高位字节的除数寄存器 构成。 ● 对 ⑧ 的补充说明:8250 使用的是频率为1.8432MHz
的基准时钟输入信号,通过内部分频产生发送器时钟和接收器时钟。发送器时钟和接收器时钟的频率是 “数据传输波特率” 的16
倍。⑨
中断控制逻辑 :由中断允许寄存器、中断识别寄存器和中断控制逻辑3
部分组成。它主要对中断优先权、中断申请等进行管理。
3.2 8250 —— 内部10 个重要的寄存器
● 10
个,分成3
类
●
3.2.1 第一类:数据传输(有 2 种)
3F8H
/2F8H
)
3F8H
/2F8H
)IN
指令读接收缓冲寄存器
3.2.2 第二类:控制字寄存器 (有 4 种) ──> ④ MODEM 控制寄存器⭐️⭐️⭐️
3FBH
/2FBH
)
●
●
EG:
MOV DX, 3FBH ; 先把 (主串口)控制字寄存器 的地址交给 DX
MOV AL, 80H ; 再把 1000 0000B 传给 AL 【D_7 = 1 表明后面将会写入合用端口的数据,并传给除数寄存器。】
OUT DX, AL ; 将 AL 的数据传给地址端口为 DX 的寄存器
MOV DX, 3F9H ; 把 除数寄存器(高 8 位)的地址交给 DX
MOV AL, N ; 把 N 这个数据写入 AL
OUT DX, AL ; 将 AL 的数据传给地址端口为 DX 的寄存器
●
EG:
MOV DX, 3FBH
MOV AL, 01111111B ; D_7 = 0 表明后继将会写入合用端口的数据,并传给非除数寄存器。
OUT DX, AL
MOV DX, 3F8H ; 3F8H 正好对应的是 "发送保持寄存器", 前提是用 OUT。如果是 IN, 才是 “接收缓冲寄存器”
MOV AL, N
OUT DX, AL
8
位对应——3F9H
/2F9H
,低8
位对应——3F8H
/2F8H
)16
位,由高8
位寄存器和低·8
位寄存器组成。 ▶
● 8250 对1.8432MHz
的时钟输入,采用分频的方法产生所要求的 “发送器时钟信号” 和 “接收器时钟信号”,分频系数(即下图的除数)由程序员分两次写入,分别写入除数寄存器的高8
位和低8
位。(注:高8
位送入 MSB ,低8
位送入 LSB ) 除 数 ( 分 频 系 数 ) = 1843200 波 特 率 × 16 除数(分频系数) = \frac{1843200}{波特率\times 16} 除数(分频系数)=波特率×161843200
●
◆ 1
,然后分别写入除数寄存器的高8
位和低8
位。
3F9H
/2F9H
)
◆ INTPTR
信号。
● 该寄存器的 D7 ~ D4 位恒为0
。D3 ~ D0位表示 8250 的4
级中断是否被允许。 [1] D0=1,允许接收到一帧数据后,内部提出 “接收中断请求” 。 [2] D1=1,允许发送保持寄存器空时,内部提出 “发送中断请求” 。 [3] D2=1,允许接收出错时,内部提出 “接收数据错中断请求” 。 [4] D3=1,允许 MODEM 状态改变时,内部提出 “MODEM中断请求” 。
3FCH
/2FCH
)
[1] D0 位=1,使引脚 D T R ‾ = 0 \overline{DTR} = 0 DTR=0,从而使 RS-232C 引脚 D T R ‾ \overline{DTR} DTR 为0
。 [2] D1 位=1,使引脚 R T S ‾ = 0 \overline{RTS} = 0 RTS=0,从而使 RS-232C 引脚 R T S ‾ \overline{RTS} RTS 为0
。 [3] D2 位=1,使引脚 O U T 1 ‾ = 0 \overline{OUT_1} = 0 OUT1=0,PC 系统机上没有使用。 [4] D3 位=1,使引脚 O U T 2 ‾ = 0 \overline{OUT_2} = 0 OUT2=0,8250 能送出中断请求。 [5] D4 位通常置0,设置8250工作在正常收/发方式。(若 D4 位置1
,则 8250工作在内部自环方式,即发送移位寄存器的输出在芯片内部被回送到接收移位寄存器的输入。这样的话,我们就能编写程序测试 8250 的工作是否正常,即进行内环自测) [6] D7 ~ D5 位恒为0
。
●
● INTRPT
的输出控制,如下图所示:
● 1
(用 8250) [2] MODEM 控制寄存器 D3 = 1,即 O U T 2 ‾ = 0 \overline{OUT_2} = 0 OUT2=0,打通 8250 的中断请求通道。(用 8250) [3] 825 9相应中断屏蔽位置1
。(用 主8259 的 IR3、IR4) [4] CPU 处于开中断。(用STI
指令)
●
[1]
内环 :自动将发送移位寄存器和接收移位寄存器短接。 [2]外环 :人为将 RS-232 接口芯片端子2
和端子3
用线连接起来。属正常通信
3.2.3 第三类:状态寄存器(有 3 种)
3FDH
/2FDH
)
[1] D0 位:接收数据准备好(接收缓冲器满)标志位。【D0 = 1 表示接收器已接收到一帧完整的数据,并已转换成并行数据,存入接收缓冲寄存器。(CPU接收数据时一定要查询)】 [2] D1 位:溢出错标志位。【D1 = 1,表示接收缓冲器中的字符未取走,8250 又接收到新输入的数据,造成前一数据被破坏】 [3] D2 位:奇偶错标志位。【D2 = 1,表示收到的数据有奇偶错】 [4] D3 位:帧错(接收格式错)标志位。【D3 = 1,表示接收的数据没有正确的停止位】 [5] D4 位:线路间断标志位。【D4 = 1,表示收到长时间 “0” 信号(即中止信号)】 [6] D5 位:发送保持寄存器空闲标志位。【D5 = 1,表示数据已从发送保持寄存器转移到发送移位寄存器,发送保持寄存器空闲,CPU可以写入新数据。当新数据送入发送保持寄存器后,D5 置0
】 [7] D6 位:发送移位寄存器空闲标志位。【D6 = 1,表示一帧数据已发送完毕。当下一个数据由发送保持寄存器移入发送移位寄存器时,该位被置0
】 [8] D7 位:恒为0
。
●
● 1
时,如相应的中断允许位也为1
,则: [1] D0 = 1 , 产生接收中断 [2] D5 = 1 , 产生发送中断 [3] D1 ~ D4 = 1,产生 “字符错” 中断
●
EG:
MOV DX, 3FBH ; 先把 (主串口)控制字寄存器 的地址交给 DX
MOV AL, 80H ; 再把 1000 0000B 传给 AL 【D_7 = 1 表明后面将会写入合用端口的数据,并传给除数寄存器。】
OUT DX, AL ; 将 AL 的数据传给地址端口为 DX 的寄存器
MOV DX, 3F9H ; 把 除数寄存器(高 8 位)的地址交给 DX
MOV AL, N ; 把 N 这个数据写入 AL
OUT DX, AL ; 将 AL 的数据传给地址端口为 DX 的寄存器
●
SCANT:
MOV DX, 3FDH ; 先把 (主串口)通信线状态寄存器 的地址交给 DX
IN AL, DX ; 把地址端口为 DX 的寄存器内的数据 → AL
TEST AL, 20H ; 20H = 00100 000B, 该行代码功能: 检测 D_5 位是否为 1 [即查询 发送保持寄存器 是否空闲]
JZ SCANT ; 不空闲就转 SCANT, 空闲就执行下一句(即D_5 = 1),
MOV DX, 3F8H ; 把 (主串口)发送保持寄存器 的地址交给 DX
MOV AL, 'A'
OUT DX, AL
●
SCANR:
MOV DX, 2FDH ; 先把 (辅串口)通信线状态寄存器 的地址交给 DX
IN AL, DX ; 把地址端口为 DX 的寄存器内的数据 → AL
TEST AL, 01H ; 01H = 0000 0001B, 该行代码功能: 检测 D_0 位是否为 1 [即查询 接收缓冲寄存器 是否空闲]
JZ SCANR ; 不空闲就转 SCANT, 空闲就执行下一句(即D_0 = 1)
MOV DX, 2F8H ; 把 (辅串口)接收缓冲寄存器 的地址交给 DX
IN AL, DX
3FAH
/2FAH
)
● 0
。 [2] D0 位表示有无中断待处理。【D0 = 1 表示没有中断待处理;D0 = 0 表示有中断待处理】 [3] D2 ~ D1 位表示4
种中断源识别码,其代表的中断源如下表所示:
●
MOV DX, 3FAH
IN AL, DX
CMP AL, 0
JZ "MODEM中断"
CMP AL, 2
JZ "发送中断"
CMP AL, 4
JZ "接收中断"
CMP AL, 6
JZ "字符错中断"
3FEH
/2FEH
)
● 4
个输入引脚的状态电平
●
3.3 8250 的初始化编程
● 80H
→ 通信线控制寄存器,使寻址位为1
。 [2] 确定通信速率:将除数高8
位/低8
位 → 除数寄存器高8
位/低8
位。 [3] 规定一帧的数据格式:将 D7 = 0 的控制字写入通信线控制寄存器。 [4] 设置中断允许控制字:若采用查询方式,则置0
;若采用中断方式,则置1
。 [5] 设置 MODEM 控制寄存器:若采用查询方式,则 D3 置0
;若采用中断方式,则 D3 置1
;若采用内环自验:则 D4 置1
;若为正常通信,则 D4 置0
。
●
● 分析: (1)∵ 速率 = 1200 波特,∴ 分频系数 = 1.8432M /(16 × 1200)=0060H(可以用计算器算,也可查表得到) (2)一帧数据结构命令字:0000 0011B = 03H (3) 中断允许命令字 = 0 (4) MODEM 控制字 = 0001 0000H = 10H
● 初始化子程序如下:
I8250 PROC ;----"设置寻址位 = 1"---- MOV