我知道在很多异步通信中,数据包都以起始位开头。
但是起始位只是1或0。如何区分起始位、结束位和最后一个数据包?
例如。如果我选择我的起始位是0,结束位是1,并且我接收到0(数据流A) 10(数据流B) 1,那么有什么可以阻止我假设有一个数据流C包含“(数据流A) 10(数据流B)”的相同内容?
有一个起始字节,然后检查数据流中的位组合,不是更方便吗?这将减少开始/结束位之间混淆的可能性。
发布于 2008-11-09 23:15:49
人们总是可以定义一个开始字节作为消息开始的指示( ASCII SOH、STX和ETX代码就是为了这样的目的而设计的)。然而,用于连接到数据传输设备(RS232C和更高版本)的标准硬件和协议在较低级别上运行,并且通常不可能也不希望改变这种安排(尤其是通过软件)。
诸如在局域网和广域传输系统上使用的那些高性能同步数据传输方案确实使用精心设计的帧标记。帧标记是一种不同的位模式,它永远不会出现在用于消息数据的流中。通常存在一种特殊的重写规则,该重写规则本质上“转义”类似比特模式的任何数据内出现,使得传输设备不会将其视为帧标记。这些转义模式由接收者重新构建,因此发送者和接收者永远不需要注意这一点。这些安排使得专用硬件变得更加重要,例如在个人计算机上的典型网络接口卡(现在是主板芯片)。
异步串行通信的背景知识
可以将异步串行传输视为字符/数据帧之间的异步传输和字符帧范围内的同步传输(包括起始位和初始停止/填充)。
在这种方案中,帧之间有一个恒定的填充信号,通常至少有一个数据位宽,尽管有些配置需要1.5位或2位停止/填充。停止“位”使用相同的信号电平,并且可以被认为是另一个起始位到达之前的最小填充周期。
当帧到达时,需要与其预期承载的预定比特数同步。从填充到相反电平信号的转换是由始终与停止/填充电平相反的起始位完成的。比特的采样可以被定时为在随后的比特到达周期的中间发生。
从技术上讲,如果帧以最大速率发送,则无需发送任何stop/fill,立即进入下一帧的起始位。但是,在开始位转换之前至少计算一个位的填充有助于保持发送方和接收方的同步。
如果您认为异步流是使用键盘从键盘按键进行编码的,那么您就可以看到允许字符帧之间任意填充的重要性。一旦知道下一步要发送哪个帧,就可以在存在至少一个比特值的先前停止/填充之后,以约定的比特率立即插入该帧及其起始位。
还值得注意的是,在典型的低速异步传输中,只有两种比特/电平,因此能够区分数据的存在而不是填充的唯一方式是通过这样的标记方案,其中帧的开始是唯一可检测的,并且帧的结束是预先确定的(除非存在通常不在异步串行通信中使用的更复杂的可变长度帧结构)。实际上,对于接收器来说,在没有某些附加协议的情况下发现发射器的比特率是相当困难的,例如寻找可识别的数据序列,从中可以估计比特率,当比特率以不正确的形式到达时,该比特率将正确到达。
尽管高速调制解调器现在传输的复杂模拟信号不是用两个简单的信号电平来描述的,但计算机通用异步收发器和调制解调器上的数据耦合之间的RS232C (以及后来的模式)数字通信与所描述的基本相同。
高速调制解调器还具有与远程端点同步的附加功能,您可以通过在连接启动时收听信号音频来判断。此外,在连接计算机的串行电缆中有单独的信号线,用于在计算机和调制解调器之间调步,这样发送方传输新数据帧的速度就不会超过接收方(计算机或调制解调器)所能接受的速度。但是,帧一旦启动,总是以约定的同步速度启动。
维基百科很好地描述了asynchronous serial communication,也就是计算机串行端口的用途。
有一种常见的过于简化的说法,即停止位决定数据的长度。事实并非如此。停止位看起来就像是另一个数据位的电平。识别停止位和直到下一个起始位的周期的方式是通过知道发送帧内数据和开始/停止位的比特率以及知道一帧包含多少位。否则,作为数据帧的一部分,无法将停止位与该极性的另一位区分开来。
发布于 2008-11-09 03:19:28
下面是开始位和停止位通常的工作方式:
如果要发送更多数据,则每个字节必须以起始位启动,并以停止位终止。发送器和接收器必须就每个起始位发送多少位数据达成一致,以便接收器能够区分停止位和数据。有时起始位实际上是多个位,甚至是一个字节,但概念是相同的。接收器在接收到预先指定数量的数据位后,当它看到停止位时,它会识别数据帧的结束。有时,在停止位之前发送奇偶校验位,以提供简单的错误检测机制。
发布于 2008-11-09 03:21:38
它完全依赖于协议。你可以说,在开始符号之后,你将期望N个符号,或者你将一直读到你遇到停止符号。
其中,符号可以是任何n比特序列(包括比特和字节)。
实际上,您的比特示例恰好适用于使用字节而不是比特的协议。
假设您发送00000000流A 11111111 00000000流B 11111111。在这种情况下,您仍然可以将其与流C=流A 11111111 00000000流B混淆。
通常使用起始位,因为电压电平的变化可能会触发事件(参见flip flops中的边沿触发)。另一方面,除了触发事件外,还将使用具有多个位的起始符号来同步两个系统的时钟。它的一个例子是PAL信号。
https://stackoverflow.com/questions/275544
复制相似问题