Asynchronous 如何识别异步串行位流中的起始位

Asynchronous 如何识别异步串行位流中的起始位,asynchronous,serial-port,Asynchronous,Serial Port,我正在为微处理器编写一些代码,以便通过单线异步串行通信与外部设备通信 我可以识别导线上从低/高(任何一种方式)的过渡,因此我可以找到位边界。如果我知道设备使用的波特率,我就可以开始计时位,这样我就可以读取来自设备的位流 从概念上讲,我正在努力识别一个起始位——找到一个字节帧的起始位(假设我得到8位,无奇偶校验,1个起始位,1个停止位)。我知道每个帧都以一个起始位开始,以一个停止位结束,但我的理解是,开始位和停止位看起来像任何其他位——因此它们没有什么特殊之处,可以将它们标识为开始位或停止位(除了

我正在为微处理器编写一些代码,以便通过单线异步串行通信与外部设备通信

我可以识别导线上从低/高(任何一种方式)的过渡,因此我可以找到位边界。如果我知道设备使用的波特率,我就可以开始计时位,这样我就可以读取来自设备的位流

从概念上讲,我正在努力识别一个起始位——找到一个字节帧的起始位(假设我得到8位,无奇偶校验,1个起始位,1个停止位)。我知道每个帧都以一个起始位开始,以一个停止位结束,但我的理解是,开始位和停止位看起来像任何其他位——因此它们没有什么特殊之处,可以将它们标识为开始位或停止位(除了它们的位置)

我能想到的识别起始位的唯一方法是,它将是持续空闲期后的第一个高位-也就是说,因为我期望8位无奇偶校验,如果我得到9个或更多低位,则线路空闲,下一个高位将是起始位。这很好,但是如果我开始收听设备的中间比特流,并且线路上没有9位或更多的空闲时间,该怎么办?我正在计时位,但如何识别哪个位是起始位,以便读取字节?如果我是按位计时,那么帧之间的任何东西都只能是位的整数倍(例如,停止“位”不能是1.5位),所以所有东西看起来都像位


我希望我说的有道理。。。谢谢您的帮助。

起始位是使代码接收字节的起始位。最好用状态机来解释。您有4种基本状态:

  • 状态“等待”:对数据行进行采样。当您看到开始位时,然后在1.5*位时间启动计时器,并移动到“数据”状态
  • 状态“数据”:等待计时器,然后对数据行采样以记录位。重新启动计时器至1.0*位时间。只要你还没有收到所有的比特,就重复这个步骤。当接收到所有位时,移到“停止”状态
  • 状态“停止”:等待计时器并对数据线采样以检查停止位。如果错误,移动到状态“error”,如果不是,则向接收缓冲区添加一个字节。返回状态“等待”
  • 声明“错误”:投诉。等待deus ex machina返回“等待”状态

因此,基本的见解是,您需要起始位来运行接收字节的代码。停止位很重要,这样您就可以可靠地看到下一个字节的开始位。

我会让您的程序在某个点读取序列并破译模式,前后移动9位,数据将有意义,这取决于您传输的链。一旦识别出一个模式,可能识别出数据是否有一个周期,然后我会查看使一个字节与周期码(ascii 46)匹配的位行是否在任何一点,然后来回计算空格,并建立起始位和停止位

汉斯,谢谢。我明白,但是“当你看到开始的时候”是我想要弄明白的。我正在使用的设备通电并开始发射比特流。该比特流可能永远不会有一个持续的空闲周期——除非在通电后立即开始该流。如果我开始侦听该位流,但错过了初始空闲期,那么如何识别起始位以便对字节进行帧处理?我可以像你说的那样计时,但是我看到的第一个比特可以是任何地方的任何比特。我没有办法知道哪一个是起始位——反正我能想到。呃,这在串行通信中是明确的。接收器必须在发射器之前启动。当接收器启动晚时,没有希望同步,状态“错误”将很流行。这种同步方式在串行端口硬件中得到了很好的支持,握手线发出信号,表明另一端是否已通电并准备好监听。DTR和RTS信号。再次感谢汉斯。我担心你会这么说。所以如果我错过了第一次握手,我就完蛋了。。。