📄 publicunitforcall.pas
字号:
decimal_fractionint:=Hex_Int(decimal_fractionHex);
decimal_fractionFloat:=decimal_fractionint*0.01;
IntegerPartHex:=copy(ReadStrhex,1,6);
IntegerPartint:=Hex_Int(IntegerPartHex);
result:= IntegerPartint+decimal_fractionFloat;
end;
end;
function StringXorOperator(const s:string):string;
var
i: integer;
FirstByte,SecondByte:byte;
begin
FirstByte:=0;
for i:=1 to (length(s) div 2) do
begin
SecondByte:=strtoint('$'+S[2*i-1]+S[2*i]);
FirstByte:=FirstByte xor SecondByte;
end;
result :=inttohex(FirstByte,2);
end;
function ByteAndProcess(const Hex1,Hex2:string):string;
var
i: integer;
FirstByte,SecondByte,AndByte:byte;
temp:string;
begin
FirstByte:=0;
for i:=1 to (length(Hex1) div 2) do
begin
FirstByte:=strtoint('$'+Hex1[2*i-1]+Hex1[2*i]);
SecondByte:=strtoint('$'+Hex2[2*i-1]+Hex2[2*i]);
AndByte:=FirstByte XOR SecondByte;
temp:=temp+inttohex(AndByte,2);
end;
result :=temp;
end;
//接收数据过程 ------------------------------ ----- ------ ---- --- ----- -- ----
function DataReceived(): boolean;
var
i,j : integer;
inBuff : array[0..2047] of char;
nBytesRead,dwError : longWord;
recStr : string;
cs : TCOMSTAT;
begin
for i:=0 to 8 do //循环5次
begin
sleep(DelayTimeForReceive); //每次发送数据后等30ms再开始接收数据
clearCommError(hComm,dwError,@CS);
if cs.cbInQue>sizeof(inBuff) then //接收溢出
begin
PurgeComm(hComm,PURGE_RXCLEAR);
// MessageBox(handle,'传入数据太长','数据',MB_OK);
result:=FALSE;
exit;
end;
ReadFile(hComm,inBuff,cs.cbInQue,nBytesRead,nil);
if cs.cbInQue<>0 then
break;
end;
recStr:=''; //清空recstr
if i=8 then //到第五遍时还没有收到数据--
begin
result:=false;
exit;
end
else
for j:=0 to cs.cbInQue-1 do
recStr:=recStr+intTohex(ord(inbuff[j]),2); //转换成16进制
ReceiveStr:=pchar(recStr);
result:=true; //返回布尔结果
end;
//处理发送数据 -------------------------------------------
function DataProcess(StrForSend : string): string;
var
i,j : integer;
tmpStr1,tmpStr2 : string;
begin
if (length(StrForSend)=0) then
begin
result:='';
exit;
end;
if (length(StrForSend) mod 2)<>0 then
begin
result:='';
exit;
end;
for i:=1 to (length(StrForSend) div 2) do //每次处理2个字节的命令
begin
tmpStr1:=copy(StrForSend,i*2-1,2);
j:=strToint('$'+tmpStr1); //转换成INT格式
tmpStr2:=tmpStr2+chr(j); //转换成字符
end;
result:=(tmpStr2);
end;
function ReadPassWordOK(TempCharPass:string;TempCharKey:string):boolean;
var
orderStr : string;
Lrc : longWord;
begin
ReceiveStr:='';
orderStr:=TempCharPass;
orderStr:=DataProcess(orderStr); //发送前进行数据转换
writeFile(hComm,PChar(orderStr)^,length(orderStr),Lrc,NIL);
sleep(50);
if Lrc=0 then
exit;
if not DataReceived() then //发送完后开始接收数据
exit;
if StrComp(pchar(TempCharKey),pchar(ReceiveStr))=0 then
begin
result:=true;
ShowMessage('串口设置成功,您可以进行串口操作!');
end
else
begin
result:=false;
ShowMessage('串口设置失败,请您重新进行串口设置!');
exit;
end;
end;
//根据某个字符分割字符串的函数
procedure SeparateTerms(s : string;Separator : char;Terms : TStringList);
{ This browses a string and divide it into terms whenever the given
separator is found. The separators will be removed }
var
hs : string;
p : integer;
begin
Terms.Clear; // First remove all remaining terms
if Length(s)=0 then // Nothin' to separate
Exit;
p:=Pos(Separator,s);
while P<>0 do
begin
hs:=Copy(s,1,p-1); // Copy term
Terms.Add(hs); // Add to list
Delete(s,1,p); // Remove term and separator
p:=Pos(Separator,s); // Search next separator
end;
if Length(s)>0 then
Terms.Add(s); // Add remaining term
end;
function Hex_Int(HexStr: String): Integer;
//十六进制转为十进制 同样可以通过:StrToInt('$aaa')得到
var
i: Integer;
begin
Result := 0;
for i := 1 to Length(HexStr) do
begin
case HexStr[i] of
'0'..'9' : Result := Result * 16 + StrToInt(HexStr[i]);
'a', 'A' : Result := Result * 16 + 10;
'b', 'B' : Result := Result * 16 + 11;
'c', 'C' : Result := Result * 16 + 12;
'd', 'D' : Result := Result * 16 + 13;
'e', 'E' : Result := Result * 16 + 14;
'f', 'F' : Result := Result * 16 + 15;
end;
end;
end;
Function HexToChar(HexStr:string):string;
var
StrLength:integer;
i:integer;
EachStrByte:byte;
EachHexToCharStr:string;
HexToCharStr:string;
begin
StrLength:=length(HexStr);
for i:=1 to (StrLength div 2) do
begin
EachStrByte:=hex_int(copy(HexStr,2*i-1,2));
EachHexToCharStr:=(chr(EachStrByte));
HexToCharStr:=HexToCharStr+ EachHexToCharStr;
end;
result:=HexToCharStr;
end;
//替换字符串中子串的函数,他可以从字符串中找出指定子串,并替换为另一子串。
function replacing(S,source,target:string):string;
var site,StrLen:integer;
begin
site:=pos(source,s); //source在S中出现的位置
If site=0 then
begin
replacing:=s;
exit;
end;
StrLen:=length(source); //source的长度
delete(s,site,StrLen); //删除source字符串
insert(target,s,site); //插入target字符串到S中
replacing:=s; {返回新串}
end;
function SendDataAndReturnData(SendCommandString:string):pchar;
begin
result:= StrCommandForSendToComPort( SendCommandString,GivenDelayTimeForDll);
if result='' then
exit;
ReadCommPortValueForBug:=result;
end;
function ReceiveComDataFromCard(const ReceiveStr:string;DefineReturnData:String;falseReturndata:string):string;
var
ReturnCalibrationStr,ReadyForCalibrateReturnData:string;
CaculateTheReturnCalibrationStr:string;
TempReadDataStr:string;
begin
if copy(ReceiveStr,5,4)=falseReturndata then
begin
result:=''; //显示不成功
ReturnReadDataState:=1; //读取失败';
exit;
end;
if copy(ReceiveStr,5,4)=DefineReturnData then
begin
ReturnCalibrationStr:=copy(ReceiveStr,length(ReceiveStr)-1,2);
ReadyForCalibrateReturnData:=copy(ReceiveStr,5,length(ReceiveStr)-6);
CaculateTheReturnCalibrationStr:=StringXorOperator(ReadyForCalibrateReturnData);
if ReturnCalibrationStr=CaculateTheReturnCalibrationStr then
begin
TempReadDataStr:= copy(ReceiveStr,9,length(ReceiveStr)-10);
result:=replacing(TempReadDataStr,'AA00BB','AABB');
ReturnReadDataState:=0; //'校验通过,读取成功';
end
else
begin
result:=''; //显示不成功
ReturnReadDataState:=2; //'校验失败';
exit;
end;
end
else
begin
result:=''; //显示不成功
ReturnReadDataState:=2; //读取无效
end;
end;
function SendWriteDataToCard(const SendWriteData:string;WriteDataLength:integer):string;
var
i : integer;
tempErrorstr:String;
begin
tempErrorstr:='写入数据位数错误!应该是'+inttostr(WriteDataLength)+'长度字节';
if SendWriteData='' then
begin
ShowMessage('数据不能为空,请输入一定长度的字节数据!');
exit;
end;
if length(SendWriteData)<>WriteDataLength then
begin
ShowMessage('数据内容长度不对!');
exit;
end;
for i:=1 to WriteDataLength do
if not (SendWriteData[i] in ['0'..'9','A'..'F']) then
begin
ShowMessage('数据含有非法内容!');
exit;
end;
result:=replacing(SendWriteData,'AABB','AA00BB');
end;
procedure WriteDataReturnStatusBool(const ZhushiShuoMing:string;const ReceiveStr:string;ReturnDataTrueValue:String;ReturnDatafalseValue:String);
begin
if copy(ReceiveStr,5,4)=ReturnDataTrueValue then
begin
ReturnReadDataState:=0; //写数据成功!
exit;
end
else if copy(ReceiveStr,5,4)=ReturnDatafalseValue then
begin
ReturnReadDataState:=1; //返回错误
exit;
end
else
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -