我知道在很多异步通信中,数据包都是从起始位开始的。
但是起始位只是1或0。如何区分起始位和结束位以及最后一个数据包?
前任。
如果我将起始位选择为0,将结束位选择为1。
我收到0(数据流A)1 0(数据流B)1,
有什么可以阻止我假设数据流C包含与“(数据流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
)状态。因此,接收者可能会看到以下内容:Data: ....1111 0010000011 111 0010000101 0010000111 11111....
(quiet) ^ A $ ^ B $ ^ C $ (quiet)
通过对ASCII图形的道歉,当 channel 空闲时,数据由一系列停止(
1
)位组成。当发送器准备发送字符时,它将发送一个开始(0
)位(标记为^
),后跟该字符代码,并以一个停止(1
)位(标记为$
)结束。它会继续发送停止位,直到从另一个起始位开始发送下一个字符为止。我们使用起始位而不是字节的原因是效率。上面的方案需要10位(1start + 8data + 1stop)来传输8位数据,导致开销为(10-8)/8 = 1/4 = 25%。如果我们使用开始和停止字节,则需要为每个字节数据传输3个字节,这将是(3-1-1)/1 = 2 = 200%的开销。如果起始,数据和终止字节均为8位,则每个字符必须传输24位而不是10位,因此发送数据所需的时间几乎是其2.5倍!
关于asynchronous - 起始位与起始字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/275544/