上次我们用USB实现了虚拟串口通信,但是事实上和常规的串口通信有很大的区别。本期我们从串口通信的 数据链路层
介绍串口通信协议。串口通信主要要解决四个问题:
1.单条通讯线上的数据如何同步。
2.接收方如何知道数据的起始。
3.时钟偏移如何解决。
4.数据准确性检验。
1
数据同步
在异步串口通信中,数据是通过一串高低电平的变化(即电平信号)来传输的。由于串口并没有时钟信号(CLK)为发射设备和接收设备进行信号同步的。
无法直接的从一段连续的高低电平中知道到底有多少个0和多少个1,发送端和接收端必须在预定的时间间隔内保持同步,以确保接收到的数据可以被正确地解码。即利用波特率让接收端知道,多少时间间隔后需要进行一次读取电平。
这样子我们就解决了如何实现数据传输同步性的问题 。
2
如何开始
我们解决完数据同步性问题后,下一个需要解决的事情如何让接收端知道哪里是数据传输的开始。
对此,串口协议使用的方式是,让串口在不工作的状态下保持高电平(空闲)。当需要数据传输时,先 拉低通讯线
,持续一个间隔时间(1/波特率)之后再持续发送八位数据,这样子接收端就知道什么时候是数据的开始。
3
时钟不同步
然而,再传输过程中由于时钟的偏差,在少数的数据传输过程中并不会体现,但是经过时间的积累中会导致偏差的积累,可能导致数据读取时候的偏移。
为了解决这个问题,我们可以在通讯协议中添加停止位,串口协议规定,在数据传输结束后可以设置停止位(通常为1位),这样子就可以让接收方在收到停止位之后等待下一个开始位,就不会出现时钟偏移的情况了。
4
数据校准
为了确保数据可靠性,我们可以在数据传输中添加校验位,通常采用的是奇偶校验,即数据中1的个数为奇数,校验位则为1。为偶数,校验位即为0。
恭喜你:发明了串口通信!
下期我们再解释一下为什么虚拟串口可以不用调节波特率