英创信息技术ARM9工控板在远程监控领域的应用

英创arm9工控主板的数据采集功能通常采用板上的gpio实现数字输入输出、通过精简isa总线扩展相应的ad或da实现模拟数据的输入输出。在英创arm9工控主板提供的基本开发资料中对gpio和精简isa总线的驱动均以c的静态库的形式提供,对部分使用c#、labview等其他开发工具的客户来说,不能直接使用c的api函数。针对这一部分客户的应用需求,我们把相关c函数库封装成标准com组件,使客户能方便使用主板的数据采集功能。本文将详细介绍数据采集com组件的相关技术要点,供广大客户使用时参考。
com(component object model),即组件对象模型,是微软公司开发的一种新的软件开发技术,提出了组件之间进行交互的规范,也提供了实现交互的环境,因为组件对象之间交互的规范不依赖于任何特定的语言,所以com也可以是不同语言协作开发的一种标准,如vb、c#、labview可以使用同一个com组件来进行软件开发。com组件的整体结构大概分为三个层次:组件、接口、方法函数,它们的关系如下图所示:
com组件与我们常用的c++类的关系,可以简单的理解为:
com组件名:即c++库文件名称
com组件接口:即c++库中的类
com组件实现方法函数:即c++中的类的成员函数
下面以em9000的em9000_isa_api.lib静态库为例,介绍在evc开发环境,如何在em9000_isa_api.lib静态库的基础上构建相应的com组件,该方法也可同样应用于英创公司的其他arm9工控主板产品。
1、新建一个工程,在新建工程中选择wce atl com appwizard,并给工程命名为“em9000_isa_api_com”,工程会自动生成一个文件来。在工程编译后,将生成“em9000_isa_api_com.dll”库文件。这个文件就是要用的com组件的目标文件。
2、设置好以后,点击“ok”进入工程的类型选项,在这里,选择动态链接库并将对mfc的支持选择上。即完成工程的建立。
3、将英创提供的em9000_isa_api.h文件复制到当前这个工程目录下面,并在工程的“settings”下面的link中加入“em9000_isa_api.lib”。
4、为com组件添加接口:这个接口名就是在调用com组件时的入口名字,在工程中命为em9000_isa_com,添加接口的方法是:insert -> new alt object…,在弹出来的对话框中,直接点击下一步,这时会再弹出一个对话框,这时,在对话框的name表单的左上角框中输出接口名em9000_isa_com,这时会生成相应的接口的名字,左边是c++调用的头文件及库,右边是com组件的接口文件名。系统会自动地在接口名interface项前加上一个大写字符“i”。
在工程对话框的attributes选项中,将threading model中选择“free”。确定即可。
5、为该com组件添加方法函数:将em9000_isa_api.h中的函数添加到com组件中去。要注意一点,由于在制作com组件过程中,com组件实现的方法函数会调用em9000_isa_api.h中的函数且方法函数名和要调用的函数不能同名,所以在com组件的方法函数名前加前缀“com_”以便区分。在工程的workspace的classview中,单击com组件的接口名“iem9000_isa_com”并单击右键选择“add method…”,弹出添加方法函数的对话框。
如将em9000_isa_api.h中的getportstate( int port )函数添加进去。这里方法函数为就变为“com_getportstate”,参数则有两个,一个是输入参数,用[in]关键字说明,一个是函数返回值,用[out,retval]关键字说明,除了返回值的参数名外,其它的输入输出参数最好和函数的参数一样。参数类型均为”long”,可以参考:http://www.vckbase.com/document/viewdoc/?id=1488。
输入完毕后,点击“ok”完成,这时可以看见新增加的这个方法函数出现在工程中了。双击接口名“iem9000_isa_com”,就会看到该方法函数在文件中的定义:
interface iem9000_isa_com : idispatch
{
[id(1), helpstring('method com_getportstate')] hresult com_getportstate([in] long port , [out,retval] long *pval);
};
6、双击cem9000_com下的iem9000_isa_com的方法函数名“com_getportstate(long port,long *val)”,这时就打开具体实现的源文件em9000_isa_com.cpp文件。在文件中加入:#include 'em9000_isa_api.h',并且在fileview的头文件中加入该文件。
这时将com_getportstate方法函数的实现完成,即调用em9000_isa_api.h中相应的函数完成功能。
stdmethodimp cem9000_isa_com::com_getportstate(long port, long *pval)
{
afx_manage_state(afxgetstaticmodulestate())
// todo: add your implementation code here
*pval = getportstate( port );
return s_ok;
}
到这里,就完成了对静态库中的一个函数转成com组件的方法函数的基本操作,依照上述方法,将其它的函数需要加入到com组件中,只需重复第5、6步的操作就行了。注意,最后还需要加入出错处理的方法函数:
方法函数名:_com_issue_errorex
参数:hresult _hr1 , iunknown *pthis1 , const guid refiid1
通过编译生成com组件em9000_isa_api_com.dll。
我们所提供的com组件“em9000_isa_api_com.dll”的文件说明:
com组件文件名:em9000_isa_api_com.dll
com组件接口名:em9000_isa_com
com组件方法函数和em9000_isa_api静态库函数的对应关系如下:
com组件方法函数名
库态库函数名
功能描述
com_initem9000isa( ) initem9000isa( ) 初始化em9000的isa总线
com_getportstate( int port ) getportstate( int port ) 查询port设置状态
com_swap2isa( int port ) swap2isa( int port ) 把port设置为isa总线
com_swap2dio( int port ) swap2dio( int port ) 把port设置为dio功能
com_setportdir( int port, int mode ) setportdir( int port, int mode ) 把port对应管脚设置为dio状态
com_em9000_inb( int port ) em9000_inb( int port ) 把port对应管脚设置为dio状态
com_em9000_outb( int port, uchar value ) em9000_outb( int port, uchar value ) 把value输出到port对应管脚
com_em9000_read( int nseg, uint noffset ) em9000_read( int nseg, uint noffset ) 从isa扩展总线某地址读取一个字节的数据
com_em9000_write( int nseg, uint noffset, uchar value ) em9000_write( int nseg, uint noffset, uchar value ) 向isa扩展总线某地址写入一个字节的数据
com_em9000_resetisa( int milliseconds ) em9000_resetisa( int milliseconds ) 使rstout#输出低脉冲milliseconds毫秒
com_em9000_pwmout( int chidx, float* pfreq, float* pduty ) em9000_pwmout( int chidx, float* pfreq, float* pduty ) 使能并输出脉宽调制信号
com_em9000_pwmstop( int chidx ) em9000_pwmstop( int chidx ) 停止输出脉宽调制信号
com_em9000_startwatchdog( ) em9000_startwatchdog( ) 启动系统watch dog timer
com_em9000_kickthedog( ) em9000_kickthedog( ) 重载系统watch dog timer
com_em9000_resetby( ) em9000_resetby( ) 返回上次复位产生的原因
com_em9000_delayinus(int microseconds ) em9000_delayinus(int microseconds ) 微秒延时
下面以evc开发环境为基于mfc编程,调用em9000_isa_api_com.dll实现gpio操作为例,对如何使用com组件“em9000_isa_api_com.dll”进行说明,以更指导客户方便地使用com组件来完成自有产品的开发。
在evc中调用com组件,需按如下基本步骤来完成:
1、注册com组件
运行英创公司提供的regsvr32程序进行com组件的注册
2、初始化组件,并创建一个实体对像
(1)在测试文件的头文件中,先定义所需要的对像及变量:
首先,先将com组件em9000_isa_api_com.dll文件放在当前的工程目录下,同时要在工程的stdafx.h文件中,添加导入com组件文件的语句:
#import “em9000_isa_api_com.dll” no_namespace
// 如果com组件文件没在当前应用的工程目录下面,则需要写出com组件文件所在的路径
然后在测试工程文件头com_testdlg.h中,在ccom_testdlg类中进行定义:
private:
clsid clsid; // 用以缓存所查询到的com组件的标识
iem9000_isa_com *m_psimple; // 利用com组件接口定义一个指针
(2)完成com组件的初始化:
在测试工程文件com_testdlg.cpp中,在bool ccom_testdlg::oninitdialog()过程中完成初始化部份
hresult hr;
coinitializeex(null,coinit_multithreaded) ;//初始化com组件以便创建线程
hr = clsidfromprogid( olestr ( 'em9000_isa_api_com. em9000_isa_com ' ) , &clsid );
// 查找组件是否存在,并获取组件的标识,这里的参数为:com组件名字.接口名
c, ocreateinstance ( clsid , null , clsctx_inproc_server , _uuidof ( i em9000_isa_com ) , ( void** ) &m_psimple );
// 利用查找组件时所获得的标识创建实体对像,并交给指针。这里的第四个参数为组件的接口名
3、调用com组件中的方法函数
利用, , 所定义的接口指针*m_psimple,在事件中调用相应的函数。如要调用com_getportstate方法函数来获取gpio(p4口)的状态,则可以如下方式来实现调用:
#define p4 4
int istate ;
istate= m_psimple-> com_getportstate (p4); // 调用成员函数读出gpio(p4口)的状态
4、当使用后,应当释放com组件
couninitialize(); // 释放com组件

