msdn有mscomm的详细说明,你可以参照Properties Description 
CommPort Sets and returns the communications port number. 
Settings Sets and returns the baud rate, parity, data bits, and stop bits as a string. 
PortOpen Sets and returns the state of a communications port. Also opens and closes a port. 
Input Returns and removes characters from the receive buffer. 
Output Writes a string of characters to the transmit buffer. 

解决方案 »

  1.   

    在Windows95下用Delphi开发微机与PLC的串行通信程序鲁昌华 徐 稳  摘 要:在Windows95下利用Delphi实现微机与PLC的串行通信的 几种方法。
      关键词:串行通信 Delphi 动态链接库DLL 构件 句柄 设备控制 块DCB 可编程控制器 PLC  在自动测量和控制系统中,常常需要在上位机(微机)和PLC(可编程控制器) 之间进行数据交 换和发送控制信号,串行通信是其主要手段,我们在开发一套自动测试系统时就是采用串行 通信的方法,即由上位机向PLC发送命令,控制其进行各种测试线路的切换。1 通信协议
      在本系统中微机和PLC采用一对一通信连接,上位机作主局,PLC作子局。通信开始时由上位 机向PLC发出呼叫,PLC收到上位机的呼叫后应答,并返回应答信号,然后上位机发首标,PL C应答,接着上位机发数据块,PLC应答,数据全部发完后上位机发一结束标志,至此上位机 与PLC的通信结束。
      上述通信协议可用图1描述。
       该协议使用的传输控制字符有:
      ENQ(查询):在需要通信时作为发送方的请求。
      ACK(认可):接收方给发送方的应答,表示正确接收信息包。
      SOH(首标):表示要传送的是首标。
      ETB(数据结束):标志数据块的结束。
      STX(文本开始):标志数据块的开始。
      ETX(文本结束):标志文本块的结束。
      EOT(结束):表示传送结束。
      LRC:纵向冗余校验码,即对前面所有的传输码进行异或计算。 
    2 Windows95下用Delphi实现串行通信
      在Windows95环境下用Delphi3.0实现串行通信有3种方法:①使用VB的通信构件MSComm ;② 调用Windows95下的API函数来完成通信;③熟悉C/C++或其它语言的用户可以将自己的程序 编译链接为DLL(动态链接库),这样Delphi就可以调用DLL里的函数来通信。下面就这3种方 法分别加以讨论。
    2.1 使用VB通信构件
      在使用VB构件之前,首先要将VB构件文件MSComm32.OCX安装到Delphi的动态构件库中。打开 主菜单Component选择Import ActiveX Control...项,在弹出的对话框里选中Microsoft Co mm Control5.0(安装VB5.0后必有此项),再单击Install按钮。此时Delphi载入VB构件文件并重新编译DCL(Delphi Component Library)。编译完成后,MSComm的小按钮出现在ActiveX 页中,这时程序就可以使用此 构件了。应该注意的是,安装前要确保VB通信构件的控制文件MSComm32.OCX(在VB4.0以上版 本中)在编译DCL之前已在\Windows\System下。接着向窗体中 添加1个MSComm构件并进行串行口的初始化,初始化子例程序如下:Procedure TForm1.FormCreate(Sender:TObject);
    begin
    MSComm1.CommPort:=2; {使用COM2口为通信口}
    MSComm1.InBufferSize:=1024; {设定接收队列长度为
    1KB}
    MSComm1.OutBufferSize:=1024; {设定发送队列长度为
    1KB}
    MSComm1.Settings:=‘9600,N,8,1';{波特率9600b/s,无校验,8个数据位,1 个停止位}
    MSComm1.InputLen:=0; {读取整个接收缓冲区内容}
    MSComm1.InputBufferCount:=0; {清除接收缓冲区}
    MSComm1.PortOpen=:True; {打开串行口}
    End;
      用Input属性从接收对列读入字符串:ReadBuffer:=MSComm1.Input;用Output属性发送字 符串:MSComm1.Output:=WriteBuffer;然后根据上述通信协议,即可快速编制出通信软件 。
    2.2 调用Windows95下的API函数
      Windows95对通信功能的支持非常强,它增加了一系列用于通信的API函数供用户调用。同样 ,要进行串行通信,也需要先对串口进行初始化。Windows95把串行口作为设备文件,对串 口操作就是对文件操作。因此,必须先为串口分配1个文件句柄,以后对串口操作都将通过 这个文件句柄来完成。初始化过程如下:
      (1)调用CreateFile函数为串口分配1个文件句柄。
      Var HComm:THandle;
      HComm:=CreateFile(‘COM2',GENERICREAD or GENERICWRITE ,0,@NULL,OPENEXISTING,FILEFLAGOVERLAPPED,0);
      如果对串行口1操作,用字符串COM1代替COM2即可。
      (2)调用SetupComm函数设置串行口的输入和输出缓存区。
      SetupComm(HComm,1024,1024);
      (3)填充1个DCB(设备控制块)结构来设置通信参数。通过调用GetCommState函数 获得当前系统的DCB结构,按需要赋值给DCB的成员,如波特率、奇偶校验、数据位、停止位 等,最后将创建后的DCB结构作为参数传给SetCommState函数就可以初始化串口了。  Var DCB:TDCB;
      GetCommState(HComm,DCB);
      BuildCommDCB(‘9600,N,8,1',DCB);
      SetCommState(HComm,DCB);
      (4)用PurgeComm函数来清除接收缓存区的内容。
      PurgeComm(HComm,PurgeRXCLEAR);  (5)串行口的初始化完成后,接下来的工作就是根据通信协议发送和接收串行口上的数据。R eadFile函数用于接收数据,WriteFile函数用于发送数据。  Var
      OverLapped:TOverLapped;
      DataIn:Byte;
      DataOut:Byte;
      BufferSize:Integer;
      COMSTAT cs;
      ReadFile(HComm,DataIn,cs.cbInQue,BufferSize,@OverLapped);
       {从串行口读输入缓存的字节,存入DataIn变量中}
      WriteFile(HComm,DataOut,cs.cbOutQue,BufferSize,@OverLapped); 
       {向串行口写输出缓存的字节,要写的数据存放在DataOut}
      按照上述步骤,再根据前面的通信协议,即可完成串行通信。
    2.3 调用其它语言编写的DLL
      由于这里所说的其它语言包含面很广,可以是开发人员所熟悉的编程语言(只要其支持DLL即 可),如C和C++等,所以如何编写DLL就不再详述了。将编写好的DLL进行编译,然后把编译 通过后的DLL放在\Windows\System子目录下,在Delphi下打开1个单元文件,将DLL里的所 有函数在单元文件中声明,格式如下:  unit UnitName;
      interface
      procedure p1(param1:type1;param2:type2;...);stdcall;
      external‘DLLName';
      …
      implementation
      end  其中UnitName为单元文件名,p1为调用过程名,param1、param2为参数名,type1、type2为 参数类型名,DLLName为DLL名。串行通信时,只要将此单元包含进编程单元就行了。3 结 论
      对使用Delphi开发Windows95下与PLC进行串行通信程序的3种方法进行比较可以得出这样的 结论:
      (1)使用VB通信构件不但能够实现API的所有功能,而且程序简单明了。
      (2)调用Windows95的API通信函数,可以设计和开发出各种通信软件,但编程复杂。
      (3)第3种方法适合那些熟悉其它编程语言的开发人员。
      以上所有程序均在Windows95中文版下使用Delphi3.0调试通过。作者单位:合肥工业大学计算机系(230061)参考文献 1 李汉涛,杨长春.Windows下三线制串行通信的实现方法.电脑技 术,1998;(7)
     2 王仲文译.精通串行通信.北京:电子工业出版社
      

  2.   

    一、MSComm控件的主要属性及事件
      (1)CommPort:设置或返回串行端口号,缺省值1。
      (2)Setting:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Setting:=′9600,n,8,1′
      (3)PortOpen:打开或关闭串行端口,格式为:MSComm1.PortOpen:={True|False}
      (4)InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
      (5)InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。
      (6)RThreshold:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。
      (7)SThreshold:该属性为一阀值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件。
      (8)InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。
      (9)Input:从接收缓冲区读取一串字符。
      (10)OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
      (11)OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。
      (12)OutPut:向发送缓冲区传送一串字符。
      如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。CommEvent属性值及其含义如下:
      (1)ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。
      (2)ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。
      (3)ComEvFrame:值为1004,硬件检测到帧错误。
      (4)ComEvRxOver:值为1008,接收缓冲区溢出。
      (5)ComEvTxFull:值为1010,发送缓冲区溢出。
      (6)ComEvRxParity:值为1009,奇偶校验错误。
      (7)ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符。
      二、程序样例
        下面是一接收程序的样例(主要部分),大家可根据实际需要进行完善。
      在Form中放置一Memo控件用于显示接收的数据,Combobox1选择通信参数(Setting属性值),Combobox2选择串口(CommPort属性值),按Button1开始接收数据,按Button2停止接收。
      procedure TForm1.FormCreate(Sender: TObject);
      begin
      Mscomm1.InBufferCount :=0; // 清空接收缓冲区
      Mscomm1.InputLen :=0; // Input读取整个缓冲区内容
      Mscomm1.RThreshold :=1; // 每次接收到字符即产生OnComm事件
      end;
      procedure TForm1.Button1Click(Sender: TObject);
      begin
      Mscomm1.Settings :=ComboBox1.Text;
      if ComboBox2.Text =′com1′ then // 假设只考虑COM1和COM2两种情况
    Mscomm1.CommPort :=1
      else
        Mscomm1.CommPort :=2;
      Mscomm1.PortOpen :=true; // 打开串口
      Mscomm1.DTREnable :=true; // 数据终端准备好
      Mscomm1.RTSEnable :=true; // 请求发送
      end;
      procedure TForm1.Button2Click(Sender: TObject);
      begin
      Mscomm1.PortOpen :=false; // 关闭串口
       Mscomm1.DTREnable :=false;
      Mscomm1.RTSEnable :=false;
      end;
      procedure TForm1.MSComm1Comm(Sender: TObject);
      var
      recstr:Olevariant;
      begin
       if Mscomm1.CommEvent = 2 then
        begin
      recstr := Mscomm1.Input ;
      Memo1.text := Memo1.Text + recstr;
      end;
    end;
      

  3.   

    说具体问题吧。给我发消息或写信都可以。[email protected]
      

  4.   

    mscomm 是一个单线城,最好用 spcomm  空件,是多现成
      

  5.   

    moodboy  zzzai
    或者其他能否对spcomm说清楚点呢?
    比如说说它的属性和事件。其他人也可以
    谢谢。(前些天,刚好有人在批评我这样的人,我无话可说。但由于时间紧迫
            dedpi没学过。所以请各位帮忙了。谢谢。)