
(Alan Formy-Duval, CC BY-SA 4.0 )
串行通信
计算机与外部设备的通信方式有两种,一是并通信、二是串行通信。
串行通信有:单工、半双工(常用)、全双工。速度可以用波特率度量,其单位为 位每秒——bps
串行通信又可以分为两种:同步、异步。异步通信:以字符(或字节)为单位组成数据帧进行的传送称为异步通信。一帧数据可由:起始位、数据位、可编程校验位、停止位。
同步通信:数据以块为单位连续进行的传送称为同步通信。在发送第一块数据时,首先发送同步信号,保证发送器和接收器之间的同步。之后发送的连续的数据块中,就不需要再发送同步信号了。
串行口控制器
内部结构
C51 内部有一个可编程的全双工串行通信接口,也可以用作通用异步接收/发送器、同步位移寄存器。它可以设置不同的数据格式(8、10、11 位)、波特率,并通过 RXD(P3.0)和 TXD(P3.1)与外界通信。
其接口由数据缓冲器 SBUF、串行控制寄存器 SCON、接收位移寄存器、发送控制器、接收控制器组成。并且,其还与定时器 T1 和单片机内部总线相关。
两个 SBUF 在物理上相互独立,但具有共同的地址 99H,通过读写指令来区分 SBUF。
发送控制器的作用是,在门电路和 T1 的配合下,将 SBUF 中的并行数据,转为串行数据,并自动添加起始位、可编程为、停止位。这一过程结束后,中断请求标志位 TI=1,用以通知 CPU 将 SBUF 中的数据输出到 TXD(P3.1)引脚。
接收控制器的作用是,在接收移位寄存器、T1 的配合下,使来自 RXD 的串行数据,转换为并行数据,并自动消除起始位、可编程位、停止位。这一过程结束后,将 RI =1,通知 CPU 将 RXD 中接受的数据,保存到 SBUF 中。
单片机在接收数据时,需要通过移位寄存器、接收控制器的双重缓冲。这样可以防止 CPU 因为及时将第一帧数据读走,而引起两帧数据重叠造成的 error。
定时器 T1 的作用是产生用以收发过程中,节拍控制的通信时钟。下降沿将数据移位;上升沿对应数据位采样。
串行口控制寄存器
用于串行通信的两个 SFR 有:SCON、PCON
SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI
TB8、RB8:发送、接收数据位第九位。
REN:允许和禁止接收控制维。REN=1 时为允许接口接收数据。
SM2:多机通信控制位。
SM0、SM1:决定串行口通信工作方式。
SM1SM0 | 工作方式 | 说明 |
---|---|---|
00 | 工作方式 0 | 8位同步位移寄存器 |
01 | 工作方式 1 | 10位同步位移寄存器 |
10 | 工作方式2 | 11位同步位移寄存器 |
11 | 工作方式 3 | 11位同步位移寄存器 |
PCON:SMOD(位7)
SMOD——波特率选择位。
C51 单片机的串行通信口以 T1 为波特率发生器。T1 溢出脉冲可以有两种分频——16/32分频。波特率的计算公式如下:
不用于串行通信,而用于——扩展接口,具体电路如下:
此时:RXD 作为数据的发送/接收端口;TXD 作为时钟(十二分频晶振)的输出端。利用下面的代码,即可操纵流水灯:
#include<reg51.h>
void delay() { //延时
unsigned int i;
for (i=0; i<20000; i++) {}
}
void main() {
unsigned char index, LED; //定义LED指针和显示字模
SCON = 0; //设置串行模块工作在方式0
while (1) {
LED=0x7f;
for (index=0; index < 8; index++) {
SBUF = LED; //控制L0灯点亮
do {} while(!TI); //通过TI查询判别数据是否输出结束
LED = ((LED>>1)|0x80); //左移1位,末位置1
TI=0;
delay();
}
}
}
工作方式 1~ 3 都是用于串行通信的。工作方式 1 输出 10 位的数据,通常用于点对点通信,采用 3 线式连接。即 RXD 对 TXD、TXD 对 RXD、地对地。
首先是设置通信时钟波特率:
之后,设置波特率发生器 T1。通过 TMOD(GATE C/T M1 M0)设置工作方式,通过 TH1 TL1 设置预设值;通过 PCON(SMOD,不可为寻址)设置波特率选择位。
设置 SCON(RI TI REN SM0 SM1)设置工作方式等。
数据经过 TXD(P3.1)发出,通过 RXD 和 接收移位寄存器缓冲输入。
一般波特率发生器 T1 以工作方式 2 为主。也即:
特点:
一般用于双机通信。
一般用于多机通信。结合了 工作方式 1可以设置波特率的优点,又结合了工作方式 2 可以通过 SM2 实现多机通信。
主机发送数据时,需要向所有的单片机都发送数据。但是,在发送第一帧数据之前,需要将目标从机的地址数据发送给所有从机,称为地址信息。地址信息的第九位为 1,数据信息的第九位为 0。
从机在收到地址信息后,由于 RB8=1,所以无论如何都可以触发 RI = 1,也就是触发中断。在中断程序中,从机对比信息地址以及自身的地址,若匹配,则使得 SM2 = 0。若不符合,则设置 SM2 = 1。
由于数据信息的第九位为 0,那些地址不匹配(SM2=1)的从机,就会拒绝主机发出的数据信息。从而,实现主机到目标从机的信息传递。
数据通信方式
分为并行通信和串行通信。并行通信:利用多条数据线将各位同时发送,特点是传输块,适于短距离通信;串行通信:利用一条线路将数据一位一位的顺序发送,特点是线路简单成本低,适于远距离通信。
串行通信数据传送方式
串行通信分为同步和异步两种。
进行异步通信的单片机的时钟相互独立,其频率可以不同,在通信时不需要有同步时钟信号。由于异步通信时逐帧进行传输,各位之间的时间间隔必须相同,所以保证两片单片机有相同的传输波特率。当传输波特率误差超过5%,就不能正常通信。帧与帧之间的时间间隔是任意的,间隙为高电平。由于异步通信每传送一帧有固定格式,双方按照约定格式来发送和接收,硬件结构比同步通信简单,还能利用校验位检测错误。单片机中广泛采用异步通信方式。
同步通信要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此外传输数据的位之间的间距均为“位间隔”的整数倍,同时发送的字符间不留间隙,即保持位同步也保持字符同步。串行通信的传输方向
- 单双工:数据始终是A发送到B;
- 半双工:既能从A发送到B,也能从B发送到A,但任何时候不能在两个方向同时传送,即每次只能一个设备发送,另一个设备接收;
- 全双工:允许通信双方同时进行发送和接收。
串行通信的传输速率
是指数据传送的速度,用b/s或bps(比特/秒)表示,简称比特率。在二进制下,比特率与波特率数值相等,因而在单片机的通信中常称为波特率。
数据通信协议
通信双方约定的一些规则。
异步通信数据格式:空闲位、起始位、奇偶校验位、停止位。
异步串行通信协议
1位起始位--8位数据位--1位校验位-1位停止位
- 起始位:先发一个逻辑“0”信号,表示传输的开始
- 数据位:紧接着起始位,从低位开始传动,发送速率靠时钟确定
- 停止位:数据位加上这一为使得“1”的位数为偶数(偶校验)或奇数(奇校验),以此来校验数据的正确性
- 停止位:一个字符数据的结束标
- 空闲位:处于逻辑“1”状态,表示当前线路没有数据传输。
RS-232
RS-232接线方式有全串口接线、3线接线(RXD、TXD、GND)
RS-232能够可靠进行数据传输的最大距离为15米,传输速度一般可达到115200bps甚至更高,标准接口能够提供的传输速度主要有以下波特率:1200、2400、4800、9600 、19200 、38400 、57600 、115200 。UART原理
通用异步收发器简称UART,用来传输串行数据。
- 发送时:CPU将并行数据写入UART,UART按照一定的格式在一根线上串行发送数据;
- 接收时:UART检测另一根线上的信号,收集串行数据放在缓冲区中,CPU即可读取UART获取这些数据。
发送数据前UART之间要约定好波特率、数据传输格式。UART使用标准的TTL/CMOS逻辑电平来表示数据,为了增强数据的抗干扰能力,提高数据传输距离,通常将TTL/CMOS转换成RS-232逻辑电平。
数据传输流程
- 平时数据处于“空闲”状态(1状态);
- 当要发送数据时,UART改变TXD数据线的状态(变为0状态)并维持1位时间(开始位),接收方检测到开始位后,一位一位检测数据线的状态得到传输的数据;
- UART一帧中可以有5、 6 、7 或者8位数据,发送方按位改变数据线的状态将数据发送出去,首先发送最低位;
- 如果用校验位,UART在发送完数据位后,还要发送1位校验位再发送停止位,数据线恢复到“空闲”状态(1状态)。
UART驱动程序设计
串口初始化 数据发送功能 数据接收功能
初始化
linux串行通信信号
作为系统工程师,我在数据中心花费大量时间来配置服务器和其他计算机设备。 我在工具箱中保留的两个项目是RS-232串行USB转换器和标准DB-9串行电缆。 当您无法通过其他方式访问设备时,这些可能是必不可少的。 您可能需要部署尚未为您的网络配置的新路由器。 您可能需要对通过SSH无法访问的防火墙设备进行故障排除。 特别是在“熄灯”环境中,新服务器可能具有需要初始化的管理卡。 串行连接提供了用于完成这些任务的控制台的直接路径。
(Alan Formy-Duval, CC BY-SA 4.0 )
在此示例中,我将使用Netgate设备。 这些是不具有鼠标,键盘,监视器或其他GUI功能的防火墙。 它们通常被称为“无头”。
(Alan Formy-Duval, CC BY-SA 4.0 )
串行通讯
要通过串行连接设备,您需要支持RS-232协议的硬件。 这通常是一个9针DB-9串行端口,通常标记为串行,通信或控制台。 大多数较旧的计算机至少有一台。 大多数服务器仍具有它们,但大多数笔记本电脑和台式机不再具有它们。
(Alan Formy-Duval, CC BY-SA 4.0 )
查找串口
如果您的系统还没有串行端口,则需要使用我提到的转换器。 当您将PL2303转换器插入计算机上的USB端口时,Linux内核会将其注册为USB TTY设备。
您可以使用几个命令来查询系统的串行端口配置。 这里有一些例子:
# dmesg |grep tty
[ 252464.891372 ] usb 6 - 1 : pl2303 converter now attached to ttyUSB0
# setserial -g /dev/ttyUSB[0123]
/ dev / ttyUSB0, UART: 16654 , Port: 0x0000, IRQ: 0
# ls /dev/serial/by-id/
usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0就我而言,它将转换器检测为pl2303转换器(或Prolific Technology USB串行控制器)。
连接串行电缆
将串行电缆连接在转换器和设备上的串行端口之间。
(Alan Formy-Duval, CC BY-SA 4.0 )
用Tio登录
多年来,我使用了不同的工具,例如Minicom和Screen。 Tio是一种更新和更简单的工具,被描述为“一个简单的TTY终端I / O应用程序”。 它在大多数Linux发行版,FreeBSD和OpenWRT以及Snap软件包中都可用。 我使用标准的打包工具将版本1.32安装到我的Red Hat Enterprise Linux 8.1服务器上:
# dnf info tio
# dnf install tio使用tio命令初始化连接。 根据我的经验,Tio不需要任何高级配置; 它开箱即用。 确保您具有正确的设备路径,如上所示:
# tio /dev/ttyUSB0
# tio /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0Ctrl + t命令序列可与Tio进行交互。 例如, Ctrl + t +? 将列出可用的命令,然后按Ctrl + t + q退出Tio,并带您回到Linux命令提示符。(Alan Formy-Duval, CC BY-SA 4.0 )
结论
这些天我们很少考虑甚至使用串行通信,但是它仍然很有用。 数据中心人员仍然需要熟悉它。
数据中心可以位于远程,一旦进入,您将需要确保拥有所有适当的工具。 当然,除了一台好的Linux笔记本电脑外,我还建议您在必要时使用上述各项来管理那些启用了串行功能的设备。
linux串行通信信号
例:
用
8051
单片机串行口外接
CD4094
扩展
8
位并行输出口,
如图所示,
8
位并行口的各
位都接一个发光二极管,要求发光管呈流水灯状态。
串行口方式
0
的数据传送可采用中
断方式,也可采用查询方式,无论哪种方式,都要借助于
TI
或
RI
标志。串行发送时,能
靠
TI
置位
(
发完一帧数据后
)
引起中断申请,
在中断服务程序中发送下一帧数据,
或者通过
查询
TI
的状态,只要
TI
为
0
就继续查询,
TI
为
1
就结束查询,发送下一帧数据。在串行
接收时,则由
RI
引起中断或对
RI
查询来确定何时接收下一帧数据。无论采用什么方式,
在开始通信之前,
都要先对控制寄存器
SCON
进行初始化。
在方式
0
中将,
将
00H
送
SCON
就能了。
-----------------
单片机串行口通信程序设计列子
--------------------------
ORG 2000H
START: MOV SCON,#00H ;
置串行口工作方式
0
MOV A,#80H ;
最高位灯先亮
CLR P1.0 ;
关闭并行输出
(
避象传输过程中,各
LED
的
"
暗红
"
现象
)
OUT0: MOV SBUF,A ;
开始串行输出
OUT1: JNB TI,OUT1 ;
输出完否
CLR TI ;
完了,清
TI
标志,以备下次发送
SETB P1.0 ;
打开并行口输出
ACALL DELAY ;
延时一段时间
RR A ;
循环右移
CLR P1.0 ;
关闭并行输出
JMP OUT0 ;
循环
说明:
DELAY
延时子程序能用前面我们讲
P1
口流水灯时用的延时子程序,
这里就不给出