有一个TC下的老程序,用VC改了以后。将inportb改为inpw和将outportb改为outpw重新编译执行(win 98 下),忽然发现出现了很多意外的问题,如从在同一时间inpw(0x???)读出的值竟和使用inportb读出的数不同,inpw读出的数据竟然不对(有频率器参照). 请教各位同学inpw和outpw与inportb和outportb内在的区别是什么?怎样正确使用inpw和outpw

解决方案 »

  1.   

    outputb和inportb对应的函数为_inp和_outp。使用时需要<conio.h>头文件。建议使用_inp和_outp,而不是使用inp和outp。因为_inp和_outp在Debug和Release都可以使用,而inp和outp只能用于Release设置。如果在Debug设置时使用inp和outp,编译时不会错,但会产生链接错误如下: 
         error LINK2001:Unresolved external symbol _inp 
         error LINK2001:Unresolved external symbol _outp 
         fatal error LNK1120:2 Unresolved externals. 
        以上方法只适用于Win9x,在Windows NT/2000下任何硬件I/O操作均需要通过设备启动程序。你可以借助DDK(http://www.microsoft.com/ddk)编写设备驱动程序。当然你也可以购买现成的软件,如http://zealsoft.diy.163.com/cn/ntport/。 
      

  2.   

    多谢,多谢。能不能详细说一下inp和inportb函数内部的区别?
    为什么读出的数据不同呢?从同一个端口在同一状态
      

  3.   

    兄弟不可能吧!如果inpb读0x70的数据为1000 0001 
    那么inpw读0x70的数据为1000 0001 xxxx xxxx   当然用Debug看到的结果肯定是不一样的,但是它们的二进制代码的其中八位,肯定是相同的;Good Luck
      

  4.   

    详细说,是用8255驱动一个外部滑杆,在某一指定位置会触发高电平,从端口0x1234读数据
    WORD val = 0x0000;
    #ifdef VC_USE
    val = inpw(0x1234);
    #else
    val = inportb(0x1234;
    #endifprintf("Val = %#x",val);上面说个大概,结果inpw返回的数是0x02,而inportb返回的是0x04
    由于inpw 返回的结果不对,导致程序根本没法正常使用。而且无法用DEBUG模式
    ,所以内部运行无从查其。各位壮士幸苦了
      

  5.   

    这种情况为什么不用嵌入ASM呢?