#include <windows.h>
#include "WinIo.h"#pragma comment(lib,"WinIo.lib")int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
DWORD temp_dwPortVal=0;
InitializeWinIo();
SetPortVal(0x6C,0x80,1);//将命令写入命令端口0x6C
SetPortVal(0x68,0x0E7,1);//将要访问的寄存器号写入数据端口0x68
GetPortVal(0x68,&temp_dwPortVal, 1);//将数据从数据端口读出
ShutdownWinIo();
}
这是我用http://topic.csdn.net/t/20040627/13/3126026.html介绍的方法写的,想获取CPU的温度,但读出来的temp_dwPortVal值总是0xffffffff,把读取字节改为4还是一样,我试过用SpeedFan软件可以读出来的,有谁能告诉我怎么读取啊,如有代码还请发给我一份[email protected],非常感谢!

解决方案 »

  1.   

    PMU_SC                        equ            6Ch              ;命令端口  
    PMU_DATA                              equ            68h              ;数据端口  
    RD_EC_SMI                              equ            80h              ;读寄存器命令  
    POLLING_DATA            equ            0E7h            ;CPU温度寄存器号  
    看上面的定义,PMU寄存器读取的步骤是这样的:  
    1.等待输入缓冲器空,即PMU将上一条命令处理完毕;  
    1.将命令(RD_EC_SMI)写入命令端口(PMU_SC);  
    2.等待输入缓冲器空,即PMU将命令(RD_EC_SMI)处理完毕;  
    3.将要访问的寄存器号(POLLING_DATA)写入数据端口(PMU_DATA);  
    4.等待输出缓冲器满,即PMU将从寄存器(POLLING_DATA)读出的数据放到输出缓冲器;  
    5.将数据从数据端口(PMU_DATA)读出。  
    (说明,这里的输入输出缓冲是指的PMU的缓冲。)  
    这样,就完成了一次读操作,写操作和其类似。  
     
    具体代码如下:  
    ;AL-----CPU  Temperature  
    GetCPUTempe  proc  
               pusha  
               pushf  
               cli  
               mov            dx,PMU_SC  
               mov            al,RD_EC_SMI  
               call            pmuWait4IBE            ;Must  have  
               out            dx,al  
     
               mov            dx,PMU_DATA  
               mov            al,POLLING_DATA  
               call            pmuWait4IBE            ;Must  have  
               out            dx,al  
     
               mov            dx,PMU_DATA  
               call            pmuWait4OBF            ;Must  have  
               in            al,dx                        ;Get  Temperature  
               sti  
               popf  
               popa  
    GetCPUTempe  endp  
    ;#########################################################  
    pmuWait4IBE            proc  
                           PUSH            AX  
               PW4IBE:              
                           IN            AL,  06CH                        ;  Read  PMU  status  
                           TEST            AL,  2                                    ;  Is  Input  Buffer  Empty?  
                           JNZ            PW4IBE                                    ;  Jmp  if  no  
                           POP            AX  
                           ret  
    pmuWait4IBE            endp;END  OF  PMUWAIT4IBE  
    ;#########################################################  
    pmuWait4OBF            proc  
                           PUSH            AX  
               PW4OBF:              
                           IN            AL,  06CH                        ;  Read  PMU  status  
                           TEST            AL,  1                                    ;  Is  Output  Buffer  Full?  
                           JZ            PW4OBF                                    ;  Jmp  if  no  
                           POP            AX  
                           ret  
    pmuWait4OBF            endp;END  OF  PMUWAIT4OBF  
    ;#########################################################  
    上面pmuWait4IBE、pmuWait4OBF两个函数就是等待缓冲器的函数,其中都直接读取了命令端口6Ch(PMU_SC)的内容,关于读出的内容的说明可以参见我发的PMU的说明的第18页下面的那张表。  
     
    下面讲一下怎样把上面的代码用vc实现(讲的不好不要用臭鸡蛋扔我啊!):  
    众所周知,windows下无法直接读写硬件端口,要想实现上面的程序,我们只有借助强大的winio。  
    在VC中新建个工程,将winio压缩包中的winio.h包括进去,按alt+F7,在lib里面把winio.lib加进去(班门弄斧了^_^)。其实winio的压缩包中有详细的说明:  
    程序一开始先调用InitializeWinio(),结束时再调用ShutdownWinio()。呵呵!这就不用我多说了。  
    我们这个程序主要用到的winio的函数是  
    GetPortVal(WORD  wPortAddr,  PDWORD  pdwPortVal,  BYTE  bSize);//读端口  
    SetPortVal(WORD  wPortAddr,  DWORD  dwPortVal,  BYTE  bSize);//写端口  
      

  2.   

    兄弟啊,你这明显把http://topic.csdn.net/t/20040627/13/3126026.html上的抄过来吗,给点建设性意见好吗
      

  3.   

    lixiaosan(小三):
    你贴出来的判断缓冲的汇编程序,就是这两句:
    IN    AL,  06CH    ;  Read  PMU  status
    TEST  AL,  2
    就是读出6c地址,判断读到的是不是2,是2则缓冲已准备好,可进行下一步,不过,仍旧回归到楼主的问题,GetPortVal(0x6C,&dwPortVal, 1)得到的dwPortVal永远是0xFFFFFFFF,不会等于2。我想楼主再次问你如何判断缓冲也是这个意思。