unit COMM;interface uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, SPComm, ExtCtrls, Buttons, ComCtrls, Menus; type  TForm1 = class(TForm)     Com1: TComm;     Button4: TButton;    GroupBox1: TGroupBox;    Button1: TButton;   Button2: TButton;    Button3: TButton;
    Button5: TButton;
    memo1: TMemo;
    edRx: TEdit;
    Memo2: TMemo;
    Timer1: TTimer;
    Label4: TLabel;
    Label8: TLabel;
    Button11: TButton;
    Button10: TButton;
    Button12: TButton;
    Edit2: TEdit;
    Button13: TButton;
    Edit3: TEdit;
    Button14: TButton;
    Button15: TButton;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    edTx: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label18: TLabel;
    Button16: TButton;
    Button7: TButton;
    GroupBox3: TGroupBox;
    Label14: TLabel;
    Label15: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Com1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    procedure Button3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure ComboBox3Change(Sender: TObject);
    procedure ComboBox4Change(Sender: TObject);
    procedure ComboBox5Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Edit5Change(Sender: TObject);
    procedure Edit6Change(Sender: TObject);
    procedure Edit7Change(Sender: TObject);
    procedure Edit8Change(Sender: TObject);
    procedure Edit9Change(Sender: TObject);
    procedure Edit10Change(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);       private
    { Private declarations }
        FShowText:Boolean;
        FRXNum:Integer;
    FTXNum:Integer;
    procedure ShowRX;
    procedure ShowTX;
         procedure SendString(const str:string);
  private     { Private declarations }  public    { Public declarations }  end; var   Form1: TForm1;   viewstring:string;   test: string;
   i:integer;   rbuf,sbuf:array[0..16] of byte;
   implementation
    uses StrUtils;
  const
  minWidth=627;
  minHeight=444;
  idAbout =$F200;
 {$R *.dfm}
 //打开串口 procedure TForm1.Button1Click(Sender: TObject); begin
  Com1.StopComm;  Com1.StartComm;  Button1.Enabled :=False; Button2.Enabled :=True; end;//关闭串口 procedure TForm1.Button2Click(Sender: TObject); begin  Com1.StopComm;   Button2.Enabled := False;   Button1.Enabled := True;
 end;
  //自定义发送数据过程  procedure   senddata;  var  i:integer;  commflg:boolean;  begin  viewstring:='';  commflg:=true;  for   i:=1   to  9   do  begin  if   not  form1.com1.writecommdata(@sbuf[i],1)   then  begin  commflg:=false;  break;         end;
      
  //发送时字节间的延时  sleep(2);  viewstring:=viewstring+'   '+inttohex(sbuf[i],2)+'';
  end;  viewstring:=viewstring;form1.memo2.lines.add(viewstring);form1.memo1.lines.add('');  if   not   commflg   then   messagedlg('设备尚未就绪,请您检查设备是否连接或者串口是否打开!'   ,mterror,[mbyes],0);  end;   procedure   senddata4;  var  i:integer;  commflg:boolean;  begin  viewstring:='';  commflg:=true;  for   i:=1   to  8   do  begin  if   not  form1.com1.writecommdata(@sbuf[i],1)   then  begin  commflg:=false;  break;         end;
      
  //发送时字节间的延时  sleep(2);  viewstring:=viewstring+'   '+inttohex(sbuf[i],2)+'';
  end;  viewstring:=viewstring;form1.memo2.lines.add(viewstring);form1.memo1.lines.add('');  if   not   commflg   then   messagedlg('设备尚未就绪,请您检查设备是否连接或者串口是否打开!'   ,mterror,[mbyes],0);  end;
 //打开阀门
procedure TForm1.Button4Click(Sender: TObject);
  Var
   U:integer;
 begin
 test := '打开阀门';
   if label15.caption='' then
   begin
   showmessage('请先抄表获取表号') ;
   exit;
  end
   else
    Form1.Memo1.Clear;
    Form1.Memo2.Clear; U:= strtoint('$'+trim( label15.caption)) + ($A6);
 edit2.text:=IntToHex(U,2);sbuf[1]:=byte($EA ); {帧头}sbuf[2]:=byte($EA );sbuf[3]:=byte($07 );sbuf[4]:=Byte(StrToInt('$'+trim( label15.caption)) ); {命令号}sbuf[5]:=byte($4F );sbuf[6]:=byte($50 );sbuf[7]:=byte($00 );sbuf[8]:=byte(StrToInt('$'+trim( Edit2.text)) ); {校验和} // StrToInt('$'+String(U))sbuf[9]:=byte($16 );senddata;{调用发送函数}form1.Button9.Click;
