1.SPCOMM控件我已经动态创建好,但当执行STARTCOMM时,会出现问题?
2.应如何为控件定义事件(如:ONRECEIVEDATA)?又如何知道哪个控件有事件发生呢?小弟第一问题的程序部分如下:
const
  iMaxComNumber = 4;procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer ;
begin
  i := 0 ;
  while i < iMaxComNumber  do
  begin
    tSPComm[i] := TComm.Create(self);    tSPComm[i].CommName := 'COM' + IntToStr(i + 1);
    tSPComm[i].Name := 'Comm' + IntToStr(i + 1);
    tSPComm[i].Tag := i+1;    memResult.Lines.Add('Com' + IntToStr(i + 1) + ' create OK.');    Inc(i);
  end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer ;
begin
  i := 0 ;
  while i < iMaxComNumber  do
  begin
    try
      tSPComm[i].StartComm;
      memResult.Lines.Add('Com' + IntToStr(i + 1) + ' start OK.');
    except
      i :=   iMaxComNumber;
    end;
    Inc(i);
  end;
end;谢谢!

解决方案 »

  1.   

    const
      iMaxComNumber = 4;
    var
      Form1: TForm1;
      tSPComm:array[1..10] of TComm;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      i : Integer ;
    begin
      i := 0 ;
      while i < iMaxComNumber  do
      begin
        tSPComm[i] := TComm.Create(self);    tSPComm[i].CommName := 'COM' + IntToStr(i + 1);
        tSPComm[i].Name := 'Comm' + IntToStr(i + 1);
        tSPComm[i].Tag := i+1;
        tSPComm[i].OnReceiveData:=Comm10ReceiveData;    memResult.Lines.Add('Com' + IntToStr(i + 1) + ' create OK.');    Inc(i);
      end;
    end;
    procedure TForm1.Comm10ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    begin
    memResult.Lines.Add('Read From Com'+IntToStr(TComm(Sender).Tag));
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i : Integer ;
    begin
      i := 0 ;
      while i < iMaxComNumber  do
      begin
        try
          tSPComm[i].BaudRate:=9600;
          tSPComm[i].ByteSize:=_8;
          tSPComm[i].StopBits:=_1;
          tSPComm[i].StartComm;
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' start OK.');
        except
    //      i :=   iMaxComNumber;
        end;
        Inc(i);
      end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
    tSPComm[2].WriteCommData('12345',5);end;
      

  2.   

    先谢谢各位了!  我试了一下,在DELPHI中运行还是在STARTCOMM的时候出现错误,但直接运行.EXE文件就是对的,我想是不是程序是对的,但是由于调试选项的问题,才总在TRY...EXCEPT...抛出异常的时候出错,但应该怎么设置调试选项呢?哪里有调试选项的详细说明呢?
      

  3.   

    Tools->Debug Options,Language Exceptions,将中下部 Stop On Delphi Exceptions前的勾去掉,在TRY...EXCEPT...抛出异常的时候出,不会出现
      

  4.   

    问题又来了,我动态创建了SPCOMM并打开串口后,想判断SPCOMM打开的串口是否真的连接到了设备,这时问题就出现了,在写入AT命令后,ONRECEIVEDATA得到的结果并不返回...应该怎么改?
    程序如下:
    unit FormMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, SPComm, Registry ;const
      iMaxComNumber = 4;type
      TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        memResult: TMemo;
        GroupBox2: TGroupBox;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Button6: TButton;
        Comm99: TComm;
        Button7: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
        procedure ComReceiveData(Sender: TObject; Buffer: Pointer;
          BufferLength: Word);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      tSPComm : array [0..3] of TComm;
      sReceive : String;implementation{$R *.dfm}//动态创建SPCOMM
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i : Integer ;
    begin
      i := 0 ;
      while i < iMaxComNumber  do
      begin
        tSPComm[i] := TComm.Create(self);    tSPComm[i].CommName := 'COM' + IntToStr(i + 1);
        tSPComm[i].Name := 'Comm' + IntToStr(i + 1);
        tSPComm[i].Tag := i+1;    tSPComm[i].OnReceiveData := ComReceiveData;    memResult.Lines.Add('Com' + IntToStr(i + 1) + ' create OK.');    Inc(i);
      end;
    end;//打开串口
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i : Integer ;
    begin
      i := 0 ;
      while i < iMaxComNumber  do
      begin
        try
          tSPComm[i].BaudRate:=9600;
          tSPComm[i].ByteSize:=_8;
          tSPComm[i].StopBits:=_1;
          tSPComm[i].Parity := NONE;
          tSPComm[i].StartComm;
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' start OK.');
        except
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' start Error.');
        end;
        Inc(i);
      end;
    end;//关闭串口
    procedure TForm1.Button4Click(Sender: TObject);
    var
      i : Integer ;
    begin
      i := 0 ;
      while i < iMaxComNumber  do
      begin
        try
          tSPComm[i].StopComm;
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' stop OK.');
        except
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' stop Error.');
        end;
        Inc(i);
      end;
    end;//串口检测
    procedure TForm1.Button6Click(Sender: TObject);
    var
      i : Integer ;
      pcATCommand : PChar;
      iATCommandLen : integer;
    begin
      pcATCommand := PChar(edit1.Text + chr(13));
      iATCommandLen := strlen(pcATCommand);
      sReceive := 'fdas';  i := 0 ;
      while i < iMaxComNumber  do
      begin
        tSPComm[i].WriteCommData(pcATCommand,iATCommandLen);
    //    sleep(1000);
    {
        if Pos('OK',sReceive) <> 0 then
        begin
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' connecting is a equipment.');
          memResult.Lines.Add(sReceive);
        end
        else
        begin
          memResult.Lines.Add('Com' + IntToStr(i + 1) + ' connecting is NOT a equipment.');
          tSPComm[i].StopComm;
          tSPComm[i].Destroy;
    //      tSPComm[i].Handle := INVALID_HANDLE_VALUE;
        end;
    }      memResult.Lines.Add(sReceive);
        Inc(i);
      end;
          memResult.Lines.Add('Check over.');
    end;//串口接收事件
    procedure TForm1.ComReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    begin
      memResult.Lines.Add('Read From Com'+IntToStr(TComm(Sender).Tag));
      SetLength(sReceive,BufferLength); //接收RS232的数据并显示Memo1上。
      Move(Buffer^,PChar(sReceive)^,BufferLength);
      memResult.Lines.Add(sReceive);
    //  memResult.Invalidate;   //无效
    end;end.
      

  5.   

    如果键名不是“\Device\SerialN”,怎么做呢?
      

  6.   

    TO: wangxiangsjz(王翔) 
      多谢!