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;
}