虚拟电子秤之Atl实现02

来源:互联网 发布:用记事本写c语言 编辑:程序博客网 时间:2024/05/17 04:19

这几天,一直在看OLE和ATL书,公司要上一个工业新项目,时间不是很紧,我准备用Flash连接C++解决。话说现在的Flash不比当年,大致看了一下AS3的语法,就是Java翻版,连FB4编译器也是eclipse改的。记得好像以前的Flash中可以嵌入COM组件,现在应该也可以吧,但是这个可能性坚定了我搞定ATL的决心。于是还是这个电子秤项目先入手。

电子秤是大众化的叫法,其实是由2个部分组成的,称重传感器和表头。称重传感器通过电桥将压力转换成mV信号,表头解析mV信号,将读数显示或传递给用户,虚拟电子秤模拟的是表头工作。

现在市场上带串口的电子秤表头主要有2中工作方式:

主动模式,表头按照用户设定的频率(比如一秒20次)将称重读数通过串口发送出去,它只管发送,不管用户是否收到。

被动模式,表头等待用户的指令(通过串口线),随后做出响应。用户可能要求读数,表头就将读数发送出去;用户也可能要求清零,表头照做,随后通知用户做好了。

虚拟电子秤有如下接口:

 

表头对象:CScaleXXX

IScaleSet 相当于操作面板,用于设置参数,min,max范围,波特率,当前重量,工作开关

IScaleRun 内部使用,被内部服务线程使用,用于解析传入的字符串,分析用户需求,将当前重量转换成字符串的形式,各个品牌的表头应该有一套独立的接口实现

IScaleThreadPort用于管理线程的生死,线程调用此接口回传IScaleThreadControl

 

自动服务线程对象:相当于表头里的发动机,用以监听端口,收发字符串,该线程由IScaleSet::Run()方法创建

IScaleThreadControl:类似于sink,用来接收表头对象传来的停机信号

 

昨天创建了表头对象,并且使用CComGITPtr和IGlobalInterfaceTable居然死机,后来发现是Run()锁定,GIT可能也要调用QueryInterface,并且没有使用FTM

今天换了IStream做Marshal居然好像创建了2个对象,被传递对象可以被还原成IScaleSet,但是无法通过它访问到IScaleRun,并且IScaleSet上调用的函数无法在主线程得到反映,而主线程中是可以做到的

继续建造中