📄 recvdata.~pas
字号:
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 + -