Delphi怎么与串口(COM口)通信的呀。
请大家给个例子或都告诉我用什么API函数呀。

解决方案 »

  1.   

    去看一下spcomm,mscomm,这些控件都可以。spcomm可以在网上下载,mscomm安装vb后就有了。
      

  2.   

    用VB的MSCOM控件......................
      

  3.   

    如果用VB的MSCOM控件,要不要VB的运行环境呀。
    我想知道用API函数操纵串口的方法。
      

  4.   

    看看《delphi 串口通讯》一书就什么都知道了
      

  5.   

    你要用API,网上有文章嘛,多的是,
      

  6.   

    1. 利用CreateFile函数打开串行口,以确定本应用程序对此串行口的占有权,并封锁
    其它应用程序对此串口的操作;
        2. 通过GetCommState函数填充设备控制块DCB,再通过调用SetCommState函数配置串
    行口的波特率、数据位、校验位和停止位;
        3. 创建串行口监视线程监视串行口事件,在此基础上就可以在相应的串口上操作数
    据的传输;
        4. 用CloseHandle函数关闭串行口(具体的程序如下)。本程序用Delphi3.0编写,在
    Windows 95环境下调试通过,已投入实际应用中,供广大读者参考。
        程序:
        unit comdemou;
        interface
        uses
         Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialo
    gs;
        const
         Wm_commNotify=Wm_User+12;
        type
         TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
         private
        Procedure comminitialize;
        Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify;
        { Private declarations }
         public
        { Public declarations }
         end;
         //线程声明
         TComm=Class(TThread)
         protected
         procedure Execute;override;
         end;
        var
         Form1: TForm1;
         hcom,Post_Event:Thandle;
         lpol:Poverlapped;
        implementation
        {$R *.DFM}
        Procedure TComm.Execute;
        //线程执行过程
        var
        dwEvtMask:Dword;
        Wait:Boolean;
        Begin
        fillchar(lpol,sizeof(toverlapped),0);
        While True do Begin
         dwEvtMask:=0;
         Wait:=WaitCommEvent(hcom,dwevtmask,lpol);
         //等待串行口事件;
         if Wait Then Begin
         waitforsingleobject(post_event,infinite);  //等待同步事件置位;
         resetevent(post_event);
         //同步事件复位;
         PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//发送消息;
         end;
         end;
        end;
        procedure Tform1.comminitialize;
         //串行口初始化
        var
        lpdcb:Tdcb;
        Begin
        hcom:=createfile(‘com2’,generic_read or generic_write,0,nil,open_exist
    ing,
         file_attribute_normal or file_flag_overlapped,0);//打开串行口
        if hcom=invalid_handle_value then
        else
        setupcomm(hcom,4096,4096);
         //设置输入、输出缓冲区皆为4096字节
        getcommstate(hcom,lpdcb);
        //获取串行口当前默认设置
        lpdcb.baudrate:=2400;
        lpdcb.StopBits:=1;
        lpdcb.ByteSize:=8;
        lpdcb.Parity:=EvenParity;
         //偶校验
        Setcommstate(hcom,lpdcb);
        setcommMask(hcom,ev_rxchar);
         //指定串行口事件为接收到字符;
        end;
        Procedure TForm1.MsgcommProcess(Var Message:Tmessage);
        var
        Clear:Boolean;
        Coms:Tcomstat;
        cbNum,ReadNumber,lpErrors:Integer;
        Read_Buffer:array[1..100]of char;
        Begin
        Clear:=Clearcommerror(hcom,lpErrors,@Coms);
        if Clear Then Begin
          cbNum:=Coms.cbInQue;
          ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);
          //处理接收数据
          SetEvent(Post_Event);
         //同步事件置位
          end;
        end;
        procedure TForm1.FormCreate(Sender: TObject);
        begin
        comminitialize;
        post_event:=CreateEvent(nil,true,true,nil); //创建同步事件;
        Tcomm.Create(False);
        //创建串行口监视线程;
        end;
        end.
      

  7.   

    谢谢大家。
    本人以前是用VB和C#开发的。
    最近要为别人提供个对操作的DLL,
    用VB写的Delphi调到总是有问题。
    所以自己试着用Delphi来写一个(因为别人用Delphi开发)。