end;
procedure TForm1.Button10Click(Sender: TObject); begin
    Form1.Memo1.Clear;
    Form1.Memo2.Clear;sbuf[1]:=byte($EA); {帧头}sbuf[2]:=byte($EA);sbuf[3]:=byte($07);sbuf[4]:=byte($ff);sbuf[5]:=byte($50);sbuf[6]:=byte($46);sbuf[7]:=byte($ff);sbuf[8]:=byte($9d);sbuf[9]:=byte($16);senddata;{调用发送函数}form1.Button9.Click;
end;procedure TForm1.Button12Click(Sender: TObject);
 Var
   U:integer;
 begin
 if label15.caption= '' then
 begin
 showmessage('请先抄收水表表号')  ;
 exit;
 end
 else
  test := '查询余额与阀门状态';
 Form1.Memo1.Clear;
    Form1.Memo2.Clear; U:= strtoint('$'+trim( label15.caption)) + ($a2);
 edit2.text:=IntToHex(U,2);sbuf[1]:=byte($EA); {帧头}sbuf[2]:=byte($EA);sbuf[3]:=byte($07);sbuf[4]:=Byte(StrToInt('$'+trim( label15.caption))); {命令号}sbuf[5]:=byte($43);sbuf[6]:=byte($58);sbuf[7]:=byte($00);sbuf[8]:=byte(StrToInt('$'+trim( Edit2.text)));sbuf[9]:=byte($16);senddata;{调用发送函数}form1.Button9.Click;
end;
procedure TForm1.ShowRX;
begin
  edRX.Text:='Rx:'+IntTostr(FRXNum);
end;procedure TForm1.ShowTX;
begin
  edTx.Text:='Tx:'+IntTostr(FTXNum);
end; //定义  senddata3
 procedure   senddata3;  var  i:integer;  commflg:boolean;  begin  viewstring:='';  commflg:=true;  for   i:=1   to  15   do  begin  if   not  form1.com1.writecommdata(@sbuf[i],1)   then  begin  commflg:=false;  break;  end;
      
  //发送时字节间的延时  sleep(2); viewstring:=viewstring+'   '+inttohex(sbuf[i],2)+'';
  end;  viewstring:=viewstring;form1.memo2.lines.add(viewstring);form1.memo1.lines.add('');  if   not   commflg   then   messagedlg('发送失败!'   ,mterror,[mbyes],0);  end;//设置时间命令
procedure TForm1.Button3Click(Sender: TObject);
var
    U:integer;
 begin
  test := '设置时间命令';
  Form1.Memo1.Clear;
    Form1.Memo2.Clear; U:= strtoint('$'+trim( Edit5.text))+strtoint('$'+trim( Edit6.text))+strtoint('$'+trim( Edit7.text)) + strtoint('$'+trim( Edit8.text))+strtoint('$'+trim( Edit9.text))+strtoint('$'+trim( label15.caption)) + strtoint('$'+trim( Edit10.text))+strtoint('$'+trim( Edit11.text))+($b8);
 edit2.text:=IntToHex(U,2);sbuf[1]:=byte($EA); {帧头}sbuf[2]:=byte($EA);sbuf[3]:=byte($0d);sbuf[4]:=Byte(StrToInt('$'+trim( label15.caption))); {命令号}sbuf[5]:=byte($58);sbuf[6]:=byte($53);sbuf[7]:=byte(StrToInt('$'+trim( Edit5.text)));//年sbuf[8]:=byte(StrToInt('$'+trim( Edit6.text)));//月sbuf[9]:=byte(StrToInt('$'+trim( Edit7.text))); //星期sbuf[10]:=byte(StrToInt('$'+trim( Edit8.text))); //日期sbuf[11]:=byte(StrToInt('$'+trim( Edit9.text)));  //时sbuf[12]:=byte(StrToInt('$'+trim( Edit10.text)));  //分sbuf[13]:=byte(StrToInt('$'+trim( Edit11.text)));   //秒sbuf[14]:=byte(StrToInt('$'+trim( Edit2.text)));   //校验和sbuf[15]:=byte($16);senddata3;{调用发送函数}Form1.Button9.Click; end;procedure TForm1.ListBox1Click(Sender: TObject);
begin
   Com1.StopComm;
   Com1.CommName:=ComboBox1.Text;
   Com1.StartComm;end;

