本文的基础是前面的三篇,建议先花几分钟过一遍大概,然后接着看本篇,更系统化。
- 基于SECS协议开发的简明教程(1)-怎么利用SECS SDK搭建工程
- 基于SECS协议开发的简明教程(2)-怎么编辑交换数据的ID
- 基于SECS协议开发的简明教程(3)-怎么发控制命令和SnFn数据消息
本文讲怎么增加和处理自定义消息。
在第一篇里面已经说过,基类已经把每个SnFn包括控制命令都定义成Virtual了,意味着每一个接口你都可以override,自己按照你自己的想法去重写实现。如果你不重写也有默认的标准协议的实现。所有的标准协议定义的SnFn,函数名就是编号一致的SnFn,不用记忆,一一对应的。如下图所示(只粘贴一部分),全部都是一致的:
virtual int S1F1(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F2(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F3(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F4(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F5(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F6(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F7(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F8(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F9(HSMSHeader *pHdr, HCOMM hComm);
virtual int S1F10(HSMSHeader *pHdr, HCOMM hComm);
对于自定义的Fn大于64的那些SnFn,我们怎么去添加了?SDK怎么帮我们分派到我们的接口里面来呢。这个在SDK的Demo里面已经有给出示例了。
我举例说明:
假如你先自定义S1F65, S1F69,同样你只需要在主窗体类以同名形式在你的派生类中添加上声明,
// ------ UserDefined ------
int SnFn_UserDef(HSMSHeader *pHdr, HCOMM hComm); //必须的
// -------- 你自定义的那一堆SnFn的声明 ----------
int S1F65(HSMSHeader *pHdr, HCOMM hComm);
int S1F69(HSMSHeader *pHdr, HCOMM hComm);
然后添加上实现过程,如下:
//CMainClassName就是你的那个主窗类,自行修改宏定义即可
int CMainClassName::S1F65(HSMSHeader *pHdr, HCOMM hComm)
{
SenderBuffer sender(this);
HSMSHeader header = (*pHdr);
bool bNeedReplyFlag = getReplyFlag(*pHdr);
//to-do
//编写你的代码
return 0;
}
int CMainClassName::S1F69(HSMSHeader *pHdr, HCOMM hComm)
{
SenderBuffer sender(this);
HSMSHeader header = (*pHdr);
bool bNeedReplyFlag = getReplyFlag(*pHdr);
//to-do
//编写你的代码
return 0;
}
留的空位置,就是你自己需要添加的代码。
然后添加上消息的分派过程:
//CMainClassName就是你的那个主窗类,自行修改宏定义即可
//针对自定义的消息,在这里回调分派
int CMainClassName::SnFn_UserDef(HSMSHeader *pHdr, HCOMM hComm)
{
int ret = 0;
int Sn = getStreamNum(*pHdr);
int Fn = getFunctionNum(*pHdr);
int nDeviceId = getDeviceId(*pHdr);
switch (SnFn(Sn, Fn))
{
case SnFn(1, 65):
{
ret = S1F65(pHdr, hComm);
break;
}
case SnFn(1, 69):
{
ret = S1F69(pHdr, hComm);
break;
}
}
return ret;
}
这样,当接收到S1F65或者S1F69,就自动回调到了你的S1F65或S1F69的实现体里面去了。轻轻松松就实现了自定义消息的添加和处理了。
你也可以直接从CSDN下载SECS SDK从里面的Demo去拷贝代码即可。
如有疑问或咨询,请评论留言或在CSDN站内消息联系。
本文含有隐藏内容,请 开通VIP 后查看