聊串口异步通信和波特率
串口异步通信,最重要的一个参数是波特率。这就不得不再讲一讲异步通信了。
相关系列文章:
串口通信遇到问题查什么又怎么查
假如古代用异步通信——谈谈串口的异步通信浅谈串口通信(232,485,422)以及常见问题,心得体会等关于485 通信中多设备通信的一些问题及心得体会
03.Modbus入门篇下——常见问题
上次用古代的故事讲这个异步通信之后,有读者留言反馈说似乎还不够形象,还没有很好地介绍异步通信的东西。
今天就从波特率这个角度,再讲一下异步通信。
这里有两个名词:串口和异步。
串口是串口,异步是异步。是两个不同的概念。
异步,就是相对于同步而言的。
串口,就是相对于并口而言的。
什么是并口:
什么是串口
数据是有位,字节,字,双字等。
串口一般就是每次只能传输一个位。如果要传一个字节,就要传8次。
优点就是只需要一根通信线就行了。
并口则是一次可以传一个字节,或者字,或者双字。具体看并口的能力。
优点就是效率高。
缺点就是需要更多的通信线。
所以并口一般用于主板的内部通信,比如CPU和FLASH,DDR等。
异步和同步呢。
CPU有一个重要的参数是时钟频率,也就是晶振。
CPU的运行 ,每一步都是需要有一个时钟信号。
如果时钟信号越高,速度就越快。这就是我们所说的主频。
同样的,如果要进行数据传输,每一次的数据发送或接收,都要有一个时钟信号,这个就是同步信号。
同步信号是什么。
就像我们的时钟一样,滴答就是一秒。当然,滴答越快,就是频率越快。
同步信号就是时间到了,才能做这个事。
就好比如上课下课一样。
上课时间到了,上课铃声响了,开始上课。
下课时间到了,下课铃声响了,开始下课。
同步信号,重要的是信号。比如上课的信号,上课的信号。时间才是其次。
比如,我们约定是40分钟一趟课。虽然时间到了,但是老师拖堂了,会晚几分钟。直到老师允许下课了,下课信号才生效。
我们都玩过123谁是木头人。这个就是生活中的同步通信。
主持人在终点前线,转身,游戏者就暂停。
主持人转身背向游戏者,游戏者才能前进。
就这样前进,暂停,前进,暂停。就是同步信号的通信。每一次都依赖于信号。
而异步通信则不需要同步信号。
这么说的话,异步通信,就比同步通信少了一根时钟线了。就不需要有个时钟线在滴答滴答才能开始传数据。
以坐班车为例。
同步通信则是,车门口多一个检票员。
检票员检查一个,开一个门进去一个,然后再拦,再检查。
一次只能进一个。
车位有30个。检票检了30个,反正检票员也不看座位坐满了没有。因为同步信号严格保证了人数刚好是一致的。好了够一车了。开车走人。
而异步通信则是,车门没有检票员了。车门开了,一个个排队进去。有座位就坐。
司机则隔几分钟看一下座位。如果座位已经满了,就关门,开车。
如果座位还没有满,就往外喊,还有座位,要上车的赶紧了,要发车了。
所以传输数据也是一样的。
同步通信和异步通信,区别就是同步通信多了一个时钟同步信号。
当然还有更重要一个原因主是成本问题。
像串口同步通信,如果传一个字节,就是每一个周期信号,传输一个位。也是传输8次。
每个位是1还是0,就看时钟同步信号的时候,数据位对应的是高电平还是低电平了。
但是串口异步通信。如果传一个字节,就是8个位。怎么样才知道哪个位是1,哪个位是0呢。怎么知道这个字节是多少呢。
没有了时钟信号,这时候就得有个约定了。通信双方约定好时间对应的数据位。
比如,如果将一份密报通过画波形的时候画到纸上。
我们知道怎么这个数据是什么呢。要怎么解密呢。
那就得有约定了。
如果是在纸上画好的,那我们就约定距离。比如每1厘米取一个点,这个点是高就是1,这个点是低电平,就是0。这样连续取8个,就成了一个字节了。
但是电子通信设备是动态的,不可能把信号画到纸上,再用尺子去量。
所以在串口异步通信里,约定的参数就是时间了。
双方约定多少的时间为一个数据位的时间。
这样发送方,就按这个时间,发一个位。比如发1,就让高电平维持这个时间。发0,就低电平维持这个时间。
接收方接到这个数据之后,就隔多长时间处理一个数据。
那么这个时间所对应的就是所谓的波特率了。
注意是波特率,不是比特率。
常见的波特率就是1200,2400,4800,9600,19200,38400,115200等。
当然也可以自定义波特率,只要双方约定是同一个数值就可以的。
波特率又怎么来的,波特率就是从CPU所用的晶振频率分下来的。
之前一篇文章提到:
比如12M晶振,24M晶振,11.0592M晶振。通过分频,一分再分,最后 得到想要的波特率。
比如12M的波特率,想要到得9600的波特率。分几次频呢。
先是12 000 000 / 16 = 750 000
然后7500 000 /9600 =78。
也就是7500 000 / 78 =9615。
所以实际得到的是9615的波特率。因为必须是整除的关系。
那如果是12000000 频率计算115200波特率呢。
先是12 000 000 / 16 = 750 000
然后7500 000 /115200 =6。
也就是7500 000 / 6 =125000。
可以看到如果是12M晶振的话,是得不到具体的晶振的准确的9600和115200的。
但是呢,也可以看出来,12M的晶振,设置9600,实际9615,误差只有0.15%。
而设置115200,实际是125000,误差有8.5%。误差就比较大了。
两边波特率不匹配,就会存在通信误差,造成通信不稳定。
当然,为了能得准确的9600波特率和115200波特率,就得用特殊的晶振,比如11.0592M晶振。
但是不是所有的CPU都用11.0592M晶振了。
对于上到linux系统来说,而是提高CPU主频,可以将频率要分得更为接近一些,减少误差。
比如600M的主频。
600 000 000 / 16 = 37 500 000
37 500 000 /115200 = 325
37 500 000 /325 = 115384 。这时候就先接近115200波特率了。
虽然我们知道115200波特率通信速率比9600波特率高。
但是很多设备仍在使用9600波特率。
因为你不知道对方的波特率是否有误差,用9600波特率来说,通信就更为稳定,同时也能兼容更多的设备和场合,特别是有的设备只是单片机系统,晶振是12M或者更低的。
对通信来说,求稳比求快更重要。
附加内容:
这里会有同学问,12M晶振,12000000/104=115384。这个就很接近115200了。
为什么要先除以16,再去分频呢。
这个就是串口功能里的16X模式。这种一般不需要用户参与,而是串口通信的一个功能机制。
我们知道,串口通信,无非就是一根线上的高低电平变化,010101的数据。正常来说,是理想的方波。电平从0跳到1,再从1跳到0.
怎么才能保证当前到的位,是真的1,还是假的1呢。
这时候就这个16X模式就起到作用了。
这也是串口的工作原理了。
当我们接收到串口数据时,从起始位开始,电平从高变到低,表示起始位开始了。
起始之后,就是第一个数据位了。
比如第一个数据位是个1,也就是高电平。
那么RX引脚,从起始位的0,也就是低电平,会变到高电平。首先。总线过来的数据,从低电平变到高电平,是有个时间的。如果这时候就马上判断这个数据是1还是0,有可能电平还没有升到稳定的高电平,就去判断这个引脚的逻辑,就可能误判。
那么什么时候才去判断这个引脚是高电平还是低电平呢。
一个位的时间比如有1ms,(9600波特率),要不在这1ms的时间,平均取16次,也就是将1ms切成16片。首位的电平是不准的,那只能取中间的电平。
比如,就取中间第7次,第8次,第9次的电平数据。如果这三次的电平都相同的,则认为是有效的数据。如果这三次电平不相同,则无效。
具体取是间多少,就看不同的厂家方案了。就看每家CPU的方案了。取多了抗干扰能力不够,取少了容易因为干扰产生错误的数据。
这样即便波特率是遇到削弱的,比如得不到稳定的方波。只要波峰刚好是在中间的,刚好落在7,8,9的中间是高电平的,数据就能正常识别。
有了这个16X的模式,串口才得以更好地工作。
所以这就是为什么很多波特率,晶振算频率的时候,要先除以16的原因了。
当然,有的CPU还支持13X模式。原理也是一样的,就是在一个波特率时间里,平均分成13分,取中间的电平。
像这种13X模式是为了让CPU可以支持更高的波特率或者更自由定义的波特率。
当然,如果为了保证更好地性能,是不是可以取24或者100份呀。
主要没必要。这个16X模式是串口通信发展以来得到了经验值,也算是默认的吧。
太高了,影响效率,取少了,通信误差就提取不了数据,就需要对通信波形有要求了。
这个就是不同的CPU厂家所处理的。这也就解释了,为什么同样的现场通信波形和干扰,有的CPU在工业现场就能正常识别出报文和通信,有的CPU识别不出来,通信不上。
这也就是CPU的抗干扰能力的体现了。
页:
[1]