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

📄 recvdata.~pas

📁 使用Delphi 6.0开发用于控制空调的程序
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
unit RecvData;

interface

uses
  Classes,SysUtils;

type
  TRecvData = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Update();
    procedure Fengli(ss:string);
  public
    strDeal:string;
    strRecv:array [1..64] of string;
    constructor Create(strRe: string;bSupend:Boolean);
   end;

implementation

{ Important: Methods and properties of objects in VCL or CLX can only be used
  in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TRecvData.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TRecvData }

uses
   Installed_Simu,IDShow,ACC,IDPaperAbalInfo, ACCShow,comm,Login,Pass_Pope_Modify,
  URegister,Data,TempChart,ADDAC,ControlClass,ACRM,qry,Main,ReceMsg,DB, ADODB;

procedure TRecvData.Execute;
begin
  { Place thread code here }
  FreeOnTerminate := True;
  Synchronize(Update);
end;

constructor TRecvData.Create(strRe: string;bSupend:Boolean);
begin
  FreeOnTerminate := True;
  strDeal := strRe;
end;
function hex(c:char):Integer;
var
   x:integer;
begin
    if c='' then
       x:=0
    else if(Ord(c)>=ord('0'))and (Ord(c)<=ord('9')) then
        x:=Ord(c)-Ord('0')
    else if(Ord(c)>=ord('a'))and (Ord(c)<=ord('f')) then
        x:=Ord(c)-Ord('a')+10
    else if(Ord(c)>=ord('A'))and (Ord(c)<=ord('F')) then
        x:=Ord(c)-Ord('A')+10
    else
     x:=-1;
    Result:=x;
end;
//该函数结束1~2个字符,转换成功,输出对应十六进制的值,转换失败,输出-1
function HexToInt(S:String):Integer;
var
  tmpInt1,tmpInt2,tmpInt3:integer;
begin
    if Length(S)=1 then
    begin
       Result:=hex(S[1]);
    end
    else if Length(S)=2 then
    begin
      tmpInt1:=hex(S[1]);
      tmpInt2:=hex(S[2]);
      if(tmpInt1=-1) or (tmpInt2=-1) then
        Result:=-1
      else
        Result:=tmpInt1*16+tmpInt2;
    end 
    else if Length(S)=3 then
    begin
        tmpInt1:=hex(S[1]);
        tmpInt2:=hex(S[2]);
        tmpInt3:=hex(S[3]);
        if(tmpInt1=-1) or (tmpInt2=-1) or (tmpInt3=-1) then
          Result:=-1
        else
          Result:=tmpInt1*16*16 + tmpInt2*16 + tmpInt3;
    end
    else
      Result:=-1;
end;

procedure TRecvData.FengLi(ss:string);
var    //将字符串存在字符串数组中
  i,
  icount,
  ilen,
  iStart,
  iEnd:Integer;
  iData:Integer;
  str:string;
begin
   ilen := Length(ss);
   icount := 1;
   iStart := 0;
   iEnd := 0;
  // ShowMessage('分离后的字符串:'+ss);
   for i := 1 to 64 do
   begin
     strRecv[i] := '';
   end;

//   for i:= 1 to ilen do
//   begin
//     if ss[i] = #126then    //起始符
//        iStart := i
//     else
//     if ss[i] = #13 then     //结束符
//     begin
//         iEnd := i;
//         strRecv[ icount ] := Copy(ss,iStart,iEnd - iStart + 1  );
//         Inc(icount);
//     end;
//   end;
   while i <= ilen do
   begin
      if ss[i] = #126 then
      begin
        if ss[i + 1] = '2' then
        begin
          if ss[i + 2] = '0' then
          begin
            iStart := i;
            str := Copy( ss, i+ 10 ,3);
            iData := HexToInt(str);
            strRecv[ icount ] := Copy(ss,iStart,iData + 13 +5 );
            Inc(icount);
            i := iData + 13 + 4;
          end;
        end;
      end;
   end;  //while
