建议:尝试识别设备何时未连接

时间:2014-06-11 20:23:44

标签: c avr avr-gcc avrdude

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

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

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

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

非常好。当模块断开连接时,这部分工作的每个部分都会工作。好的,你可以说没有问题没有数据发送。是的,这是真的,但如果模块连接回来会发生什么。到目前为止,为了测试我的工作,我重新设计了芯片断开并连接模块。通过这样做,芯片处于第一状态,模块从第一状态开始,一切正常。

我的问题是如何确定何时从芯片中取出设备以重启芯片统计机器并等待字符串#anotherstring#combination(first state)。

另一个问题是如何确定通信是否中断而不是断电。当放回通信时,应该再次发送数据,最好是两个模块从init状态开始。

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

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

其他信息:模块和芯片是一些微控制器,comunicaiton是UART。

1 个答案:

答案 0 :(得分:0)

让我勾勒出你可以在接收方使用的基本方案:

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

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

然后,您必须在接收器中实现代码以检测消息何时开始和/或结束。因此,如果模块始终通过发送string#anotherstring#开始,则接收方将等到它看到string#为止;收到的任何其他内容都会被接收方忽略。只有在检测到预期的前缀后,才会完成剩余的消息接收。

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

相关问题