非常抱歉,我实在是没有分数了,麻烦哪个大狭帮帮我,把每步的意思写出来。我刚开始学习SPCOMM,非常感谢!
unit FComm;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, SPComm, Spin, ExtCtrls;type
  TF_comm = class(TForm)
    Comm1: TComm;
    Memo1: TMemo;
    Btn_exit: TButton;
    SpinEdit1: TSpinEdit;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    procedure Btn_exitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  F_comm: TF_comm;
  Viewstring,Viewstring1,VS2,ReceiveStrBuffer:string;
  StringBuf : array[1..32] of string;
  i:integer;
  rbuf,sbuf:array[1..8] of byte;
  rP:^integer;
  commflg,send_ok_flg:boolean;
  X : Single;
implementation{$R *.DFM}{打开串口}
procedure TF_comm.FormCreate(Sender: TObject);
begin
  comm1.StartComm;
end;{关闭串口}
procedure TF_COMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  comm1.StopComm;
end;{发送数据 }
procedure SendData;
var
  i:integer;
begin
  viewstring:='';
  commflg:=true;  for i:=1 to 2 do
  begin
    if not F_Comm.comm1.writecommdata(@sbuf[i],1) then
    begin
      commflg:=false;
      break;
    end;
    sleep(2); {发送时字节间的延时}
    viewstring:=viewstring+inttohex(sbuf[i],2)+'';
  end;
  viewstring:='发送'+viewstring;
  F_Comm.memo1.lines.add(viewstring);
//  F_Comm.memo1.lines.add('');
  if not commflg then messagedlg('发送失败!',mterror,[mbyes],0);
end;Procedure Ds_Glb_ADDelay;
const
     _AA = 12345;
     _BB = 54321;
var PI1,PI2 : INTEGER;
begin
     for PI1:=1 to 100000000 do PI2 := _AA * _BB ;
end;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 TF_COMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
  i:integer;
begin
  viewstring :='';
  viewstring1:='';
  rP := @rbuf;
  IF (BufferLength=8) THEN BEGIN
    move(buffer^,pchar(rP^),bufferlength);
    for i:=1 to bufferlength do begin
      viewstring :=viewstring+inttohex(rbuf[i],2)+'';
      viewstring1:=viewstring1+HEX_ASCII(rbuf[i]);
    end;
    viewstring:='接受'+viewstring;
    memo1.lines.add(viewstring);
    memo1.lines.add(viewstring1);
    memo1.lines.add('');{收到无效数据,202020202020200A ,SEND_OK_FLG:= FLASE}
    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 TF_COMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var s: string;
begin
  SetLength(S, BufferLength); //接收RS232的數據並顯示Memo1上。
  Move(Buffer^, PChar(S)^, BufferLength);
  Memo1.Lines.Add(S);
  Memo1.Invalidate;
end;*)procedure TF_comm.Btn_exitClick(Sender: TObject);
begin
 { comm1.StopComm; }  F_comm.Close;
end;Procedure 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[1]:=Byte($15); {帧头}
    Sbuf[2]:=Byte($0A); {命令号}
    SendData;{调用发送函数}
    Sleep(70);
    Application.ProcessMessages;
    IF SEND_OK_FLG THEN StringBuf[NUM]:= viewString1;
    ReceiveStrBuffer:=  StringBuf[NUM];
    INC(COUNT);
  UNTIL SEND_OK_FLG OR (COUNT>=2);
END;Procedure BiaoStr_To_Val(S:String; Var Y:Single );
begin
  IF  S='' Then S := '0';
  Y:= StrToFloat(S);
  Y:= ABS(Y);
end;procedure TF_comm.Button1Click(Sender: TObject);
var y:byte;
begin
  y:=SpinEdit1.Value;
  Master_SendData(y, VS2);
  Edit1.Text := VS2;
  BiaoStr_To_Val(VS2, X);
  Edit1.Text  := FloatToStrF(X,ffGeneral,6,1);
end;