作为一个底层软件开发工程师,经常会碰到RS232、RS485和TTL这一类的问题。之前总是碰到问题之后Google一下,把当下的问题解决了之后就不管了,过个一两天就忘得一干二净,结果后续每次都会碰到类似的问题,都是从零开始地去解决,这种方式看起来当时快速解决了问题,结果在后续的开发中浪费了更多的时间。
为了解决这个问题,博主决定一次性把这些东西给弄清楚
串行通信
串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。
其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的短距离通信。
串行通信在传输方式上分为同步通信和异步通信,在传输方向上分为单工通信,半双工通信,全双工通信。
同步通信
顾名思义,同步通信需要通信双方进行数据同步,一般表现为通信双方在时钟线上的统一,双方在在数据的收发上是同时的,根据时钟线的跳变来操作数据线实现发送(读取),常用的同步协议有SPI I2C。
异步通信
异步通信不需要建立数据同步即可传输数据,发送方按照一定的协议格式来发送数据,接收方接收到数据再根据协议进行解析,双方的收发不需要同时进行,也不需要进行传输时的校验,RS232,485和UART就属于这一类。
同步通信和异步通信的比较
在这里,我们不妨可以先思考一下,同步通信和异步通信最根本的区别是什么?
同步通信,通信双方遵循相同的时钟,每一个帧数据的收发都是需要经过双方共同确认,然后再进行下一帧传输。
而异步通信则不然,在发送发看来,需要发送数据的时候,只负责把数据发出去就行了,接受方到底收没收到或者怎么解析不需要发送方操心。
从上述的原理上的区别出发,我们以发送0x55(01010101b)为例,可以发现两者通信的区别:
在同步发送中,数据线上只需要根据时钟发送数据01010101,接收方同时也可以根据时钟来解析收到的数据。
但是在异步发送中,因为没有时钟同步,如果发送方仅仅将数据01010101发送出来,接收方无法解析接收到的数据。原因有两个:
接收方不知道数据是以一个什么样的间隔时间发送过来的,可能发送方的时钟频率和配置决定了发送为1bit/us,但是接收方的时钟配置不一致,就出现解析错误。
接受方无法判