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

时间:2012-10-14 20:05:10

标签: asynchronous serial-port

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

我可以从低/高(任一方向)识别线路上的转换,因此我可以找到位边界。鉴于我知道设备使用的波特率,我可以开始关闭位,这样我就可以读取来自设备的位流。

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

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

我希望我有意义......感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

启动位是让你的代码接收字节的原因。最好用状态机解释。你有4个基本状态:

  • 状态"等待":对数据线进行采样。当您看到起始位然后以1.5 *位时间启动计时器并转到状态"数据"
  • 状态"数据":等待定时器然后对数据线进行采样以记录一点。将计时器重新启动到1.0 *位时间。只要您还没有收到所有位,请重复此操作。转到州"停止"收到所有比特时
  • 状态"停止":等待定时器并对数据线进行采样以检查停止位。转到州"错误"如果错误,则在接收缓冲区中添加一个字节(如果不是)。回到状态"等待"。
  • 状态"错误":抱怨。等待deus ex machina回到状态"等待"。

因此,基本的见解是你需要起始位来获取接收字节的代码。并且停止位很重要,因此您可以可靠地查看下一个字节的起始位。

答案 1 :(得分:0)

我会让你的程序在一个点或另一个点读取序列和解密模式,来回移动9位,数据将有意义,这取决于你传输的链。一旦识别出一个模式,也许可以识别数据是否有一个周期,那么我会在任何时候查看使得一个字节与周期代码匹配的位行(ascii 46)然后来回计算空间并建立起始并停止位。