⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 RS232串口通讯随书源码
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, TComm1;

type
  TForm1 = class(TForm)
    rdCOM: TRadioGroup;
    Button4: TButton;
    Button2: TButton;
    Button3: TButton;
    Comm1: TComm;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    txtSpeed: TEdit;
    txtUnit: TEdit;
    txtType: TEdit;
    txtBat: TEdit;
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button4Click(Sender: TObject);
begin
   //确定使用的通信端口号码
  if rdCOM.ItemIndex =0 then
    Comm1.CommPort := pnCOM1
  else
    Comm1.CommPort := pnCOM2;
  //打开通信端口
  Comm1.PortOpen := True;
  Button3.Enabled := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled ;
  if Timer1.Enabled then
    Button3.Caption := '停止取值'
  else
    Button3.Caption := '读取数值';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  DataByte:array of Byte;
  Count,i:Integer;
  DataPT:PByte;
  Diver:LongInt;
  Speed:Single;
begin
  Count := Comm1.ReadInputByte(DataPT);
  SetLength(DataByte,Count);
  Dec(DataPT);
  for i:=0 to Count-1 do
   begin
     Inc(DataPT);
     DataByte[i] := DataPT^;
   end;
  //以下开始检查各字节的状态
  for i:=0 to Count-1 do
   if Ord(DataByte[i])=13 then
    begin
     //第二个Byte决定小数点位置
     if Ord(DataByte[i+1])=0 then Diver := 1;
     if Ord(DataByte[i+1])=1 then Diver := 10;
     if Ord(DataByte[i+1])=2 then Diver := 100;
     if Ord(DataByte[i+1])=4 then Diver := 1000;
     //接着检查电池状态
     if (DataByte[i+2] And $1)=$1 then
       txtBat.Text := 'LOW'
     else
       txtBat.Text := 'OK';
      //以下检查单位
     if (DataByte[i+3] And $1)=$1 then
       txtUnit.Text := 'RPM';
     if (DataByte[i+3] And $2)=$2 then
       txtUnit.Text := 'm/min';
     if (DataByte[i+3] And $4)=$4 then
       txtUnit.Text := 'ft/min';
     if (DataByte[i+3] And $8)=$8 then
       txtUnit.Text := 'yd/min';
     if (DataByte[i+3] And $10)=$10 then
       txtUnit.Text := 'RPS';
      //以下检查方法
     if (DataByte[i+4] And $1)=$1 then
       txtType.Text := 'Normal';
     if (DataByte[i+4] And $2)=$2 then
       txtType.Text := 'MAX';
     if (DataByte[i+4] And $4)=$4 then
       txtType.Text := 'MIN';
     if (DataByte[i+4] And $8)=$8 then
       txtType.Text := 'AVERAGE';
     //以下计算转速
     Speed :=  Ord(DataByte[i+6]) + 256*Ord(DataByte[i+7])
             + 256*256*Ord(DataByte[i+8]) + 256*256*256*Ord(DataByte[i+9]);
     Speed := Speed/Diver; //除上分母
     txtSpeed.Text := FormatFloat('0',Speed);
     exit;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //关闭程序
  Close;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -