gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:45:14 24 4
gpt4 key购买 nike

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

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

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

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

我希望我是有道理的...感谢您的帮助。

最佳答案

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

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

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

    关于asynchronous - 如何识别异步串行位流中的起始位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886026/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com