提升::状态图 ---发布"serial timeout"事件

boost::statechart ---posting a "serial timeout" event

本文关键字:timeout 事件 serial ---发布 状态图 提升      更新时间:2023-10-16

我一直在使用boost的异步状态图来编写程序。在这个程序中,我使用异步串行端口与另一个设备通信。我有一个状态,等待设备通过串行端口确认,然后发布"收到确认"事件。这工作得很好,但是,我也想实现一个"超时"事件。

在之前的程序中,我一直在我的状态机中使用switch case语句,其中我的代码可以在每次循环运行时运行。这意味着我可以运行代码并检查是否应该由于超时而更改状态。这样的:

while(1){
    switch (state){
        case 0:{
            sendMessage();
            state = 1;
            sendTime = boost::chrono::steady_clock::now();
        }
        break;
        case 1:{
            if (isConfirmationReceived()){
                // do something
                state = 2;
            }
            else if (boost::chrono::steady_clock::now() > sendTime + boost::chrono::duration<double>(WAIT_LENGTH)){
                //raise a time out error
                state = 3;
            }
        }
        break;
        // etc etc
    }
}

我如何实现这样的东西使用boost::StateChart?我是否应该换个角度思考这件事?

我不知道这是否是最佳实践,但我通过定期(1ms或其他)发送我的SM EvTick事件并在超级状态下处理事件来解决这个问题。您还可以添加ClearTimeout() SetTimeout()DisableTimeout()成员函数,并像这样访问它们:

context< TimeoutSuperState >().SetTimeout(1000);

您可以让超状态在超时时转换到错误状态,或者将EvOnTimeout发送到SM,这可以根据状态进行不同的处理。