0

我很难找到一种方法来重新启动我的状态机。换句话说,我所拥有的一部分:

我有一个模块,当它通电时它会保持 0.5 秒的去抖时间,然后它进入状态机:首先它发送一个字符串#anotherstring#,然后他启动一个一段时间的计时器,当计时器过去时,它转换模拟信号/读取数据(SPI,I2C)并发送该数据,然后是另一个#。状态机返回并再次启动计时器并再次发送数据......

在另一个芯片上。我从那个模块收到信息。所以这是一个状态机,它完成第一个字符串、第二个字符串,然后一次又一次地在缓冲区中累积值。

在某些外部设备请求数据的时刻,芯片进行一些计算并发送数据的时刻。

到目前为止,一切都很好。除了模块断开连接时,这部分的每个部分都在工作。好的,您可能会说没问题,没有数据发送。是的,这是真的,但是如果模块重新连接会发生什么。到目前为止,为了测试我的工作,我已经重置了芯片断开连接并连接了模块。通过这样做,芯片处于第一个状态,模块从第一个状态进入,一切正常。

我的问题是如何确定设备何时与芯片断开连接以重新启动芯片统计机并等待字符串#anotherstring# 组合(第一个状态)。

另一个问题是如何确定通信是否中断而不是断电。恢复通信时,应再次发送数据,最好是两个模块都从初始化状态开始。

我想到的是从芯片向模块发送一些确认。但我不知道具体如何。基本上我想要这个:当模块断开时,它的状态机显然会重新开始,我想要再次回到初始状态的芯片状态。如果模块的通信被拔掉,那么两个状态机如何重新开始。

我不知道我是否清楚这一点。但请如果有问题问。如果我发现了什么,我会进行编辑。

其他信息:模块和芯片是一些单片机,通讯是UART。

4

1 回答 1

0

让我画一个你可以在接收端使用的基本方案:

在您的接收方,如果在合理的时间范围内没有收到有效/完整的消息,您将需要超时。这样,您将在任何时间点检测到模块何时因任何原因脱机。

在这种情况下,接收和处理消息的状态机也将被重置。这意味着您将拥有一个计时器,例如,它在接收到数据时启动,并在正确且完全接收到消息时停止。如果计时器超时,则当前接收到的任何消息都被声明为无效并被丢弃,并且接收者返回开始,寻找下一条消息。

然后,您必须在接收器中实现代码以检测消息何时开始和/或结束。因此,如果模块总是从发送开始,string#anotherstring#那么接收者将等到它看到string#,例如;接收者忽略其他接收到的任何内容。只有在检测到预期的前缀后,才能完成其余的消息接收。

在整个过程中,接收者的消息超时计时器处于活动状态,如果消息的任何部分没有及时收到,则接收者假定传输有问题并返回等待下一条消息的开始。

于 2014-06-12T15:24:39.110 回答