接着前面4篇SECS/GEM开发教程系列。

  1. 基于SECS协议开发的简明教程(1)-怎么搭建支持SECS工程
  2. 基于SECS协议开发的简明教程(2)-怎么编辑交换数据的ID
  3. 基于SECS协议开发的简明教程(3)-怎么收/发控制命令和数据消息
  4. 基于SECS协议开发的简明教程(4)-怎么添加处理自定义SnFn消息

本文主讲SEMI的基于SECS协议开发的最关键一步——如何重写SnFn,并自己解析收到的数据内容。

其实就只需要用的以下7个基类方法,便可熟练完成收到的SnFn数据的解析

public://return: LIST, if List, outCnt=Item Count, else ItemFormat, outCnt=bytesListItemData * GetDataType(HSMSHeader* hdr,eFormatCode &outFC, int &outCnt);ListItemData *FindFirstItem(HSMSHeader* hdr, eFormatCode &outFC, int &outLen);ListItemData *FindNextItem(eFormatCode &outFC, int &outLen);public://overload, same as above// if return true, the data info storaged in the second paramter: item// if return false, no data or illegal databool GetDataType(HSMSHeader* hdr,ItemData &item);bool  FindFirstItem(HSMSHeader* hdr, ItemData &item);bool  FindNextItem(ItemData &item);//For Nested List_1.ListItemData *GetChildSiblingItem_N(ListItemData* entry, eFormatCode &outFC, int &outLen);

还是举例说明:

我们以S10F3,接收单文本消息,并显示在操作界面为例。自然是要解析数据,当然你要重写一下S10F3的实现体了,具体如下:


//显示远程发来的消息并显示在面板上
int CMainClassName::S10F3(HSMSHeader *pHdr, HCOMM hComm)
{ItemData item;BYTE ACKC = 0;bool bFindCmd = false;SenderBuffer sender(this);HSMSHeader header = (*pHdr);bool bRet = GetDataType(pHdr, item); //返回true则数据在item指示,返回false无数据char buf[2048] = { 0 };CStringA str;//数据格式参照E5的S10F3对照,一一对应if (bRet && LIST == item.format){bool bRet = FindFirstItem(pHdr, item);if (bRet) str = "S10F3\n";while (bRet){if (BINARY == item.format){CStringA TID;TID.Format("TID: %d\n", GetIntData(INT_1B, item.data));str += TID;bFindCmd = true;}if (ASCII == item.format){memcpy(buf, item.data, item.len);CString s(buf);str += "TEXT: ";str += s;str += "\n";bFindCmd = true;}bRet = FindNextItem(item);}}//这一段是回复后台的sender.Begin();get_header_of_Data_message_reply(header);sender.Add_HSMSHeader(&header);sender.Add_ITEM_Header(BINARY, 1);bFindCmd ? ACKC = 0 : ACKC = 1;sender.Add_BINARY(ACKC);sender.End();sender.Send();//显示在面板上USES_CONVERSION;m_panel.SetWindowText(A2T(str));return 0;
}

再举例讲一个,S2F41,远程命令相关的,同样也是override一下S2F41。然后判断数据的类型是否是E5里面S2F41的LIST,然后对照着LIST的各个item的类型和含义去解析。


