我很难找到一种重启状态机的方法。换句话说,我得到的一些东西:
我有一个模块,当上电时,它保持0.5秒的去抖动时间,然后进入状态机:首先发送string#anotherstring#,然后启动某个周期的计时器,当计时器到期时,它转换模拟信号/读取数据(SPI,I2C),然后发送该数据,然后发送另一个#。状态机返回并再次启动计时器并再次发送数据...
在另一个芯片上。我从该模块接收信息。所以这是一个状态机,它完成第一个字符串,第二个字符串,然后在缓冲区中一次又一次地累加值。
在某个时刻,一些外部设备请求数据,当芯片进行一些计算并发送数据的时刻。
到目前一切尚好。当模块断开连接时,除部分外,每个部分都在工作。好的,你可以说没有问题,没有数据被发送。是的,这是真的,但是如果模块连接回来会发生什么呢?到目前为止,为了测试我的工作,我已经重置了芯片,断开并连接了模块。通过这样做,芯片处于第一状态,模块从第一状态转到第一状态,一切正常。
我的问题是如何确定设备何时与芯片断开连接,以重新启动芯片状态机并等待string#anotherstring#组合(第一状态)。
另一个问题是如何确定通信是否中断,而不是断电。当恢复通信时,数据应该再次发送,最好是两个模块都从初始化状态转到。
我的想法是从芯片向模块发送一些ack。但我不知道具体是怎么做到的。基本上,我想要的是:当模块断开时,它的状态机显然会重新开始,而我想要的芯片状态又回到了初始状态。如果模块的通信被拔出,那么两个状态机如何重新开始。
我不知道我是否清楚这一点。但如果有问题,请提出来。如果我发现了什么,我会带着编辑来的。
其他信息:模块和芯片是一些微控制器,通信是UART。
发布于 2014-06-12 23:24:39
让我勾勒出一个您可以在接收端使用的基本方案:
在接收端,如果在合理的时间范围内没有收到有效/完整的消息,则需要超时。这样,您将在任何时间点检测到模块由于任何原因而离线。
在这种情况下,接收和处理消息的状态机也将被重置。这意味着您将拥有一个计时器,例如,当接收到数据时启动计时器,当正确且完全接收到消息时停止计时器。如果计时器超时,则当前正在接收的任何消息都将被声明为无效并被丢弃,并且接收方返回到开始处,查找下一条消息。
然后,您必须在接收器中实现代码,以检测消息何时开始和/或结束。因此,如果模块总是从发送string#anotherstring#开始,那么接收方将等待,直到它看到string#;接收方会忽略接收到的任何其他内容。只有在检测到预期的前缀之后,才完成消息接收的其余部分。
在整个过程中,接收方的消息超时定时器被激活,并且如果没有及时接收到消息的任何部分,则接收方承担传输问题并返回等待下一条消息的开始。
https://stackoverflow.com/questions/24171933
复制相似问题