面试FPGA的一个很基础的问题就是问你对UART的了解,在经过血泪的教训之下,对此进行总结。

RS232接口如下图:

有关UART的一些实用问题_串口

一般都是9个pin,但有3个pin最重要:

  • pin 2: RxD (receive data).
  • pin 3: TxD (transmit data).
  • pin 5: GND (ground).

有这三个端口就能进行收发数据了。

收发数据的规则:

发送数据的波形图如下:

发送数据一般按字节发送,串行发送,例如,需要发送的数据为0x55,即0101_0101;

发送数据的规则是:先发送起始位1,在从低位开始发送数据,例如上面的数据是1010_1010,最后发送结束位1;不发送数据时,发送数据位为高电平,也即空闲状态为高电平。

有关UART的一些实用问题_数据_02

再举一个例子:发送数据0XC4,即1100_0100,由于从低位发送,所以数据位发送顺序为:0010_0011,起始位为0,结束位为1;

如下:有关UART的一些实用问题_传输线_03

有关UART的一些实用问题_传输线_03

可见,很难分辨各个位,从这幅图中我们可以看到,接收方知道发送方发送数据的速率(波特率)是多么重要。

因为,发送方和接收方没有时钟的来往,所以,需要知道数据的发送速率才能正确接收发送方的数据。

收发数据的波特率:

RS-232接口不允许你随意使用数据传输速率,它有几个固定的速率,我们用baud来表示:

1200 bauds;

9600 bauds;

38400 bauds;

115200 bauds;(通常能达到的最高速率)

可见,最高的波特率很低,还不到1Mbps,属于低速度串口。

假如波特率为115200bauds,这样每一位持续时间为: (1/115200) = 8.7µs. 发送一个字节的数据,需要时间:8 x 8.7µs = 69µs;

由于还需要算上起始位和结束位,那么实际就需要时间:10 x 8.7µs = 87µs.这样发送数据最快的速度为:1s/87us = 11.5kbytes/s。

当然结束位可以为1.5位,也可以为2位,还可以有校验位,这样的话,数据速度就会更低了。

具体见链接:RS232接口是如何工作的?

重点记忆:

RS232数据发送的波特率:

1200 bauds;

9600 bauds;

38400 bauds;

115200 bauds;(通常能达到的最高速率)

发送数据规则:起始位(低电平),结束位(高电平,可以为1个,1.5个,2个结束位),空闲状态(高电平),数据位发送(从低到高)。

结束位为什么可以有不止一个,有什么作用?

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

可见简单的说,停止位不仅仅表示数据传输的结束,也可以提供通信双方校正时钟同步的机会。

既然结束位有这个作用,那是不是可以说,起始位不仅仅表示字符数据的开始,也可以提供通信双方校正时钟的机会呢?大概可以。

还有一个问题,就是uart串口和SPI串口,谁的数据传输速度更快?为什么?

暂时这里吧,太忙了。