我知道在很多异步通信中,数据包都是从起始位开始的。

但是起始位只是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/

10-11 10:48