一个串口通迅的例子:
unit comdemou;
interface
uses
  Windows, Messages, SysUtils, Classes, 
Graphics, Controls, Forms, Dialogs;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_existing,
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.Msgcomm
Process(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.

解决方案 »

  1.   

    并且我在windows 2000中,进行读计算机的串口
    有该类控件吗,或文档吗
      

  2.   

    VB里有一个ActiveX控件TMScomm能在Delphi中使用,或者使用SPcomm控件。
    非常方便,另外(人民邮电出版社)的Delphi串行口通信编程一书还可以看看。
    TMScomm支持485,422的。
    兄弟,好好干
      

  3.   

    我刚翻译别人的关于COM口的,不过我也不懂,只是糊乱的写着好玩,你看看:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1054436
      

  4.   

    windows下用中断方式编写设备驱动程序不容易,正好像不用DD来编写直接写屏程序那样困难,需要有资料,而这种资料市面上很少,因设备驱动程序一般都由硬件生产厂家帮用户完成。一般的应用程序我看不一定用中断方式编写设备驱动程序也可以。如果用查询方式来编,那就简单的多了,你用查询方式工作,Windows是不管你的。
      

  5.   

    MSCOM,SPCOM,不过我经常用TCommPortDriver
      

  6.   

    我最近也在写一个mscom的串口。。
    比较麻烦。。
    要测试它的波特率什么的
    哎。。搞死我 。
      

  7.   

    {简单串行通信}
    { History }
    {
      1999/8/12: First Copy;
     }unit MyCom;interface
    uses windows, SysUtils, Forms, CommInt;procedure MyCpCreate;
    procedure IniMyCp(ComID: integer);
    function ReadComB: byte;
    procedure ReadCom(var Block; Len: Word);
    function WriteCom(var Block; Len: Word): Integer;
    procedure FlushComInBuffer;
    procedure FlushComOutBuffer;
    var
      MyCP: TComm;
    implementation
    uses inifiles, module;
    {************************************************************}
    {通信公用函数}
    {************************************************************}procedure MyCpCreate;
    begin
      MyCP := TComm.Create(Application);  MyCP.DeviceName := 'Com' + InttoStr(wskini.ReadINteger('COM', 'PORT', 1));
      MyCP.BaudRate := br2400;
      MyCP.StopBits := sb10;
      MyCP.Parity := paNone;
      MyCP.DataBits := da8;
    end;procedure IniMyCp(ComID: integer);
    begin
      with MyCp do
      begin
        Close;
        DeviceName := 'Com' + InttoStr(wskini.ReadINteger('COM', 'PORT', 1));
        BaudRate := br2400;
        StopBits := sb10;
        Parity := paNone;
        DataBits := da8;
        Open;
      end;
    end;function ReadComB: byte;
    var cd: byte;
    begin
      MyCP.Read(cd, 1);
      result := cd;
      Sleep(5);
    end;procedure ReadCom(var Block; Len: Word);
    begin
      MyCP.Read(Block, Len);end;function WriteCom(var Block; Len: Word): Integer;
    var i: byte;
    begin
      for i := 0 to 2 do
      begin
        Result := MyCP.Write(Block, Len);
        if Result <> -1 then //异步写端口成功
        begin
          AddWatchCommu(TimetoStr(time));
          AddWatchCommu('Send:  ' + ByteBlocktoHexStr(Block, Len));
          break;
        end;
       //delay(10);
      end;
    end;procedure FlushComInBuffer;
    begin
      MyCP.PurgeIn;
    end;procedure FlushComOutBuffer;
    begin
      MyCP.PurgeOut;
    end;
    end.
      

  8.   

    用MSComm 控件是MSComm32.ocx。在system路径下面。