4

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

我可以识别电线上从低/高(无论哪种方式)的转换,所以我可以找到位边界。鉴于我知道设备正在使用的波特率,我可以开始计算位,因此我可以读取来自设备的位流。

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

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

我希望我说得通...感谢您的帮助。

4

2 回答 2

3

起始位是让您的代码接收一个字节的原因。最好用状态机解释。您有 4 个基本状态:

  • 状态“等待”:对数据线进行采样。当您看到起始位时,以 1.5 * 位时间启动计时器并进入“数据”状态
  • 状态“数据”:等待定时器然后采样数据线记录位。将定时器重新启动到 1.0 * 位时间。只要您没有收到所有位,就重复。收到所有位后进入“停止”状态
  • 状态“停止”:等待定时器和采样数据线检查停止位。如果错误则进入“错误”状态,如果错误则向接收缓冲区添加一个字节。回到“等待”状态。
  • 状态“错误”:抱怨。等待 deus ex machina 回到“等待”状态。

因此,由此得出的基本见解是,您需要起始位才能使接收字节的代码继续运行。并且停止位很重要,因此您可以可靠地看到下一个字节的起始位。

于 2012-10-14T20:51:50.427 回答
0

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

于 2017-01-25T20:46:33.083 回答