Win32下的几种串口通信编程 ### 安徽合肥 冯传玉 ---- 要完成串口通信, 在32位模式下, 一般说来有以下四种方法: ---- 1. 以文件方式打开串口: ---- 这里使用的是Win32 API 函数, 所以无论在BCB或VC下都可以实现. 具体的函数的意义可以参考Win32 API 的帮助.这里有一个易于使用的BCB下的类, 可以方便的使用串口. ---- 下面给出简要说明: ---- (1) 应用CreateFile() 来初始化串口
       FhFileComm=CreateFile( FCommName.c_str(),

                   GENERIC_READ | GENERIC_WRITE,

                   0,  // exclusive access

                      &lpSecurity,

                      OPEN_EXISTING,

          FILE_ATTRIBUTE_NORMAL |

          FILE_FLAG_OVERLAPPED, //            overlapped I/O

          NULL );

       if( FhFileComm == INVALID_HANDLE_VALUE)

          return false;

      (2)  应用WriteFile() 和 ReadFile() 从串口读写数据

         bool MyComm::WriteBuffer(unsigned

         char*buffer,unsigned long length)

        {

          return  WriteFile(FhFileComm,buffer,

          length,&length,&FgOverLapped);

        }

    bool MyComm::ReadBuffer(unsigned

    char*buffer,unsigned long length)

       {

         return  ReadFile(FhFileComm,buffer,

         length,&length,&FgOverLapped);

       }

      相应的源文件为 UsageComm.cpp UsageComm.h
---- 2. 使用现成的控件: ---- 易于使用的是微软的MS Communication 控件, 它是做为一个 .ocx 提供的. ---- 在BCB 中可以用Import ActiveX Control 将它加入到BCB 中, 缺省是加载在ActiveX 页中. 就可以作为一个普通的BCB 控件来使用了.(也有不少第三方提供的其它硬件操作控件) ---- 3. 直接嵌入汇编法: ---- (该方法不能在NT下使用, 由于98的非完全保护, 下面的代码可以使用)利用BCB的直接嵌入汇编功能, 可以在BCB中直接对串口操作. ---- 如下所示，在BCB中使用汇编代码如下
      byte  __fastcall ReadByte(WORD Address)

      // eax :address

      {

        asm

        {

          mov   DX,AX

          in    AL,DX

        }

      }

      void  __fastcall WriteByte

    (unsigned char byte, WORD Address)

    // EAX: BYTE EDX: ADDRESS

      {

        asm

        {

          out    DX,AL

        }

      }
---- 这里必须用__fastcall 调用约定以使在调用该函数时用寄存器传递参数. ---- (用在BCB中的汇编指令代码in 和out必须用小写，(其余可以为大写)寄存器名称大小写都可以) ---- 其它的如写多个字节,读多个字节, 同样可以实现. ---- 4. 最困难的要数用VxD来实现: ---- 这不是一下子能说得清的, 如果要做, 当然要找本书了.