USART(Universal Synchronous Asynchronous Receiver and Transmitter)
通用同步异步收发器
首先简单的理解一下,这个所谓的通用同步异步收发器,我们一般把它理解为串口,它是单片机里面的一个外设,是一个设备,收发器。作为串口,它会引出两个引脚,一个是RX一个是TX。至于我们用这个RX和TX来遵循哪种协议来开发串口收发,如用232还是485,那是之后的事。
我们来看野火的这张图,以RS232协议为例。
图中的控制器A和控制器B就是单片机的收发器,两根蓝色的箭头,其实就是收发器的RX和TX线。也就是说我们在用单片机使用USART这个设备的时候,在配置好了以后,只是让收发器工作。并没有关心232协议还是485协议。怎么按照232协议和485协议工作,是另外的工作。
上文说到,USART只是提供了RX和TX线,在配置好了USART之后,只是让TX可以发送数据,RX可以收发数据。至于用的什么协议还没搞好。通常协议分为硬件层和软件层去理解。那么从这两层分别去理解RS232协议和RS485协议。搞清楚在USART是如何实现的不同协议的串口通信的。
RS232协议
硬件层
仍然以野火的图为例来说,从控制器A出来的RX和TX线会接到电平转换芯片上,这里会有疑问,为什么要接转换芯片呢?这个就是RS232协议规定了!
怎么理解呢?为什么不直接让控制器A的RX和控制器B的TX连接,控制器A的TX和控制器B的RX连接?笔者的理解是,应该是可以连接的,但是是不是能保证十米通信距离呢?毕竟从单片机出来的信号是TTL电平信号,你十米左右信号到了还能保证信号准确吗?另外双方没有个互相认同的发送接受方式,怎么知道哪些数据有效哪些数据是没用的。说白了,别人RS232就是把这些想好了,硬件层,想好在十米的距离多少电压的信号能稳定传输,软件层,想好了什么信号是开始(起始位),什么信号是数据(数据位),什么信号是结束(终止位),什么信号确定信号是准确与错误的(校验位)。这么说应该算比较通俗的解释了协议的意思了吧。
好了,明白为什么要遵守协议了。那么继续讲在硬件层要遵守协议的什么“规矩”。
继续看图,接了一个电平转换芯片,就是将单片机出来的TX信号(TTL电平)转换位RS232需要的电平(暂且就称为RS232电平):
电平类型 | 电平标准 |
TTL电平(单片机引出) |
逻辑1:2.4V~5V 逻辑0:0V~0.5V |
232电平(单片机经过电平转换芯片) |
逻辑1:-3V~-15V 逻辑0:3V~15V |
通过电平转换芯片之后,如图的两根红箭头,其实就是满足了协议后的RX和TX线了。
往后就是DB9接口,其实就是老式的串口接头,在台式机上很常见。如下图:
从PC主机上出来的这种叫公头,开发板的叫母头,接上串口线,物理层就完成了。
但是显然,这种接口已经逐渐淘汰了,如笔者拍的这个照片,在公司找了几台PC才找到这个口。
以野火的开发板为例,已经改为miniUSB转串口了。也就是说从电平转换芯片出来的RX和TX线直接连在一个miniUSB的接头上。如果单片机要与PC通信,只需要一根USB线,USB头接PC机,miniUSB接单片机,物理层的接线就满足要求了。如下图所示:
红色框出的就是单片机的miniUSB端,绿色框出的就是PC端的USB端,物理连接完成。
软件协议层
软件协议层规定的是在硬件线路层传输的电平,怎么规定的看下图:
有四个需要注意的:
1.起始位:
以一个bit时长的逻辑0电平为起始位
2.数据位
数据位为5~8位长,一般为8位
3.校验位
有多种校验方式:奇校验、偶校验、0校验和1校验,不展开讲
4.停止位
以0.5、1、1.5、2个bit时长的逻辑1电平为停止位
以上就是发送数据帧的格式,也就是说在RS232协议下,你只有发这样格式的数据帧,才会被识别,才能接收到正确的数据,否则就会出现接收错误,要么是乱码,要么啥也没有。
另外要补充一点就是,异步串口通信没有时钟同步,规定是用波特率来作为发送的时钟,也就是单位时间内发送的码元个数,比如常用的9600、115200,就是说一秒发送9600个码元,理解成9600个bit就行了。
再补充一点,在起始位中有说到1bit时长的逻辑0电平,这里说的1bit时长,其实就是说的一个码元持续时间,也就是1/9600(1/115200)秒的时长。
其他协议简单理解
串口协议除了RS232还有如RS422和RS485,其实这些所谓的协议,已经分成了硬件层和软件层,不同之处也就从这两个层面来区分。硬件层不同无非是连线和电压的不同。例如RS232协议,通过电平转换芯片的作用,使得发送和接收线的电压从TTL电平转换成了RS232的电平;而RS485协议,在经过电平转换芯片后从TTL电平转换成了差分信号,也就是AB线之间的差值。那么我们简单理解,硬件层,由于USART收发器从MCU就引出了两个引脚线(RX和TX),那么我们能做文章的也就是外面的转换芯片了。不管是RS232还是RS485都会有一个电平转换芯片,将USART提供的两条线作为芯片的输入引脚,芯片的输出引脚怎么用,看芯片手册就知道了。当然RS485芯片还需要一个引脚来作为发送接收功能的使能脚。但大体就是以上描述了。
那么我们在编程应用的时候要做的是什么?
1.做好USART的设置,包括波特率、数据位长、停止位长、校验模式、工作模式(收\发)、USART中断、写好中断处理函数等等。
2.写好发送接收接口。
就这!没别的了。
写到这里,只是对USART收发器的一个概念的理解,后面会从编程的角度出发进行总结。