我下载并安装了SPCOMM控件,并按照网上的例子运行了以下。
只能发送数据,但却接收不了数据,搞了很久,请各位指点?接收数据的例子是这样说的,但好象根本没触发这个事件呀??
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
 tmpArray:array[0..4096] of Byte;
 ArraySize,i: DWORD;
 Count:DWORD;
 tmpStr:string;
 pStr:PChar;
begin
  if Check1.Checked  then
  begin
   pStr:=Buffer;
   tmpStr:=string(pStr);
   Dec(PStr);
   for i:=0 to Length(tmpStr)-1 do
    begin
     inc(PStr);
     tmpArray[i]:=Byte(PSTR^);
     Memo2.Lines.Add(IntToHEX(Ord(tmpArray[i]),2));
    end;
   exit;
  end;
  pStr:= Buffer;
  memo2.Lines.Add(pStr);
end;

解决方案 »

  1.   

    这个问题点就大了,可能是硬件连线的问题(如接收RXD接错)、也可能是控制协议(波特率、校验等)的问题等等。
    我建议你先设个断点确定有没有发生ReceiveData,如果有,则我建议你这样收:
    procedure TfrmMain.CommReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      receiveStr : string;                               
    begin
      SetLength (receiveStr,bufferLength);
      Move (buffer^,PChar (receiveStr)^,bufferLength);
      ...
    end;
    如果没有的话可能就是上述的问题了。
      

  2.   

    我设了断点,没有触发ReceiveData事件哦。
    硬件连线的问题吗?我用的是考勤机的串口连接,考勤机可以正常使用,调用厂家提供的dll扫得到数据。
    但怎么我想用spcomm控件(不用厂家的dll)却不能获得数据呢?
      

  3.   

    有点弄不懂了,你把DFM文件贴出来看看?
      

  4.   

    object Form1: TForm1
      Left = 199
      Top = 110
      Width = 691
      Height = 489
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = ANSI_CHARSET
      Font.Color = clWindowText
      Font.Height = -13
      Font.Name = '宋体'
      Font.Style = []
      OldCreateOrder = False
      OnCloseQuery = FormCloseQuery
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 16
        Top = 16
        Width = 26
        Height = 13
        Caption = '发送'
      end
      object Label2: TLabel
        Left = 344
        Top = 16
        Width = 26
        Height = 13
        Caption = '接收'
      end
      object Memo1: TMemo
        Left = 8
        Top = 32
        Width = 321
        Height = 377
        ImeName = '中文 (简体) - 智能 ABC'
        Lines.Strings = (
          '0123456789')
        TabOrder = 0
      end
      object Memo2: TMemo
        Left = 336
        Top = 32
        Width = 337
        Height = 377
        ImeName = '中文 (简体) - 智能 ABC'
        Lines.Strings = (
          'http://www.kaer.cn/default.aspx')
        TabOrder = 1
      end
      object Button3: TButton
        Left = 120
        Top = 424
        Width = 89
        Height = 25
        Caption = '发送数据'
        TabOrder = 2
        OnClick = Button3Click
      end
      object Button4: TButton
        Left = 544
        Top = 424
        Width = 75
        Height = 25
        Caption = '退出'
        TabOrder = 3
        OnClick = Button4Click
      end
      object Check1: TCheckBox
        Left = 264
        Top = 424
        Width = 121
        Height = 17
        Caption = '十六进制/字符'
        TabOrder = 4
      end
      object Comm1: TComm
        CommName = 'COM1'
        BaudRate = 9600
        ParityCheck = False
        Outx_CtsFlow = False
        Outx_DsrFlow = False
        DtrControl = DtrEnable
        DsrSensitivity = False
        TxContinueOnXoff = True
        Outx_XonXoffFlow = True
        Inx_XonXoffFlow = True
        ReplaceWhenParityError = False
        IgnoreNullChar = False
        RtsControl = RtsEnable
        XonLimit = 500
        XoffLimit = 500
        ByteSize = _8
        Parity = None
        StopBits = _1
        XonChar = #17
        XoffChar = #19
        ReplacedChar = #0
        ReadIntervalTimeout = 1
        ReadTotalTimeoutMultiplier = 0
        ReadTotalTimeoutConstant = 0
        WriteTotalTimeoutMultiplier = 0
        WriteTotalTimeoutConstant = 0
        OnReceiveData = Comm1ReceiveData
        Left = 8
        Top = 416
      end
    end
      

  5.   

    Pstr:=Buffer;// 缓冲区开始指针
    SetLength(TempStr, BufferLength);
    For I:=1 to BufferLength do  TempStr[i] := (Pstr+i-1)^;//
      

  6.   

    把ReadIntervalTimeout改大一点,如100试试。
      

  7.   

    如果ReadIntervalTimeout为1的话9600以上波特率连一个字符也收不到。