如何判断串口打开,接收串口数据,比如刷卡!我用SPCOMM控件,具体点!

解决方案 »

  1.   

    try
      spcomm1.open;
    except
      showmessage('该端口已打开!');
    end;
      

  2.   

    打开串口很简单啊,直接Comm1.StartComm,关闭就是Comm1.StopComm,不过别忘了先设置好波特率和串口号;
    接收事件需要使用SPCOMM控件的RECEIVEDATA事件,当有数据到来时,此事件自动被触发.
    procedure TFrmKQJ.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
     ReceiveBuf:array[0..300] of byte;//接收缓存
     ReceiveBufIndex:integer;//接收到的字节数
    begin 
    //将接收到的数据从SPCOM控件缓冲区复制到ComBuf
      move(Buffer^,ReceiveBuf,Bufferlength);
      ReceiveBufIndex:=Bufferlength;
    END;
      

  3.   

    上面写错了一点
    //将接收到的数据从SPCOM控件缓冲区复制到ComBuf
    应该是:
    //将接收到的数据从SPCOM控件缓冲区复制到ReceiveBuf
      

  4.   

    用现成的控件是不错,但是我一直用我自己写的(低层WIN32),控制和操纵的余地更大、更自由。如果需要我可以发给你。(在多个项目中应用如:短信收发、射频卡、接触卡、下位机控制等等)
      

  5.   

    谢谢 我也想要[email protected]
      

  6.   

    谢谢~~~ 我也想要[email protected]
      

  7.   

    应广大社员要求,公布一下老冯的COMM通讯接口
    ......
    ICommControl = interface
      ['{E81C3798-1F80-4586-A4DD-122584A8FF1A}']
        function CommInit: Integer;
        function CommWrite(var WriteData: string;
                           NumberofBytesToWrite: DWord;
                           PurgeFlag: Boolean;
                           TimeOut: DWord): Integer;
        function CommRead(var ReadData: string;
                          var TotalBytes: Integer;
                          NumberOfBytesToRead: DWord;
                          PurgeFlag: Boolean;
                          TimeOut: DWord): Integer;
        procedure CommPurge(const RWFlag: Integer);
      end;......  TCommControl = class(TInterfacedObject, ICommControl)
      private
        FCommPort: Integer;
        FHandle: DWord;
        FOpened: Boolean;
      protected
        function  OpenComm: Integer;
        function  CloseComm: Integer;
        Procedure SetComm;
        //ICommControl
        function CommInit: Integer;
        function CommWrite(var WriteData: string;
                           NumberofBytesToWrite: DWord;
                           PurgeFlag: Boolean;
                           TimeOut: DWord): Integer;
        function CommRead(var ReadData: string;
                          var TotalBytes: Integer;
                          NumberOfBytesToRead: DWord;
                          PurgeFlag: Boolean;
                          TimeOut: DWord): Integer;
        procedure CommPurge(const RWFlag: Integer);
      public
        constructor Create(const CommPort: Integer);
        destructor Destroy; override;
      end;(FOpened没有对外,是私有域,如果有必要,你可以公布在ICommControl中)下面只公布OPENCOMM(因为全部公布太长了)
     
     function TCommControl.OpenComm: Integer;
    var
      sCommPort:String;
      dwShareMode:DWord;
    begin
      sCommPort:='\\.\COM'+IntToStr(FCommPort);  if FOpened Then
      begin
        Result := -102;
        Exit;
      end;  dwShareMode := 0;  FHandle := Windows.CreateFile(PChar(sCommPort),
                                    GENERIC_READ or GENERIC_WRITE,
                                    dwShareMode,
                                    nil,
                                    OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                                    0);  if FHandle = INVALID_HANDLE_VALUE then
      begin
        Result := -101;
        Exit;
      end;  SetComm;
      FOpened := True;
      Result := 0;
    end;
      

  8.   

    spcomm的话startcom 打开串口
    发送AT触发receviedata事件