防止电源线引起的电压波动
比特币核心开发商LukeDash Jr希望将比特币链的块大小缩小到300KB
百威利用人工智能改造啤酒行业的发展场景
黑莓近年转型有成 下一步将聚焦物联网市场
树校企联合典范,第二届TI西电卓越工程师培养计划圆满落幕
英创信息技术ARM9工控板在远程监控领域的应用
一加7T和一加7T Pro的外观曝光区别在于摄像头的设计
如何计算地平面上方走线的电感?
感受一下“无脸”手表无限创意
智能太阳镜:让色盲者的世界重现色彩
国芯思辰|拍字节新型3D铁电存储器(VFRAM)PB85RS128C在车身控制器上的应用,内存达128K,支持SPI接口输出
nubiaZ9拆解 这才是无边框手机真正的价值所在
软通动力与深圳大学达成战略合作 全力打造OpenHarmony人才培养体系
诚邀您参加2023云栖大会平头哥专场——以芯重塑云存储系统效能
经纬恒润助力国产MCU芯片MCAL测试方案落地
SensorBox解决了LoRa物联网“碎片化”难题
合理价位HP8510C HP8510C矢量网络分析仪HP8510C
图尔克新一代智能温度传感器TS400/500
BUCK开关电源的组成部分 BUCK开关电源中的功率损耗
GUI HMI_Board_LVGL健康监控设备设计