20000916008.htm

来自「C++Builder教学大全」· HTM 代码 · 共 95 行

HTM
95
字号
<HTML>

<HEAD>

 

<TITLE>Win32下的几种串口通信编程</TITLE>



<META content="MSHTML 5.00.2314.1000" name=GENERATOR>

</HEAD>

<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0 

vLink=#990099>



<div align="center">

  <table width="744" border="0" cellspacing="0" cellpadding="0" height="76">

    <tr> 

      <td> 

        <p align=center><font size="3"><br>

          <b>Win32下的几种串口通信编程</b></font><b><font color="#0000c0"> </font></b></p>

        <center>

          <h3><font size="2">安徽合肥 <br>

            冯传玉 </font></h3>

        </center>

        <p><font color=#ffffff>----</font> 要完成串口通信, 在32位模式下, 一般说来有以下四种方法: 

        <p><font color=#ffffff>----</font> 1. 以文件方式打开串口: 

        <p><font color=#ffffff>----</font> 这里使用的是Win32 API 函数, 所以无论在BCB或VC下都可以实现. 

          具体的函数的意义可以参考Win32 API 的帮助.这里有一个易于使用的BCB下的类, 可以方便的使用串口. 

        <p><font color=#ffffff>----</font> 下面给出简要说明: 

        <p><font color=#ffffff>----</font> (1) 应用CreateFile() 来初始化串口 

        <pre> 

   FhFileComm=CreateFile( FCommName.c_str(),

               GENERIC_READ | GENERIC_WRITE,

               0,  // exclusive access

                  &amp;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,&amp;length,&amp;FgOverLapped);

    }



bool MyComm::ReadBuffer(unsigned 

char*buffer,unsigned long length)

   {

     return  ReadFile(FhFileComm,buffer,

     length,&amp;length,&amp;FgOverLapped);

   }

  相应的源文件为 UsageComm.cpp UsageComm.h

</pre>

        <p><font color=#ffffff>----</font> 2. 使用现成的控件: 

        <p><font color=#ffffff>----</font> 易于使用的是微软的MS Communication 控件, 它是做为一个 

          .ocx 提供的. 

        <p><font color=#ffffff>----</font> 在BCB 中可以用Import ActiveX Control 将它加入到BCB 

          中, 缺省是加载在ActiveX 页中. 就可以作为一个普通的BCB 控件来使用了.(也有不少第三方提供的其它硬件操作控件) 

        <p><font color=#ffffff>----</font> 3. 直接嵌入汇编法: 

        <p><font color=#ffffff>----</font> (该方法不能在NT下使用, 由于98的非完全保护, 下面的代码可以使用)利用BCB的直接嵌入汇编功能, 

          可以在BCB中直接对串口操作. 

        <p><font color=#ffffff>----</font> 如下所示,在BCB中使用汇编代码如下 

        <pre>  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

    }

  }

</pre>

        <p><font color=#ffffff>----</font> 这里必须用__fastcall 调用约定以使在调用该函数时用寄存器传递参数. 

        <p><font color=#ffffff>----</font> (用在BCB中的汇编指令代码in 和out必须用小写,(其余可以为大写)寄存器名称大小写都可以) 

        <p><font color=#ffffff>----</font> 其它的如写多个字节,读多个字节, 同样可以实现. 

        <p><font color=#ffffff>----</font> 4. 最困难的要数用VxD来实现: 

        <p><font color=#ffffff>----</font> 这不是一下子能说得清的, 如果要做, 当然要找本书了. </p>

    </td>

    </tr>

  </table>

 

</div>

</BODY></HTML>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?