我正在为微处理器编写一些代码,通过单线异步串行通信与外部设备进行通信。
我可以从低/高(任一方向)识别线路上的转换,因此我可以找到位边界。鉴于我知道设备使用的波特率,我可以开始关闭位,这样我就可以读取来自设备的位流。
我在概念上正在努力识别一个起始位 - 找到一个字节帧的开始(假设我得到8位,没有奇偶校验,1个起始位,1个停止位)。我知道每个帧都以一个起始位开始,以一个停止位结束,但我的理解是,起始位和停止位看起来像任何其他位 - 所以没有什么特别的,它们将它们标识为起始位或停止位(除了他们的位置)。
我能想到识别起始位的唯一方法是它将是持续空闲时段之后的第一个高位 - 也就是说,因为我期望8位没有奇偶校验,如果我得到9或更低然后该行空闲,下一个高位将是一个起始位。这一切都很好,但如果我开始在设备中间比特流中听到并且线路上没有9位或更多的空闲时间怎么办?我正在关闭位,但是如何识别哪个位是起始位以便我可以读取一个字节?如果我正在关闭位,那么帧之间的任何东西只能是整数倍的位(因此停止“位”不能是1.5位),所以一切看起来都像位。
我希望我有意义......感谢您的帮助。
答案 0 :(得分:3)
启动位是让你的代码接收字节的原因。最好用状态机解释。你有4个基本状态:
因此,基本的见解是你需要起始位来获取接收字节的代码。并且停止位很重要,因此您可以可靠地查看下一个字节的起始位。
答案 1 :(得分:0)
我会让你的程序在一个点或另一个点读取序列和解密模式,来回移动9位,数据将有意义,这取决于你传输的链。一旦识别出一个模式,也许可以识别数据是否有一个周期,那么我会在任何时候查看使得一个字节与周期代码匹配的位行(ascii 46)然后来回计算空间并建立起始并停止位。