想通过DELPHI开发程序,利用CREATFILE()和READFILE时,
var 
Coms:Tcomstat;
lpol:Poverlapped;
.......
clear:=clearcommerror(hcom,lperrors,@coms);
......  
readfile(hcom,read_buffer,cbnum,readnumber,ppal);
 ....
结果运行时报错为:
Build
  [Error] Unit1.pas(83): Types of actual and formal var parameters must be identical
  [Error] Unit1.pas(86): Types of actual and formal var parameters must be identical请教如何解决

解决方案 »

  1.   

    可能是你的变量定义不对,lperrors,readnumber的定义错误:
    var
        Coms:COMSTAT ;
        lpol:OVERLAPPED;
        lperrors,readnumber:DWORD;
    begin
        clearcommerror(hcom,lperrors,@coms);
        readfile(hcom,read_buffer,cbnum,readnumber,@lpol);
      

  2.   

    用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序。利用API编写串口通信程序较为复杂,需要掌握大量通信知识,其优点是可实现的功能更强大,应用面更广泛,更适合于编写较为复杂的低层次通信程序。相比较而言,利用SPComm控件则相对较简单,该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作。  使用控件这一方法容易掌握,而SPCOMM支持多线程,所以SPCOMM控件的应用更加广泛。结合实例详细介绍SPCOMM的使用。一.SPCOMM控件的安装1.选择下拉菜单Component的第二项Install Component 。
      弹出窗口,在Unit file name 处填写控件SPCOMM控件所在路径,其它可用默认值,点击OK按纽。2.安装成功后,system控件面板中将出现一个红色控件COMM。现在使用COMM控件可以象Delphi自带控件一样使用。
    二.SPCOMM的主要属性,方法和事件1.属性CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。 BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。ParityCheck:奇偶校验。ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。Parity:奇偶校验位pBits:停止位SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。2.方法   Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种:
    ⑴串口已经打开 ;
    ⑵打开串口错误 ;
    ⑶文件句柄不是通讯句柄; 
    ⑷不能够安装通讯缓存; 
    ⑸不能产生事件 ;
    ⑹不能产生读进程;
    ⑺不能产生写进程;  StopComm过程用于关闭串口,没有返回值。  函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。 3.事件OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 
      当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。 OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 
      当接受数据时出现错误将触发该事件。
      

  3.   

    你好,能再详细点吗,我的程序是想将一串ASCII码发送出去,但是好多介绍的是发送二进制代码?你有例程序吗?能给我一个吗?
    [email protected]
      

  4.   

    多谢大家支持!问题解决了,以下一段代码与大家分享!其中OLEVARIANT变量可用STRING变量来代替!
    ---------------------------------------------------------
    将字符内容送入串口中程序:
    var
       ovTmp: olevariant;
    begin
      ovTmp :=  memo1.Text;
      frmMain.MSCommAlarm.Output := ovTmp;
    end;
    接收的程序:
    var
      ovTmp: olevariant;
      sOrder:string;
    begin
      ovTmp:=MSComm1.Input;
      sOrder:= ovTmp;
    end;
    -----------------------------------------------------结帖了!