解决方案 »

  1.   

    procedure Tform1.Com1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);var str :string;
        s:string;
        u:string;
        t:string;
        p:string;
     begin
      SetLength(Str,BufferLength);
      move(buffer^,pchar(@Str[1])^,bufferlength);
      s:=memo1.text;
      begin  //打开阀门
     if   test = '打开阀门' then
       begin
            Memo1.Text:='表号:'+StrToHexStr(Str[4])+'                                                          '+'校验: '+ StrToHexStr(Str[9]) +'                                                         ' +'是否执行成功:'  +StrToHexStr(Str[5])+'';
     begin
      p:=StrToHexStr(Str[8]);
       if pos('01',p)>0 then
          label20.caption:='关闭'
      else  if  pos('00',p)>0 then
          label20.caption:='打开'
      else   if  pos('02',p)>0 then
          label20.caption:='阀门传感器进水或失效'
      else
          label20.caption:='状态未知'
      end;   end;
      begin
    u:=memo1.text;
        P:= StrToHexStr(Str[8]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:打开'
       else if pos('01',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:关闭'
       else if pos('02',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:阀门传感器进水或失效'
       else
        memo1.text:=u+'                                           '+'阀门状态:状态未知'
        end;
      begin
       u:=memo1.text;
        P:= StrToHexStr(Str[7]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                               '+'电池电压:正常'
       else
        memo1.text:=u+'                                               '+'电池电压:不正常'
       end;
      begin
        u:=memo1.text;
        P:= StrToHexStr(Str[5]);
       if pos('4F',p)>0 then
      memo1.text:=u+'                                            '+'打开阀门成功'
      else
      memo1.text:=u+'                                            '+'阀门已经处于打开状态'
      end;
      end;
     //查询余额与阀门状态
     if   test = '查询余额与阀门状态' then
       begin
            Memo1.Text:='表号:'+StrToHexStr(Str[4])+'                                                          '+'序列号: '+ StrToHexStr(Str[5]) + StrToHexStr(Str[6]) + StrToHexStr(Str[7]) + StrToHexStr(Str[8]) +'                                           '+'累计充值次数: '+ StrToHexStr(Str[9])+ StrToHexStr(Str[10])+'                                          '+'校验: '+ StrToHexStr(Str[12]) +'' ;
            label10.Caption:=  StrToHexStr(Str[5])  ;
            label11.Caption:=  StrToHexStr(Str[6])  ;
            label12.Caption:=  StrToHexStr(Str[7])  ;
            label13.Caption:=  StrToHexStr(Str[8])  ;
            label17.Caption:=  StrToHexStr(Str[9])+StrToHexStr(Str[10]);
            U:=StrToHexStr(Str[11]);
            t:=memo1.text;
     if pos('00',u)>0 then
        memo1.text:=t+'                                                        '+'阀门状态:打开'
     else if  pos('01',u)>0 then
        memo1.text:=t+'                                                        '+'阀门状态:关闭'
     else if  pos('02',u)>0 then
        memo1.text:=t+'                                                        '+'阀门状态:阀门传感器进水或失效'
     else if  pos('03',u)>0 then
        memo1.text:=t+'                                                        '+'阀门状态:状态未知'
       end; //关闭阀门
     if   test = '关闭阀门' then
       begin
       Memo1.Text:='表号:'+StrToHexStr(Str[4])+'                                                        '+'校验: '+ StrToHexStr(Str[9]) +'                                                         ' +'是否执行成功:'  +StrToHexStr(Str[5])+'';
     begin
            p:=StrToHexStr(Str[8]);
         if pos('01',p)>0 then
          label20.caption:='关闭'
      else   if  pos('00',p)>0 then
          label20.caption:='打开'
      else   if  pos('02',p)>0 then
          label20.caption:='阀门传感器进水或失效'
      else
          label20.caption:='状态未知'
       end;   begin
        u:=memo1.text;
        P:= StrToHexStr(Str[8]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:打开'
       else if pos('01',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:关闭'
       else if pos('02',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:阀门传感器进水或失效'
       else
        memo1.text:=u+'                                           '+'阀门状态:状态未知'
       end;   begin
       u:=memo1.text;
        P:= StrToHexStr(Str[7]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                               '+'电池电压:正常'
       else
        memo1.text:=u+'                                               '+'电池电压:不正常'
       end;   begin
        u:=memo1.text;
        P:= StrToHexStr(Str[5]);
      if pos('4F',p)>0 then
      memo1.text:=u+'                                            '+'关闭阀门成功'
      else
      memo1.text:=u+'                                            '+'阀门已经处于关闭状态'
       end;
       end; //充值
     if   test = '充值' then
       begin
          Memo1.Text:='表号:'+StrToHexStr(Str[4])+'                                                          '+'序列号: '+ StrToHexStr(Str[7]) + StrToHexStr(Str[8]) + StrToHexStr(Str[9]) + StrToHexStr(Str[10]) +'                                           '+'累计水量: '+ StrToHexStr(Str[11])+ StrToHexStr(Str[12])+'                                              '+'校验: '+ StrToHexStr(Str[13]) +'                                                         ' +'是否执行成功:'  +StrToHexStr(Str[5])+'';
       begin
        u:=memo1.text;
        P:= StrToHexStr(Str[6]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:打开'
       else if pos('01',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:关闭'
       else if pos('02',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:阀门传感器进水或失效'
       else
        memo1.text:=u+'                                           '+'阀门状态:状态未知'
       end;
       begin
       u:=memo1.text;
        P:= StrToHexStr(Str[5]);
      if pos('4F',p)>0 then
      memo1.text:=u+'                                             '+'充值成功'
      else
      memo1.text:=u+'                                             '+'充值失败'
       end;
       end; //取消充值
     if   test = '取消充值' then
       begin
       Memo1.Text:='表号:'+StrToHexStr(Str[4])+'                                                          '+'序列号: '+ StrToHexStr(Str[7]) + StrToHexStr(Str[8]) + StrToHexStr(Str[9]) + StrToHexStr(Str[10]) +'                                           '+'累计水量: '+ StrToHexStr(Str[11])+ StrToHexStr(Str[12])+'                                              '+'校验: '+ StrToHexStr(Str[13]) +'                                                         ' +'是否执行成功:'  +StrToHexStr(Str[5])+'' ;
       begin
        u:=memo1.text;
        P:= StrToHexStr(Str[6]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:打开'
       else if pos('01',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:关闭'
       else if pos('02',p)>0 then
        memo1.text:=u+'                                           '+'阀门状态:阀门传感器进水或失效'
       else
        memo1.text:=u+'                                           '+'阀门状态:状态未知'
       end;
       begin
       u:=memo1.text;
       P:= StrToHexStr(Str[5]);
      if pos('4F',p)>0 then
      memo1.text:=u+'                                            '+'取消充值成功'
      else
      memo1.text:=u+'                                            '+'取消充值失败'   end;
       end;
     //设置时间命令
     if   test = '设置时间命令' then
       begin
       Memo1.Text:='表号:'+StrToHexStr(Str[4])+'                                                          '+'时间: '+ StrToHexStr(Str[7]) +'年' +StrToHexStr(Str[8]) +'月'+ StrToHexStr(Str[10]) +'日    '+ '星期'+StrToHexStr(Str[9]) +'                       具体时间:'+StrToHexStr(Str[11])+ '时' +StrToHexStr(Str[12])+ '分' +StrToHexStr(Str[13])+ '秒' +'                               '+'校验: '+ StrToHexStr(Str[13]) +''   ;
       end; //抄表
     if  test='抄表' then
       begin
        label15.Caption:=  StrToHexStr(Str[1])  ;
       memo1.Text:='表号:'+StrToHexStr(Str[1])+'                                                          '+'水表读数:'+ StrToHexStr(Str[7])+StrToHexStr(Str[8])+'                                                   ' +'累计水量:'+ StrToHexStr(Str[9]) +StrToHexStr(Str[10])+'                                                 ' +'充值次数:'+ StrToHexStr(Str[11])+StrToHexStr(Str[12])+'';
        t:=memo1.text;
        u:=StrToHexStr(Str[14]);
     begin
         if pos('01',u)>0 then
          label20.caption:='关闭'
      else   if  pos('00',u)>0 then
          label20.caption:='打开'
      else   if  pos('02',u)>0 then
          label20.caption:='阀门传感器进水或失效'
      else
          label20.caption:='状态未知'
       end;
      begin
     u:=memo1.text;
        P:= StrToHexStr(Str[4]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                                  '+'读表状态:正常'
       else
        memo1.text:=u+'                                                  '+'读表状态:不正常'
       end;
     begin
       u:=memo1.text;
        P:= StrToHexStr(Str[13]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                               '+'电池电压:正常'
       else
        memo1.text:=u+'                                               '+'电池电压:不正常'
       end;
     begin
       u:=memo1.text;
        P:= StrToHexStr(Str[14]);
       if  pos('00',p)>0 then
        memo1.text:=u+'                                               '+'阀门状态:打开'
       else if pos('01',p)>0 then
        memo1.text:=u+'                                               '+'阀门状态:关闭'
       else if pos('02',p)>0 then
        memo1.text:=u+'                                               '+'阀门状态:阀门传感器进水或失效'
       else
        memo1.text:=u+'                                               '+'阀门状态:状态未知'    end;
       end;
     end;