首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别异步串行比特流中的起始位

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

Stack Overflow用户
提问于 2012-10-15 04:05:10
回答 2查看 2.5K关注 0票数 4

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

我可以识别导线上从低/高(无论哪种方式)的过渡,因此我可以找到位边界。如果我知道设备正在使用的波特率,我就可以开始关闭比特,这样我就可以读取来自设备的比特流。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-15 04:51:50

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2017-01-26 04:46:33

我会让你的程序在一个点或另一个点读取序列和解密模式,来回移动9位,数据将有意义,这取决于你正在传输的链。一旦识别出一种模式,可能会识别出数据是否有一个周期,然后我会查看是否在任何点上使一个字节与周期代码(ascii 46)匹配的位线,然后来回计数空格,并建立开始位和结束位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12886026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档