我知道在很多异步通信中,数据包从一个起始位开始。
但是起始位只是1或0.如何区分起始位和结束位与最后一个数据包?
实施例。 如果我选择我的起始位为0而我的结束位为1。 我收到0(数据流A)1 0(数据流B)1, 什么阻止我假设有一个数据流C包含相同的内容“(数据流A)1 0(数据流B)”?
启动BYTE然后检查数据流是否更方便?这将减少开始/结束位之间混淆的可能性。
答案 0 :(得分:9)
好问题!大多数异步通信还指定了一个 stop 位,它是起始位的补码,确保每个新符号都以一个从停止到开始的转换开始。
示例:让我们传输字符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图形道歉,数据由通道空闲时的一系列停止(1
)位组成。当发送器准备好发送一个字符时,它会发送一个开始(0
)位(标有^
),然后是字符代码,最后是一个停止(1
)位(标有$
)。它继续发送停止位,直到发送下一个字符,从另一个起始位开始。
我们使用start 位而不是 bytes 的原因是效率。上述方案需要10位(1 start + 8 data + 1 stop )来传输8位数据,从而产生开销(10 - 8)/ 8 = 1/4 = 25%。如果我们使用启动和停止字节,我们需要为每个数据字节传输3个字节,这将是(3 - 1)/ 1 = 2 = 200%的开销。如果开始,数据和停止字节都是8位,那么我们必须为每个字符发送24位而不是10位,所以发送数据需要几乎2.5倍的时间!
答案 1 :(得分:1)
可以始终将起始字节定义为消息开始的指示(并且ASCII SOH,STX和ETX代码用于此类目的)。但是,用于连接数据传输设备(RS232C和更高版本)的标准硬件和协议在较低级别运行,通常既不可能也不希望改变这种安排(特别是通过软件)。
高性能同步数据传输方案,例如在局域网和广域传输系统上使用的方案,确实使用精细的帧标记。帧标记是从不在消息数据流中出现的不同比特模式。通常存在一种特殊的重写规则,其基本上“逃避”类似位模式的任何数据内出现,使得传输设备不会将其视为帧标记。这些转义模式由接收者重建,因此发送者和接收者永远不必注意这一点。这些安排使专用硬件变得更加重要,例如在个人计算机上的典型网络接口卡(目前,主板芯片)中。
异步串行通信的背景
将异步串行传输视为字符/数据帧之间的异步以及字符帧范围内的同步(包括起始位和初始停止/填充)非常有用。
采用这种方案,帧之间存在恒定的填充信号,并且通常至少有一个数据位宽,尽管某些布置需要1.5位或2位停止/填充。停止“位”使用相同的信号电平,可以认为是另一个起始位到达之前的最小填充周期。
当帧到达时,必须与预期携带的预定位数同步。从填充到相反电平信号的转换由始终与停止/填充水平相反的起始位完成。比特的采样可以在随后的比特到达周期的中间发生。
从技术上讲,如果帧以最大速率发送,则无需发送任何停止/填充,立即进入下一帧的起始位。但是,在起始位转换之前依靠至少一位填充有助于保持发送器和接收器同步。
如果您认为异步流是使用键盘从键按下进行编码的,您可以看到允许在字符帧之间进行任意填充的重要性。一旦知道接下来要发送什么帧,就可以在达到至少一位先前停止/填充的位之后,以约定的比特率立即插入其起始位。
注意到,在典型的低速异步传输中,只有两种比特/级别也是有用的,因此可以区分数据的存在而不是填充的唯一方法是通过标记方案,如这样,帧的开始是不可检测的,并且帧的结束是预定的(除非存在通常不用于异步串行通信的更复杂的可变长度帧结构)。接收器实际上很难在没有一些额外协议的情况下发现发射机的比特率,例如寻找可识别的数据序列,从中可以估计比特率,当比特率以不正确的形式到达时,该比特率将正确到达。
即使高速调制解调器现在传输的复杂模拟信号没有用两个简单的信号电平来描述,计算机UART和调制解调器上的数据耦合之间的RS232C(和后来的模式)数字通信也很漂亮就像描述的那样。
高速调制解调器还具有与远端点同步的附加功能,您可以通过在连接启动时收听信号音频来判断。此外,在计算机的串行电缆中有单独的信号线,用于计算机和调制解调器之间的起搏,这样发送方不会比接收方(计算机或调制解调器)接受的速度更快地发送新的数据帧他们。但是,一旦启动,框架总是以商定的同步速度开始。
Wikipedia对asynchronous serial communication有一个很好的描述,计算机串口使用什么。
存在一种常见的过度简化,表明停止位决定了数据的长度。事实并非如此。停止位看起来就像是另一个数据位的一个级别。识别停止位和直到下一个起始位的周期的方式是通过知道帧内数据和开始/停止位被发送的比特率以及知道帧包含多少比特。否则,无法将停止位与该极性的另一位区分为数据帧的一部分。
答案 2 :(得分:0)
以下是启动和停止位通常起作用的方式:
如果要发送更多数据,则每个字节必须以起始位启动并以停止位结束。发送器和接收器必须就每个起始位发送多少位数据达成一致,这样接收器就能够将停止位与数据区分开来。有时起始位实际上是多位甚至是一个字节,但这个想法是一样的。在接收到预先指定数量的数据位后,接收器在看到停止位时识别数据帧的结束。有时在停止位之前发送奇偶校验位以提供简单的错误检测机制。
答案 3 :(得分:0)
这是所有协议依赖的。您可以说在开始符号后,您将看到N个符号,或者您将阅读,直到遇到停止符号。
其中符号colud是任何n位序列(包括位和字节。)
实际上,您的位示例完全适用于使用字节而不是位的协议。
假设您发送00000000流A 11111111 00000000流B 11111111.在这种情况下,您仍可能将其与流C =流A 11111111 00000000流B混淆。
通常使用起始位,因为电压电平变化可以触发事件(参见flip flops中的边沿触发。)另一方面,具有多个位的起始符号将用于同步两个系统的时钟。除了触发事件。它的一个例子是PAL信号。
答案 4 :(得分:-2)