在小伙伴学习嵌入式的时候,往往都会对各类协议的理解和想象搞得很是头疼,因为这类实物我们实在难以看到,往往也是通过各类仪器看到一些曲曲折折的线段组成,但依旧不能形成很完善的印象,在这里呢,我就简单的打个比喻,方便大家去理解协议这一个概念,其实物理器件与器件之间进行交流(数据传输)就相当于我们和周围朋友进行聊天一样,大家如果都说着各自的方言,那么显然一定会造成沟通上的障碍,要么会错意思,要么曲解意思,因此,如果大家能够统一语言,是不是就可以完成两个人之间的无障碍沟通了,你说的我懂,我讲的你明白,这样就皆大欢喜,放在物理器件中,也是一样的道理。
协议,可以通俗理解为器件与器件之间的方言(通讯规则),当然,器件又不能完全和人类进行沟通一样,所以,需要先规定,器件A给器件B发送一个数据,那么第一个数据代表几个意思,然后每个意思怎么样去识别,第二个、第三个......如此下去,只要A器件按照这个规则发送数据,那么B数据只需要识别第一个数据的意思,那么这样就实现了数据的接受与发送。我们以串行通信为例
现在的A器件要给B器件发送数据,两个设备通过一条数据线连接(规则),然后A设备每次只能发送一个比特位的数据,然后发送多次连续的比特位数据(规则),这里要注意,因为硬件里有时钟,所以每一个比特位的数据需要的时间是固定的。(规则),
那么到这里了,就需要考虑一个问题,这么多比特位如何组合呢,所以,还规定发送数据的顺序以及如何组合的格式。
以上这个图叫做——时序图
意思就是器件之间既然要统一方言(协议规则),那么方言怎么说呢?就需要规定,A器件先发送什么,后发送什么,再发送什么,这样B器件也就按照先接受什么,再接受什么,最后接收什么的样式进行数据发送
起始位:指示数据传输开始的信号位,通常为逻辑低电平。
数据位:每个数据传输单元中实际的数据位数,通常为8位。
奇偶校验位:可选的位,用于验证数据的正确性。
停止位:指示数据传输结束的信号位,通常为逻辑高电平。
空闲位:通常用来表示数据传输未进行或通信线路空闲的状态。
假设现在A设备要给B设备发送一个数据hello
那么A设备需要做的事情就是
1.发送一个0 表示起始信号
2.发送八个bit位数据 01101000(ASCII h的二进制)
3.发送一个奇偶校验位0/1(可选),用于接受设备判断数据是否准确
4.发送一个停止位,用来准备发送下一个ASCII数据
5.发送八个bit位数据01100101(ASCII e的二进制)
6.发送一个奇偶校验位 0/1(可选),用于接受设备判断数据是否准确
。。。。。。
直到数据发送完成
B设备要做的事情就是
1.接受一个0,接受起始信号
2.接受八个bit位数据 01101000(ASCII h的二进制)
3.接受一个奇偶校验位,重新组装数据,与之前的数据进行对比,查看是否正确
4.接受一个停止位,用来准备接受下一个ASCII数据
。。。。。。
以上就是Uart协议进行串行通信的演示,当然,只要熟悉了通信的数据发送顺序以及意思,那么相信大家学习任何协议 应该也会手到擒来。