各位大虾!小弟刚学习DELPHI中的SPCOMM控件,不知道谁有电子板的书籍,能否给我一份?我的邮件地址是:[email protected]
SPCOMM关于接收事件我始终没有看明白,不知道哪位大虾帮忙解决一下,程序如下:
unit Szsy_Rs485;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  SPComm,Szsy_Glb;type
  TSs_RS485 = class(TForm)
    Szsy_Comm: TComm;
    procedure Szsy_CommReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    Procedure Master_SendData(Num:Byte; VAR ReceiveStrBuffer:String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Ss_RS485: TSs_RS485;implementation{$R *.DFM}FUNCTION HEX_ASCII(X:INTEGER):STRING;
BEGIN
  CASE X OF
  45  :  HEX_ASCII := '-';
  46  :  HEX_ASCII := '.';
  48  :  HEX_ASCII := '0';
  49  :  HEX_ASCII := '1';
  50  :  HEX_ASCII := '2';
  51  :  HEX_ASCII := '3';
  52  :  HEX_ASCII := '4';
  53  :  HEX_ASCII := '5';
  54  :  HEX_ASCII := '6';
  55  :  HEX_ASCII := '7';
  56  :  HEX_ASCII := '8';
  57  :  HEX_ASCII := '9';
  ELSE   HEX_ASCII := ' ';
  END;
END;Procedure TSs_RS485.Szsy_CommReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
Var
  I:Integer;
Begin
  ViewString:='';
  rP := @rBuf;
  IF (BufferLength=8) THEN BEGIN
    Move(Buffer^,Pchar(rP^),BufferLength);
    For I:=1 to BufferLength do Begin
      ViewString:=ViewString+HEX_ASCII(rbuf[I]);
    End;
{收到无效数据,202020202020200A ,SEND_OK_FLG:= FALSE}
    Send_OK_Flg:= FALSE;
    FOR I:=2 TO 7 DO BEGIN
      IF (rbuf[I]=32)  THEN Send_OK_Flg:=( FALSE OR Send_OK_Flg)
                       ELSE Send_OK_Flg:=(  TRUE OR Send_OK_Flg);
    END;
//    IF NOT Send_OK_Flg THEN Send_OK_Flg:= FALSE
//                       ELSE Send_OK_Flg:=  TRUE;  END
  ELSE  Send_OK_Flg:= False;
end;
procedure SendData;
var
  I:Integer;
begin
  CommFlg:=True;
  For I:=1 to 2 do
  Begin
    IF Not Ss_RS485.Szsy_Comm.WriteCommData(@sbuf[I],1) Then
    Begin
      CommFlg:=False;
      Break;
    End;
    Sleep(2); {发送时字节间的延时}
  End;
//  if not CommFlg then MessageDlg('发送失败!',mterror,[mbyes],0);
end;Procedure TSs_RS485.Master_SendData(NUM:BYTE;VAR ReceiveStrBuffer:String);
VAR  X ,COUNT : BYTE;
BEGIN
  SEND_OK_FLG:=FALSE;
  COUNT :=0;
  REPEAT
    X := 64+NUM;
    Sbuf[1]:=Byte(X); {帧头}
    Sbuf[2]:=Byte($0A); {命令号}
    SendData;{调用发送函数}
    Sleep(70);
    Application.ProcessMessages;
                            //为什么要加这句?    IF SEND_OK_FLG THEN StringBuf[NUM]:= ViewString;
                                //这个ViewString=?还有这个SEND_OK_FLG始终为假啊!
    ReceiveStrBuffer := StringBuf[NUM];
                                //StringBuf[NUM]是不是@sbuf中的内容?
    INC(COUNT);
  UNTIL SEND_OK_FLG OR (COUNT>=2);
END;
Procedure BiaoStr_To_Val(S:String; Scale:Single; Var Y:Single);
begin
  IF  S='' Then S := '0';
  Try
    Y:= StrToFloat(S);
    Y:= ABS(Scale*Y);
  Except
    Exit;
  End;
end;end.以下是调用的代码:
procedure TSs_Xtcs.Szsy_Xtcs_I1NameClick(Sender: TObject);
begin
    Szsy_Xtcs_I1Name.BevelOuter:= bvLowered;
    Ss_Rs485.Master_SendData(I1BH,VS2);
    BiaoStr_To_Val(VS2,Vscale_I1, _VAV);
    Szsy_Xtcs_I1D.Text := FloatToStrF(_VAv, ffFixed, 7, 0);
    Szsy_Xtcs_I1Name.BevelOuter:= bvRaised;
end;
问题:
Szsy_Xtcs_I1D.Text中的内容应该为接收的数据,为什么没有看见调用接收呢?
难道SPCOMM是自动接收的?但是系统怎么知道我要把接收的数据显示在哪个TEXT中呢?怎么在后面调用的时候始终没有看见接收的触发呢?
个人想法:
我觉得Szsy_Xtcs_I1D.Text应该是StringBuf[NUM];中的数据,