outportb函数与inportb函数问题

来源:互联网 发布:mac 分区 编辑:程序博客网 时间:2024/05/17 11:07

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;     }