int CMainClassName::S2F41(HSMSHeader *pHdr, HCOMM hComm)
{ItemData item;BYTE HCAK = 0;SenderBuffer sender(this);HSMSHeader header = (*pHdr);bool bRet = GetDataType(pHdr, item);bool bFindCmd = false;CStringA cmdstr;BYTE *pCount = NULL;int nCount = 0; if (bRet && item.format == LIST){bRet = FindFirstItem(pHdr, item);if (bRet) cmdstr = "S2F41\n";if (ASCII == item.format){char *pdata = (char *)malloc(item.len + 1);ZeroMemory(pdata, item.len + 1);memcpy(pdata, item.data, item.len);CStringA data(pdata);data.Trim();  data.MakeUpper();if (-1 != data.Find("START")){bFindCmd = true;//::MessageBox(NULL, "Remote CMD: START", "EQP Demo", 0);}else if (-1 != data.Find("STOP")){bFindCmd = true;//::MessageBox(NULL, "Remote CMD: STOP", "EQP Demo", 0);}else if (-1 != data.Find("PAUSE")){bFindCmd = true;//::MessageBox(NULL, "Remote CMD: PAUSE", "EQP Demo", 0);}else if (-1 != data.Find("RESUME")){bFindCmd = true;//::MessageBox(NULL, "Remote CMD: RESUME", "EQP Demo", 0);}else{}}}//以下部分是收到数据,给HOST的应答sender.Begin();get_header_of_Data_message_reply(header);sender.Add_HSMSHeader(&header);sender.Add_LIST_Header(2);sender.BeginList();sender.Add_ITEM_Header(BINARY, 1);bFindCmd ? HCAK = 0 : HCAK = 6;sender.Add_BINARY(HCAK);sender.Add_LIST_Header(0);sender.BeginList();sender.EndList();sender.EndList();sender.End();sender.Sender();return 0;
}

其实最详细的解析过程,在附带Demo里面的secs_Logs.cpp里面的两个方法,有最为详细的过程,可以参照。

void ParseToLogfile(HSMSHeader *pHdr);
void GenerateLogString(ListItemData* entry, eFormatCode fc,int Len,int blanks);

因为两个接口是把接收到的数据写入.log日志的,所以它自然包含了完整的数据解析。

这部分也可以下载SECS SDK复制附带的Demo里面的代码。

如有疑问或咨询,请评论留言或在CSDN站内消息联系。

基于SECS协议开发的简明教程(5)相关推荐

  1. 基于SECS协议开发的简明教程

    很有必要把苦程序员久矣的SECS/GEM了结了,于是诞生了本系列文章八篇和开发包,不需要看近500页PDF就可以轻松完成SECS功能支持. 0.SECS SDK 开发包 这个开发包是对SEMI SEC ...

  2. 基于SECS协议开发的简明教程(7)

    接着前面6篇SECS/GEM开发教程系列. 基于SECS协议开发的简明教程(1)-怎么搭建支持SECS工程 基于SECS协议开发的简明教程(2)-怎么编辑交换数据的ID 基于SECS协议开发的简明教程 ...

  3. 基于SECS协议开发的简明教程(6)

    接着前面的五篇SECS/GEM协议开发的系列文章,继续讲本SECS SDK的以下几个功能 怎么触发警报.解除警报(EQP端) 怎么定义Trace(Host端),怎么触发Trace数据(EQP端) 怎么 ...

  4. 基于SECS协议开发的简明教程(4)

    本文的基础是前面的三篇,建议先花几分钟过一遍大概,然后接着看本篇,更系统化. 基于SECS协议开发的简明教程(1)-怎么利用SECS SDK搭建工程 基于SECS协议开发的简明教程(2)-怎么编辑交换 ...

  5. 基于SECS协议开发的简明教程(8)

    接着前面7篇SECS/GEM开发教程系列,但本文的主要主题是纠偏解惑. 一.怎么做才能快速支持SECS呢? 许多网友发私信问了我许多问题,发现大家把重点都放在了怎么主动收/发数据上了,这确确实实把大方 ...

  6. 基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

    基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年 ...

  7. 【绿冰壶的脚本小屋】第二期:基于icmp协议开发简易ping工具

    [绿冰壶的脚本小屋]第二期:基于ICMP协议开发简易ping工具 任务目标:编写程序使用 ICMP 协议探测主机是否存活 任务要求: 1.理解ICMP协议的原理 2.实现代码,尽可能多的实现探测主机是 ...

  8. java实现基于SGIP协议开发联通短信的方法

    本文实例讲述了java实现基于SGIP协议开发联通短信的方法.分享给大家供大家参考.具体如下: 近段时间,由于公司的业务需要,开发出了联通短信.此文章的编写也是根据网上的一些示例来完成的.闲话少说,下 ...

  9. 视频教程-区块链项目:基于以太坊开发拍卖系统DApp教程(含资料)-区块链

    区块链项目:基于以太坊开发拍卖系统DApp教程(含资料) 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动 ...

最新文章

  1. 初三女生学计算机专业,江西中专初三毕业学计算机专业适宜女生吗
  2. activiti实战系列 并行网关(parallelGateWay)
  3. 【Linux 内核 内存管理】RCU 机制 ③ ( RCU 模式下添加链表项 list_add_rcu 函数 | RCU 模式下删除链表项 list_del_rcu 函数 )
  4. Excel信息提取之二
  5. HDU 4879 ZCC loves march (并查集,set,map)
  6. 初识Mysql(part12)--我需要知道的3条Mysql语句之插入数据
  7. C语言中#define中的一些特殊用法
  8. 为什么TCP是三次握手
  9. 全国高校计算机课程教学系列报告会,西安交大承办2013年全国高校物理课程教学系列报告会...
  10. 大量数据通过Phoenix插入到hbase报错记录(2)
  11. 无法关闭microsoft word_仅记录word文档损坏后的挣扎(亲历)
  12. Java 常用正则表达式搜集ing
  13. 用枚举法实现单例设计模型
  14. linux下oracle安装教程
  15. java 算法之斐波那契数列
  16. fiddler提示the system proxy was changed,Click to reanable capturing.导致无法抓包
  17. 新手看过来----讨厌的运算符
  18. 困扰了已久的TCP/IP 协议,终于有人讲的明明白白,太强了
  19. python将.mat文件转换为.txt
  20. %m.ne用法与讲解

热门文章

  1. Linux服务器记录并查询历史操作记录
  2. 秒懂设计模式之抽象工厂模式(Abstract Factory Pattern)
  3. python 画图--饼图
  4. JS instanceof用法
  5. PHP游戏人物解锁,火影忍者疾风传究极忍者风暴革命人物解锁方法介绍
  6. moos-ivp 下载编译运行
  7. 计算机学院指导报告,计算机科学与工程学院举办“国际级大咖面对面指导你撰写高水平论文”专题报告会...
  8. 小鸟从不怕树枝折断,因为它有翅膀
  9. 传说她是南京理工大学校花
  10. 维思营销策划网:中英文旅游网站策划方案