工控网首页
>

应用设计

>

EM335x主板c的高级应用

EM335x主板c的高级应用

  对工控主板EM335x精简ISA扩展总线基本读写操作的介绍,已包含在EM335x编程手册中。本文将介绍在Windows CE平台上,通过精简ISA总线进行数据块读写的方法。所谓数据块读写,是指一次API调用对一个地址端口读写多个数据的操作。数据块读写能有效提高数据读写的效率,在数据采集传输中有广泛的应用。

  要对ISA总线进行读写,首先需要打开设备文件“ISA1:”如下:

  打开ISA文件

  HANDLE hISA;

  hISA = CreateFile(_T('ISA1:'), // name of device

    GENERIC_READ|GENERIC_WRITE, // desired access

    FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode

    NULL, // security attributes (ignored)

    OPEN_EXISTING, // creation disposition

    FILE_FLAG_RANDOM_ACCESS, // flags/attributes

    NULL); // template file (ignored)

  数据块读写功能是通过设备驱动的DeviceIoControl来完成的,需要用到以下数据结构:

  typedef struct

  {

    PBYTE pReadBuf; // ISA读数据buffer, 只能一个buffer有效

    PBYTE pWriteBuf; // ISA写数据buffer, 只能一个buffer有效

    DWORD dwDataLength; // length of data in byte

    DWORD dwDataPortOfs; // 读写的起始地址 = 0x00 – 0xFF

    DWORD dwInc; // = 0: 固定地址, > 0: 读写后地址自动增加

  } ISA_BLOCK_INFO, *PISA_BLOCK_INFO;

  在上述数据结构中:

  pReadBuf为进行读操作时的数据buffer,读操作具体为8-bit数据读。注意:数据结构中,pReadBuf和pWrietBuf只能有一个有效。

  pWriteBuf为进行写操作时的数据buffer,写操作具体为8-bit数据读。注意:数据结构中,pReadBuf和pWrietBuf只能有一个有效。

  dwDataPortOfs为读写的端口地址,范围为0x00 – 0xFF。

  dwDataLength为本数据块读或写的字节数。

  dwInc为每次读写后,地址的自动增量,dwInc = 0:表示固定地址读写,dwInc > 0: 表示每次读写后,地址会自动增加dwInc,作为下一次的读写地址。当地址超过0xFF时,会折回到地址0x00。

  如果要进行单一数据块读写功能,只需定义一个ISA_BLOCK_INFO结构变量,如BlockInfo,并按照应用需求填写相应的参数。然后就可调用系统API进行设置了:

  ISA_BLOCK_INFO BlockInfo;

  memset(&BlockInfo, 0, sizeof(ISA_BLOCK_INFO));

  // 填写输入参数值BlockInfo...

  对读操作,直接调用标准读函数:

  DWORD dwNbBytesRead = 0;

  BOOL bRet = ReadFile(hISA, // 打开“ISA1:”返回的Handler

    &BlockInfo, // 输入数据结构指针

    sizeof(ISA_BLOCK_INFO), // 数据结构Size

    &dwNbByteRead, NULL);

  对写操作则为:

  DWORD dwNbBytesWritten = 0;

  BOOL bRet = WriteFile(hISA, // 打开“ISA1:”返回的Handler

    &BlockInfo, // 输入数据结构指针

    sizeof(ISA_BLOCK_INFO), // 数据结构Size

    &dwNbByteWritten, NULL);

  如果要执行混合的数据块的读写操作,则需要定义ISA_BLOCK_INFO数组,并根据实际应用填写数组参数。例如需要进行3组数据块读写,实现代码如下:

  ISA_BLOCK_INFO BlockInfo[3];

  DWORD dwTotalSize = sizeof(ISA_BLOCK_INFO) * 3;

  memset(BlockInfo, 0, dwTotalSize);

  // 填写输入参数值BlockInfo...

  BOOL bRet = DeviceIoControl(hISA, // 打开“ISA1:”返回的Handler

    0, // 无需定义命令码,置为0

    (LPVOID)BlockInfo, // 块读写数据结构变量指针

    dwTotalSize, // 整个结构数组的size

    NULL, 0, // 不使用这组参数

    NULL, NULL);

  

  上述操作的主要特点是提高访问ISA总线的效率,因为每次调用驱动程序API,都会有一个几微秒的系统开销。对多字节的数据块读写,这样的开销应用程序就需要注意,否则会发现CPU的负载不合理的升高。

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

Windows下STM32单片机eclipse编译环境搭建

Android Studio应用开发简介

WinCE工控主板WiFi解决方案

敬请关注成都英创微信公众号

WinCE工控主板通过PPI协议连接西门子PLC