TopSemic嵌入式交流群里,有个群友问了一个关于串口同步和异步通信的问题,引起了大家激烈的讨论,在此分享给大家。
wm :
各位,我用stm32的串口来给电脑传输数据,到底用的同步通讯还是异步通讯?
(资料图片)
Mr.杜 :
异步
wm :
@Mr.杜 何以见得?
.舒灿:
分清同步和异步的本质,你就会有见得了
wm :
我知道他们的区别,但是我不知道哪儿控制着他们
0114 0112 0127:
cubemx 配置
蓝色雨:
串口无论怎么控制都是异步的啊
wm:
@蓝色雨,USART可以进行同步通讯
蓝色雨:
先理解一下同步和异步的概念,不传输时钟的通讯都是异步的
0114 0112 0127:
@蓝色雨,这个跟站的角度有关,不是这么说的。
我们暂且不关注如何配置同步和异步工作方式,先关注到底什么是同步与异步,对此大家已经有不同的理解。
这个问题,其实这么多年,我也没搞清楚。
wuya:
串口同步、异步,我也没搞清楚过,用的都是异步。有用过同步的大神吗?
APaul:
刚毕业时,面试的问我异步电路和同步电路哪个更好?工作十年后,再次被面试的问同步通信的事情,我说光纤这个没时钟信号应该是异步的,他说这是同步的,后来关于同步还是异步的理解就变复杂了。
扬帆起航:
我也被问过,一直就没弄明白
看来不清楚这个问题的人大有存在。
APaul:
一根线的通信隐含时钟,其实要本地时钟采样对齐才能得到数据,一般是过采样或相位偏移采样处理的,这个FPGA中做通信的用的多。一般的串口通信要波特率一样,也是接收端要16倍采样处理的,这些有人说是同步的,因为这是基于频率的,也有人说是异步的,因为没有一个时钟线用来边沿采样。
那么STM32这个串口的具体例子来说,一般说串口不带时钟线就是异步的,而SPI那种带时钟线就是同步的。UART也可配成带时钟线的用法,类似SPI,也就成了同步串口了,这么说大家都可以理解。
wuya:
什么情况下 stm32 串口需要带时钟线呢?
APaul:
一般不用,因为所有的串口,尤其是计算机的串口,都没时钟线。
只有那种非要把它当SPI来用的情况,才配成同步的,这是可能是波特率可以高很多吧
带时钟线的串口,就是类似SPI的,比如接收端上升沿采样,发送端下降沿改变输出,一次传一个字节等等
异步通信,或者说是隐含时钟的同步通信,没单独的时钟线,发送方和接收方的本地时钟频率肯定有差异,这需要过采样后根据多倍的01变化来解决频率差的问题。串口波特率是有个误差范围的,接收方 可以在一定范围内承受频率差异。
HQY:
@Apaul,大佬,通俗易懂。
之前搞了那么多年,只是知道USART 和 UART 是有同步区别的,这么一说才发现差差异点有一个CLK,竟然从没注意过
wm:
只有带clk 显得才能说同步啊
Guo:
我觉得用数据恢复的时钟不能叫同步。
同步应该收发用同一个时钟。
APaul:
可以这么简单的说,但在一些通信上,比如光纤,或者基于bit流的RS485通信,都会说是隐含时钟的同步通信。
wm:
@APaul 隐含时钟具体是指用过采样来确定每一位么
APaul:
差不多这意思吧
蓝色雨:
有种正交编码的方式,数据线上隐含时钟信号。
MIPI的LP模式就是这样的
wm:
那这样说所有的通信都是同步
APaul:
宽泛的理解就是双方必须基于相同的频率才能通信,不然任何方法都不能正确判断出bit来,这就是同步
蓝色雨:
就像CAN通讯里有同步域和位填充来保证时钟同步,但是本质上还是异步通讯的
wm:
@Apual,相同的频率指什么?
APaul:
频率的一定范围内的误差,可以通过边沿重对齐,过采样去抖动来解决,这样就要求数据必须不断的变化,变化才能隐含时钟。
要是给个直流电平过去,告诉它我这发的是一串1,它打死也认不出这是多少个1来,变化的隔间大到一定程度,时钟对齐就失效了,哪怕错了1个bit,往往导致一帧数据都错了,所以由误码率的说法,也有帧同步的概念。
相同的频率就是那个约定好的波特率
总结一下:
1. USART中的同步通信,需要发送方和接收方共用一个clock。换句话说,发送方提供一个clock或其他timing signal,接收方从而知道什么时候去读取下一位数据。
在同步传输方式下,数据在一条线上传输,clock在另外一条线上传输。
同步通信通常效率更高,因为只传输实际数据,而无需其他bits,像start bit、stop bit 等。
2. USART中的异步通信,不需要发送方发送时钟信号即可通信。但是需要收发双方事先在某些方面做好约定,以用于同步,比如增加起始位、结束位、奇偶校验位等,需要事先知道波特率。
3. 不管哪种通信方式,其实都涉及到同步的概念,从这个角度来说,也都可宽泛的称之为同步通信。
关键词: