这个是个古老的问题。。上次用串口还是本科时候,最近面试被问到了这个问题竟然整蒙了,大致是:
面试老师问:9600的波特率每秒可以传输多少个字节?
我:e...直接除以8...emmm是 1200 Byte 吧(感觉哪里不对劲,但又理直气壮感觉是对的)
面试官表示怀疑....我知道应该不是这么算的,应该得算上开始位之类的。。懵逼地进入了下一个问题 T_T
正片开始:由波特率怎么计算每秒传输的字节数呢?
在信息传输通道中,携带数据信息的信号单元叫码元,单位时间内通过信道传输的码元数称为码元传输速率,简称波特率,其单位是波特(Baud,symbol/s)——百度百科
在单片机这种串口的通信环境下,一个码元就是一个数据位(bit),因此波特率在这里就是每秒能传输多少位数据。即波特率在这里可以等效为:bps(bits per second),常用的波特率为:9600、19200、38400、57600、115200等。
以 9600 的波特率为例,就是每秒可以传输 9600 个位,但需要注意的是,串口通信传输的不是字节流,而是数据包!要传输的字节是含在这个数据包中的,数据包中还有其他辅助传输位:
UART数据包含有1个起始位,5至9个数据位(取决于UART,一般都是一个字节8位),一个可选的奇偶校验位以及1个或2个停止位,默认是1位。其中起始位和停止位是必须的。
因此在只有起始位和1位停止位的情况下,传输一个字节的数据包长度为 10 个 bits ,这种情况下的每秒钟可以传输的字节数为 :9600/10=960 bytes 。如果考虑奇偶校验位的话就是 9600/11=872.72 bytes 。
奇偶校验位:如果有奇偶校验位,则可以选择 奇校验 或 偶校验,可以检验数据在传输过程中是否出错。奇校验时,发送方应使数据位中1的个数与校验位中1的个数之和为奇数;接收方在接收数据时,对1的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。同样,偶校验则检查1的个数是否为偶数。