我知道在很多异步通信中,数据包从一个起始位开始.
但是起始位只是1或0.如何区分起始位和结束位与最后一个数据包?
防爆.如果我选择我的起始位为0而我的结束位为1.并且我收到0(数据流A)1 0(数据流B)1,有什么可以阻止我假设有一个包含数据流的数据流"(数据流A)1 0(数据流B)"的相同内容是什么?
有一个启动BYTE,然后检查数据流的位组合是不是更方便?这将减少开始/结束位之间混淆的可能性.
好问题!大多数异步通信还指定了一个停止位,它是起始位的补码,确保每个新符号都以停止 - 开始转换开始.
示例:让我们传输ABC
ASCII 65,66和67 的字符:
A = 65 = 0x41 = 0100 0001 B = 66 = 0x42 = 0100 0010 C = 67 = 0x43 = 0100 0011
我们还假设(任意地)起始位是0
和停止位1
,并且数据从MSB发送到LSB.1
当没有数据传输时,发送器将处于stop()状态.所以接收器可能会看到:
Data: ....1111 0010000011 111 0010000101 0010000111 11111.... (quiet) ^ A $ ^ B $ ^ C $ (quiet)
对于ASCII图形道歉,数据由1
通道空闲时的一系列stop()位组成.当发送器准备发送一个字符时,它发送一个start(0
)位(标有^
),后跟字符代码,并以stop(1
)位(标有$
)结束.它继续发送停止位,直到发送下一个字符,从另一个起始位开始.
我们使用起始位而不是字节的原因是效率.上述方案需要10比特(1个开始 + 8个数据 + 1个停止)来发送8比特的数据,导致(10 -8)/ 8 = 1/4 = 25%的开销.如果我们使用开始和停止字节,我们需要为每个数据字节传输3个字节,这将是(3 - 1)/ 1 = 2 = 200%的开销.如果开始,数据和停止字节都是8位,那么我们必须为每个字符传输24位而不是10位,因此发送数据需要几乎两倍的时间!