我知道在串行通信中奇偶校验位是可选的,但是起始位和停止位也是可选的吗?
答案1
在串行通信中起始位和停止位是可选的吗?
不。
假设RS232(或其TTL变体)。
考虑每一个“方向“独立,忽略流控制线。有一个信号,必须以某种方式传达”数据“,但它也必须能够传达”没有数据“。
传达 ”没有数据“,我们只需让信号保持高电平——逻辑 1。它可以一直这样下去,每个人都很高兴。
一旦我们想传达“数据“我们必须仅使用这一个二进制信号来通知远端数据即将到来。
如果我们不使用起始位并传输0b11110000
,它看起来会像这样(其中灰色表示空闲,绿色表示活动数据):
但是...接收方如何知道开始接收?它看起来与以下内容相同0b00111100
:
因此,我们放置一个已知的“这是开始“前面有点:
杰出的!
但现在我们遇到了另一个问题……没有两个时钟以完全相同的速率滴答作响。在普通的 UART 中,这是事先商定好的——链路的两端都是“说“几乎以相同的速度……
为了使链接更好地发挥作用,我们引入了“停止位“,实际上,只是休息一下……暂停一下。两个停止位通常用于较旧的硬件,因为这些硬件需要更长的时间来处理接收的字节 - 而一个停止位在今天几乎无处不在。
正如 @sawdust 善意提醒我的那样,停止位对于确保我们能够成功检测和同步一帧的结束和下一帧的开始也很重要。如果第一帧以零结束,紧接着第二帧的开始位,这将很困难。
... 就这样,我们就得到了它!这是一份精心设计的数据。
奇偶校验是可选的,因为它与确保数据的完整性有关 - 便于检测损坏。世界上没有什么是完美的(有时我很惊讶任何事物您是否可以成功检测出这些数据(这可能表明这些数据有效),并且了解您刚刚收到的数据是否有效非常有帮助。
不幸的是,该规范非常古老,奇偶校验位仅允许我们检测奇数次位翻转如果有偶数个位翻转,则奇偶校验不能检测到这一点。
今天,我们拥有更加先进的错误检测甚至纠正技术,能够检测(甚至纠正)一定量的损坏。
目前,在 UART 上运行的协议通常不使用奇偶校验位,而是倾向于使用校验和来确保传输数据的完整性。
您还会经常看到 UART 用于与设备(串行控制台)交互。在这种情况下,设备与人交互,人不会注意到或不在乎数据已损坏(他们只需重新运行命令即可)。
最后,如今的 UART 通常用于非常短的链路,并具有良好的强大驱动器 - 从而不再那么担心物理(电气)层面的噪音和损坏。
答案2
起始位和停止位都是强制性的,它们的用途很简单:构造要通信的数据。
当发送方空闲时,数据线通常设置为某个位(例如,0)。一旦开始通信,它将把数据线设置为反转位(起始位,1)。这向接收器发出信号,使其进入一系列状态。在最后一个状态下,数据线必须再次变为空闲状态,并重置回其原始位(停止位,0)。接收器再次监听起始位,然后重复该循环。