WinCE工控主板获取主板电压和CPU温度的方法

 2020-4-23 17:00:40     作者:刘乾坤    
文章标签:C/C++

  英创WinCE工控主板在系统后,会实时测量主板供电电压、主板温度以及CPU温度等参数,并保存到指定的内存映射文件对像中,应用程序可通过相应的内存映射文件对像快速访问这些硬件参数。下表是系统目前支持的硬件参数项以及对应的内存映射文件对像名称。


硬件参数内存映射文件对像名称数据更新频率
CPU温度L"\\hwmon\\CPUTEMP"5次/秒
主板温度L"\\hwmon\\BoardTEMP"1次/秒
主板供电电压L"\\hwmon\\vcc"1次/秒


  内存映射文件提供一种完全不同的读写文件的方法,它是将文件内容映射到内存中的某个区域,读写文件直接操作内存即可,操作十分简介、高效。以获取ESM7000工控主板CPU温度值为例的操作流程如下:

  1、使用CreateFileMapping函数打开名称为L"\\hwmon\\CPUTEMP"的内存映射文件对像,如果返回失败则表明系统不支持当前参数。

  2、通过MapViewOfFile函数获取内存映射文件对像的数据内存指针。

  3、读取指针内容获取CPU温度值。

  4、操作结束后使用UnmapViewOfFile函数取消内存视图映射。

  5、关闭之前CreateFileMapping函数打开的文件句柄。


  完整的操作代码如下:


#include "stdafx.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
       HANDLE       hMapFile1, hMapFile2, hMapFile3;
       BYTE      *pData1 = NULL, *pData2 = NULL, *pData3 = NULL;
       INT32    dwVcc = 0, dwBoardTEMP = 0, dwCPUTEMP = 0, i;
       TCHAR  szBuf[128];
 
       hMapFile1 = CreateFileMapping((HANDLE)(INVALID_HANDLE_VALUE), NULL, PAGE_READONLY, 0, 64, L"\\hwmon\\vcc");
       if(hMapFile1 != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
              pData1 = (BYTE *)MapViewOfFile(hMapFile1, FILE_MAP_READ, 0, 0, 64);
 
       hMapFile2 = CreateFileMapping((HANDLE)(INVALID_HANDLE_VALUE), NULL, PAGE_READONLY, 0, 64, L"\\hwmon\\BoardTEMP");
       if(hMapFile2 != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
              pData2 = (BYTE *)MapViewOfFile(hMapFile2, FILE_MAP_READ, 0, 0, 64);
 
       hMapFile3 = CreateFileMapping((HANDLE)(INVALID_HANDLE_VALUE), NULL, PAGE_READONLY, 0, 64, L"\\hwmon\\CPUTEMP");
       if(hMapFile3 != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
              pData3 = (BYTE *)MapViewOfFile(hMapFile3, FILE_MAP_READ, 0, 0, 64);
 
       for(i=0; i<5; i++)
       {
              if(pData1)
                     memcpy(&dwVcc, pData1, 4);
              if(pData2)
                     memcpy(&dwBoardTEMP, pData2, 4);
              if(pData3)
                     memcpy(&dwCPUTEMP, pData3, 4);
 
              wsprintf(szBuf, TEXT("CPU:%2.1fC Board:%2.1fC VCC=%1.2fV"), (dwCPUTEMP/1000.0), (dwBoardTEMP/1000.0),(dwVcc/1000.0));
              RETAILMSG(1, (TEXT("%s\r\n"), szBuf));
              Sleep(1000);
       }
 
       if(pData1)
              UnmapViewOfFile(pData1);
       if(pData2)
              UnmapViewOfFile(pData2);
       if(pData3)
              UnmapViewOfFile(pData3);
       if(hMapFile1 != NULL)
              CloseHandle(hMapFile1);
       if(hMapFile2 != NULL)
              CloseHandle(hMapFile2);
       if(hMapFile3 != NULL)
              CloseHandle(hMapFile3);
 
       return 0;
}


  英创ESMARC系列工控主板在升级到最新内核后都可支持通过内存映射文件方式获取主板相关硬件参数。

文章标签:C/C++