end;

procedure TRecvData.Update;
var
  strReceBuf,
  strTempI:string;
  tempStr:string;
  j:Integer;
  ReMsg:TReceMsg;
 qry:TADOQuery;
  strRecv:array [1..64] of string;
  strSBB,strLenID:string;
begin  
    for  j := 1 to 64 do
   begin
    if strRecv[j] = '' then
    begin
        Break;
        if j = 1 then   Break;
        if j = 64 then  Break;
    end
    else
    begin
    // mmo2.Lines.Add('接收到的字符串进入处理字符串:'+Arrstr[j]);
       tempStr := strRecv[j];
       ReMsg := TReceMsg.Create(tempStr,frmain.conAir);
      //mmo2.Lines.Add('ReMsg接收到的字符串:'+ tempStr + '接收的长度为:'+intTostr(Length(tempStr)));
//     **************获取设定参数****************************/
//     if Data.frmData.iGAP = 1 then
//     begin
//       ReMsg.GAP;
//       if ReMsg.strError <> '正常' then
//       begin
//         frmData.statData.SimpleText := '接收到的数据出错:'+ReMsg.strError ;
//         Exit;
//       end;
//       frmData.statData.SimpleText  := ReMsg.strError ;
//       frmData.edtOpenTemp.Text := IntToStr( ReMsg.ACTemp.iOpenTemp);
//       frmData.edtCloseTemp.Text := IntToStr(ReMsg.ACTemp.iCloseTemp);
//       frmData.edtReturnTempCeiling.Text := IntToStr(ReMsg.ACTemp.iReturnTempCeiling);
//       frmData.edtReturnTempLimit.Text := IntToStr(ReMsg.ACTemp.iReturnTempLimit);
//       frmData.edtReturnHumidityCelling.Text := IntToStr(ReMsg.ACTemp.iReturnHumidityCeiling);
//       frmData.edtReturnHumidityLimit.Text := IntToStr(ReMsg.ACTemp.iReturnHumidityLimit);
//
//       ///主窗体
//       if ReMsg.ACTemp.strAddress = '01' then
//       begin
//         frmain.edtOpenTemp1.Text :=  IntToStr( ReMsg.ACTemp.iOpenTemp);
//         edtCloseTemp1.Text :=  IntToStr(ReMsg.ACTemp.iCloseTemp);
//       end;
//       if ReMsg.ACTemp.strAddress = '02' then
//       begin
//         edtOpenTemp2.Text :=  IntToStr( ReMsg.ACTemp.iOpenTemp);
//         edtCloseTemp2.Text :=  IntToStr(ReMsg.ACTemp.iCloseTemp);
//       end;
//       if ReMsg.ACTemp.strAddress = '03' then
//       begin
//         edtOpenTemp3.Text :=  IntToStr( ReMsg.ACTemp.iOpenTemp);
//         edtCloseTemp3.Text:=  IntToStr(ReMsg.ACTemp.iCloseTemp);
//       end;
//       ///主窗体
//       if iSave = 1 then
//       begin
//       try
//                qry := TADOQuery.Create(qry);
//                qry.Connection := conAir;
//                with qry do
//                begin
//                   Close;
//                   SQL.Clear;
//                   SQL.Add('insert into ACInfo(时间,ID,ACAddress,空调开机温度,');
//                   SQL.Add('空调关机温度,回风温度上限,回风温度下限,回风湿度上限,回风湿度下限)');
//                   SQL.Add('VALUES(:sj,:IID,:ADD,:TO,:TC,:TH,:TL,:HC,:HL)');
//                   Parameters.ParamByName('sj').Value := Now;
//                   Parameters.ParamByName('IID').Value := '00';
//                   Parameters.ParamByName('ADD').Value := ReMsg.ACTemp.strAddress;
//                   Parameters.ParamByName('TO').Value := ReMsg.ACTemp.iOpenTemp;

⌨️ 快捷键说明

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