FreeModbus学习——portevent事件

FreeModbus版本:1.6

事件类型定义
在mbport.h文件中有事件类型的定义eMBEventType,有事件状态有四种,或者说有四种事件:就绪,帧接收完成,处理,帧发送完成。

typedef enum
{
    EV_READY,                   /*!< Startup finished. */
    EV_FRAME_RECEIVED,          /*!< Frame received. */
    EV_EXECUTE,                 /*!< Execute function. */
    EV_FRAME_SENT               /*!< Frame sent. */
} eMBEventType;

具体来看poetevent.c文件

首先定义了两个静态变量

/* ----------------------- Variables ----------------------------------------*/
static eMBEventType eQueuedEvent;
static BOOL     xEventInQueue;

eQueuedEvent表示队列中的事件,它的值就是上面的那四种状态。
xEventInQueue表示事件是否在队列中。
(可以把队列的长度大小size想象成1)

关于静态变量:
1.作用域:静态变量可以分为两种:
①.文件作用域:定义在函数之外的静态变量,只能在定义它的文件中访问。
②.函数作用域:定义在函数内部的静态变量,只能在定义它的函数中访问。
2.生命周期:静态变量的生命周期从程序开始到程序结束,即它们在程序运行期间一直存在。

即这两个静态变量,如果别的文件想要访问,只能通过函数xMBPortEventPost和xMBPortEventGet来访问。
下面看具体的函数。

Modbus 事件 接口 初始化,只是将xEventInQueue置为FALSE,即事件不在队列中,或者说队列中无事件。

BOOL
xMBPortEventInit( void )
{
    xEventInQueue = FALSE;
    return TRUE;
}

Modbus 事件 接口 Post ,发布事件。eEvent 为要发布的事件,将xEventInQueue 置为TRUE,即队列中有事件了,然后将eEvent赋值给eQueuedEvent ,即队列中的事件为eEvent 。

BOOL
xMBPortEventPost( eMBEventType eEvent )
{
    xEventInQueue = TRUE;
    eQueuedEvent = eEvent;
    return TRUE;
}

Modbus 事件 接口 Get,获取事件。将获取的事件幅值给eEvent 。如果队列中有事件,则就将队列中的事件eQueuedEvent赋值给eEvent ,事件被取走了,那么队列里就没有事件了,所以xEventInQueue = FALSE;。如果队列里没有事件,那么返回值xEventHappened 就没有事件发生,为FALSE。如果在队列里取到事件了,那代表有事件发送,返回值为TRUE。

BOOL
xMBPortEventGet( eMBEventType * eEvent )
{
    BOOL            xEventHappened = FALSE;

    if( xEventInQueue )
    {
        *eEvent = eQueuedEvent;
        xEventInQueue = FALSE;
        xEventHappened = TRUE;
    }
    return xEventHappened;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值