现在的位置: 首页 > 编程语言 > 正文

outportb函数与inportb函数问题

2019年03月17日 编程语言 ⁄ 共 3889字 ⁄ 字号 评论关闭

outportb函数是属于Turbo CTC)语言库函数,这是一个输出到硬件端口的函数,似乎是当年学习C语言的时候用这个东西,现在用的C++里面没有这个函数,今天在做一个软件说明书时,看到这个函数,在网上搜索了下,放在这里,以备大家使用时查明:

-----------------------------------------------------------------

outportb函数

函数原型: void outportb(unsigned char port, unsigned char value)
函数功能: port地址的接口输出value
函数返回:
函数说明: port 端口地址,value要输出的8位数
所属文件: <dos.h>
程序例:

#include <stdio.h> 

  #include <dos.h> 

  int main(void) 

  { 

  int value = 64; 

  int port = 0; 

  outportb(port, value); 

  printf("Value %d sent to port number %d\n", value, port); 

  return 0; 

}

---------------------------------------------------------------------------------------------

另附上与之对应的inportb函数的说明

函数名: inportb

  功 : 返回从指定硬件端口读入的一个8位二进制(一个字节)。

  用 : int inportb(int port);

  程序例:

 

#include <stdio.h> 

  #include <dos.h> 

  int main(void) 

  { 

  int value ; 

  int port =0x210; 

  value=inportb(port); 

  printf("port 0x%x sent Value is%d\n", port,value ); 

  return 0; 

  }

 

而在C++中,没有像inportb/outportb,inportw/outputw专门的端口读写函数  
 
但可以用::CREATEFILE(。。。。)

例子:

  BOOL   CSerialPort::InitPort(CWnd*   pPortOwner, //   the   owner   (CWnd)   of   the   port   (receives   message)   
        UINT     portnr, //   portnumber   (1..4)   
        UINT     baud, //   baudrate   
        char     parity, //   parity     
        UINT     databits, //   databits     
        UINT     stopbits, //   stopbits     
        DWORD   dwCommEvents, //   EV_RXCHAR,   EV_CTS   etc   
        UINT     writebuffersize) //   size   to   the   writebuffer   
  {   
  assert(portnr   >   0   &&   portnr   <   5);   
  assert(pPortOwner   !=   NULL);   
    
  //   if   the   thread   is   alive:   Kill   
  if   (m_bThreadAlive)   
  {   
  do   
  {   
  SetEvent(m_hShutdownEvent);   
  }   while   (m_bThreadAlive);   
  TRACE("Thread   ended\n");   
  }   
    
  //   create   events   
  if   (m_ov.hEvent   !=   NULL)   
  ResetEvent(m_ov.hEvent);   
  m_ov.hEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);   
    
  if   (m_hWriteEvent   !=   NULL)   
  ResetEvent(m_hWriteEvent);   
  m_hWriteEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);   
    
  if   (m_hShutdownEvent   !=   NULL)   
  ResetEvent(m_hShutdownEvent);   
  m_hShutdownEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);   
    
  //   initialize   the   event   objects   
  m_hEventArray[0]   =   m_hShutdownEvent; //   highest   priority   
  m_hEventArray[1]   =   m_ov.hEvent;   
  m_hEventArray[2]   =   m_hWriteEvent;   
    
  //   initialize   critical   section   
  InitializeCriticalSection(&m_csCommunicationSync);   
    
  //   set   buffersize   for   writing   and   save   the   owner   
  m_pOwner   =   pPortOwner;   
    
  if   (m_szWriteBuffer   !=   NULL)   
  delete   []   m_szWriteBuffer;   
  m_szWriteBuffer   =   new   char[writebuffersize];   
    
  m_nPortNr   =   portnr;   
    
  m_nWriteBufferSize   =   writebuffersize;   
  m_dwCommEvents   =   dwCommEvents;   
    
  BOOL   bResult   =   FALSE;   
  char   *szPort   =   new   char[50];   
  char   *szBaud   =   new   char[50];   
    
  //   now   it   critical!   
  EnterCriticalSection(&m_csCommunicationSync);   
    
  //   if   the   port   is   already   opened:   close   it   
  if   (m_hComm   !=   NULL)   
  {   
  CloseHandle(m_hComm);   
  m_hComm   =   NULL;   
  }   
    
  //   prepare   port   strings   
  sprintf(szPort,   "COM%d",   portnr);   
  sprintf(szBaud,   "baud=%d   parity=%c   data=%d   stop=%d",   baud,   parity,   databits,   stopbits);   
    
  //   get   a   handle   to   the   port   
  m_hComm   =   CreateFile(szPort, //   communication   port   string   (COMX)   
            GENERIC_READ   |   GENERIC_WRITE, //   read/write   types   
            0, //   comm   devices   must   be   opened   with   exclusive   access   
            NULL, //   no   security   attributes   
            OPEN_EXISTING, //   comm   devices   must   use   OPEN_EXISTING   
            FILE_FLAG_OVERLAPPED, //   Async   I/O   
            0); //   template   must   be   0   for   comm   devices   
    
  if   (m_hComm   ==   INVALID_HANDLE_VALUE)   
  {   
  //   port   not   found   
  delete   []   szPort;   
  delete   []   szBaud;   
    
  return   FALSE;   
  }   
    
  //   set   the   timeout   values   
  m_CommTimeouts.ReadIntervalTimeout   =   1000;   
  m_CommTimeouts.ReadTotalTimeoutMultiplier   =   1000;   
  m_CommTimeouts.ReadTotalTimeoutConstant   =   1000;   
  m_CommTimeouts.WriteTotalTimeoutMultiplier   =   1000;   
  m_CommTimeouts.WriteTotalTimeoutConstant   =   1000;   
    
  //   configure   
  if   (SetCommTimeouts(m_hComm,   &m_CommTimeouts))   
  {         
  if   (SetCommMask(m_hComm,   dwCommEvents))   
  {   
  if   (GetCommState(m_hComm,   &m_dcb))   
  {   
  m_dcb.fRtsControl   =   RTS_CONTROL_ENABLE; //   set   RTS   bit   high!   
  if   (BuildCommDCB(szBaud,   &m_dcb))   
  {   
  if   (SetCommState(m_hComm,   &m_dcb))   
  ;   //   normal   operation...   continue   
  else   
  ProcessErrorMessage("SetCommState()");   
  }   
  else   
  ProcessErrorMessage("BuildCommDCB()");   
  }   
  else   
  ProcessErrorMessage("GetCommState()");   
  }   
  else   
  ProcessErrorMessage("SetCommMask()");   
  }   
  else   
  ProcessErrorMessage("SetCommTimeouts()");   
    
  delete   []   szPort;   
  delete   []   szBaud;   
    
  //   flush   the   port   
  PurgeComm(m_hComm,   PURGE_RXCLEAR   |   PURGE_TXCLEAR   |   PURGE_RXABORT   |   PURGE_TXABORT);   
    
  //   release   critical   section   
  LeaveCriticalSection(&m_csCommunicationSync);   
    
  TRACE("Initialisation   for   communicationport   %d   completed.\nUse   Startmonitor   to   communicate.\n",   portnr);   
    
  return   TRUE;   
  }

 

抱歉!评论已关闭.