8

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

但是起始位只是 1 或 0。如何区分起始位与结束位与最后一个数据包?

前任。如果我选择我的起始位为 0,我的结束位为 1。并且我收到 0(数据流 A)1 0(数据流 B)1,有什么可以阻止我假设有一个数据流 C 包含“(数据流A)1 0(数据流B)”的内容相同?

有一个起始字节然后检查数据流中的比特组合不是更方便吗?这将减少开始/结束位之间混淆的可能性。

4

5 回答 5

9

好问题!大多数异步通信还指定一个停止位,它是起始位的补码,确保每个新符号都以停止到开始的转换开始。

示例:让我们传输字符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)

1对 ASCII 图形表示歉意,当通道空闲时,数据由一系列停止 ( ) 位组成。当发送器准备好发送一个字符时,它会发送一个开始 ( 0) 位(用 标记^),然后是字符代码,并以一个停止 ( 1) 位(用 标记$)结束。它继续发送停止位,直到发送下一个字符,从另一个起始位开始。

我们使用起始而不是字节的原因是效率。上述方案需要 10 位(1开始+ 8数据+ 1停止)来传输 8 位数据,导致 (10 - 8) / 8 = 1/4 = 25% 的开销。如果我们使用 start 和 stop bytes,我们需要为每个数据字节传输 3 个字节,这将是 (3 - 1)/1 = 2 = 200% 的开销。如果起始字节、数据字节和停止字节各为 8 位,则我们必须为每个字符传输 24 位而不是 10 位,因此发送数据所需的时间几乎是 2 1/2 倍!

于 2008-11-09T03:16:11.357 回答
1

人们总是可以将起始字节定义为消息开始的指示(ASCII SOH、STX 和 ETX 代码就是为此目的而设计的)。但是,用于连接数据传输设备(RS232C 及更高版本)的标准硬件和协议在较低级别上运行,通常既不可能也不希望改变这种安排(尤其是通过软件)。

高性能同步数据传输方案,例如在局域网和广域传输系统上使用的那些,确实使用了复杂的帧标记。帧标记是一种独特的位模式,永远不会出现在消息数据流中。通常有一个特殊的重写规则,它基本上“转义”任何类似位模式的数据内出现,以便传输设备不会将其视为帧标记。这些转义模式由接收者重构,因此发送者和接收者永远不必注意这一点。这些安排使专用硬件变得更加重要,例如在个人计算机上的典型网络接口卡(如今,主板芯片)中。

异步串行通信的背景

将异步串行传输视为字符/数据帧之间的异步和字符帧范围内的同步(包括起始位和初始停止/填充)是有用的。

使用这种方案,帧之间有一个恒定的填充信号,它通常至少有一个数据位宽,尽管有些安排需要 1.5 位或 2 位停止/填充。停止“位”使用相同的信号电平,可以认为是另一个起始位到达之前的最小填充周期。

当一个帧到达时,有必要与它预期携带的预定位数同步。从填充到相反电平信号的转换由始终与停止/填充电平相反的起始位完成。位的采样可以定时发生在随后的位到达周期的中间。

从技术上讲,如果帧以最大速率发送,则无需发送任何停止/填充,立即进入下一帧的起始位。然而,在开始位转换之前至少需要一个位的填充有助于保持发送者和接收者的同步。

如果您将异步流视为使用键盘从按键按下进行编码,您会看到允许在字符帧之间任意填充的重要性。一旦知道接下来要发送什么帧,就可以在之前的停止/填充至少有一个比特位之后,立即以约定的比特率插入它的起始比特。

还需要注意的是,在典型的低速异步传输中,只有两种位/级别,因此唯一可以区分数据存在而不是填充的方法是通过像这样的标记方案,其中帧的开始是唯一可检测的,帧的结束是预先确定的(除非有更复杂的可变长度帧结构,通常不用于异步串行通信)。实际上,如果没有一些额外的协议,接收器很难发现发送器的比特率,例如寻找一个可识别的数据序列,从中可以估计当它以不正确的形式到达时正确到达的比特率。

尽管高速调制解调器现在传输复杂的模拟信号,这些信号没有用两个简单的信号电平来描述,但计算机 UART 和调制解调器上的数据耦合之间的 RS232C(和更高模式)数字通信与描述的差不多.

高速调制解调器还具有与远程端点同步的附加功能,您可以通过在连接启动时收听信号音频来判断。此外,在连接到计算机的串行电缆中有单独的信号线,用于在计算机和调制解调器之间起搏,以便发送方传输新数据帧的速度不会超过接收方(计算机或调制解调器)可以接受的速度他们。但是一帧一旦开始,总是以约定的同步速度开始。

维基百科对异步串行通信有很好的描述,计算机串行端口使用什么。

有一个常见的过度简化表明停止位决定了数据的长度。事实并非如此。停止位看起来就像另一个数据位的电平。识别停止位和直到下一个起始位的周期的方式是通过知道帧内数据和开始/停止位正在传输的比特率以及知道一个帧包含多少位。否则,作为数据帧的一部分,没有办法将停止位与该极性的另一位区分开来。

于 2008-11-09T23:15:49.297 回答
0

以下是开始位和停止位通常的工作方式:

  1. 发送一个起始位,例如 1。这向接收器表明将传输指定数量的数据位,例如 8。
  2. 发送 8 位数据。
  3. 发送一个停止位,比如 0。这表示 8 位数据已发送。

如果要发送更多数据,则每个字节必须以起始位开始并以停止位终止。发送器和接收器必须就每个起始位发送多少位数据达成一致,以便接收器能够区分停止位和数据。有时起始位实际上是多个位甚至一个字节,但思路是一样的。接收器在接收到预定数量的数据位后看到停止位时识别出数据帧的结束。有时在停止位之前发送奇偶校验位以提供简单的错误检测机制。

于 2008-11-09T03:19:27.527 回答
0

这完全取决于协议。你可以说在开始符号之后你会期待 N 个符号,或者你会一直阅读直到遇到停止符号。

其中符号 colud 是任何 n 位序列(包括位和字节。)

实际上,您的位示例完全适用于使用字节而不是位的协议。

假设您发送 00000000 流 A 11111111 00000000 流 B 11111111。在这种情况下,您可能仍会将其与流 C = 流 A 11111111 00000000 流 B 混淆。

通常使用起始位,因为电压电平变化可以触发事件(请参阅触发器中的边沿触发)另一方面,除了触发事件之外,还将使用具有多个位的起始符号来同步两个系统的时钟。PAL 信号就是一个例子。

于 2008-11-09T03:21:37.773 回答
-2

开始和停止位来自电传打字机时代。它们本质上是需要时间来让机械硬件设置的脉冲。Dos 文本文件的行以 CR LF 结尾,这实际上导致回车返回到第 1 列,而压板前进一行。我认为这是有序的,因为 CR 需要更长的时间才能发生,而 LF 可以有效地并行发生。

检测它有点困难。你不得不看着比特流过去。随着时间的推移,您应该能够检测到它,因为数据通常是 ASCII 并带有开始/停止位。通常这不是问题,因为它由运行COM端口的UART处理。

于 2008-11-09T03:21:46.510 回答