📄 publicunitforcall.~pas
字号:
unit PublicUnitForCall;
interface
uses
TYPE
TReadDataFromComFunc= function(SendCommandForCom:string;ReadDelayTimeForReceive:integer):pchar;stdcall;
VAR
Th:Thandle;
Tf:TReadDataFromComFunc;
Tp:TFarProc;
CommandForSendToCard:array[0..40] of string;
CommandForReturnStateDataTrue:array[0..40] of string;
CommandForReturnStateDataFalse:array[0..40] of string;
CommandForReturnStateDataOperator:array[0..40] of string;
ComPortNumberStr:string;
ComBaudrateSet:integer;
SetComPortStateBool:boolean;
ReturnReadDataState:string;
ReadCommPortValueForBug:string;
BaudRateValueIndex:integer;
GivenDelayTimeForDll:integer;
OperatorSectorAndBlockIndexStr:string;
OperatorSendDataContentStr:string;
ReadIniFile : TINIFile;
ReadIniSectionStr:Tstrings;
const strINIname = 'CommandIniliaze.ini';//INI文件的文件名,大家根据具体情况修改
//const TheTwoComandHeadByte:string='AABB' ;
function CommOpen(ComPortSet_PortString:string;RegComPortSet_BaudRate:integer):boolean;stdcall;external 'MF500_HY60.dll';
// function StrCommandForSendToComPort( SendCommandForCom:string;):pchar;stdcall;external 'MF500_HY60.dll';
function StrCommandForSendToComPort(SendCommandForCom:string;ReadDelayTimeForReceive:integer):string;stdcall;external 'MF500_HY60.dll';
procedure ColseCommPortHandle;stdcall;external 'MF500_HY60.dll';
function Hex_Int(HexStr: String): Integer;
function StringXorOperator(const s:string):string;
function replacing(S,source,target:string):string;
function SendDataAndReturnData(SendCommandString:string):Pchar;
function ReceiveComDataFromCard(const ReceiveStr:string;DefineReturnData:String;falseReturndata:string):string;
function SendWriteDataToCard(const SendWriteData:string;WriteDataLength:integer):string;
procedure WriteDataReturnStatusBool(const ZhushiShuoMing:string;const ReceiveStr:string;ReturnDataTrueValue:String;ReturnDatafalseValue:String);
procedure IniliazeDataForCommand;
procedure IniReadCommandDataArrayString;
procedure FileINICreate;
procedure FileINIFree;
Function HexToChar(HexStr:string):string;
function ReadDataFromCardForShow(SendCommandIndex:integer;SelSectorAndBlockIndexStr:string):string;
procedure ReadDataFromCardForState(SendCommandIndex:integer;OperatorTpyeForSend:string);
procedure WriteDadaToCardFunction(OperatorType:string;SendCommandIndex:integer;WriteOtherData:string;WriteDataStr:string;WriteDataLen:integer);
implementation
procedure FileINICreate;
var
strLocal:string;
FilePathAndName:string;
begin
getDir(0,strLocal);
FilePathAndName:=strLocal+ '\' + strINIname;
if FileExists(FilePathAndName) then
ReadIniFile := TINIFile.Create(strLocal + '\' + strINIname);
end;
procedure FileINIFree;
begin
ReadIniFile.Free;
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 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 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:= Tf( SendCommandString,GivenDelayTimeForDll);
if result='' then
exit;
ReadCommPortValueForBug:=result;
end;
function ReceiveComDataFromCard(const ReceiveStr:string;DefineReturnData:String;falseReturndata:string):string;
var
tmpStr,ReturnCalibrationStr,ReadyForCalibrateReturnData:string;
CaculateTheReturnCalibrationStr:string;
TempReadDataStr:string;
begin
if copy(ReceiveStr,5,4)=falseReturndata then
begin
ReturnReadDataState:='读取失败';
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:='校验成功';
end
else
begin
result:=''; //显示不成功
ReturnReadDataState:='校验失败';
exit;
end;
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:=ZhushiShuoMing+'成功!';
exit;
end
else if copy(ReceiveStr,5,4)=ReturnDatafalseValue then
begin
ReturnReadDataState:=ZhushiShuoMing+'操作失败!';
exit;
end
else if length(ReceiveStr)=0 then
begin
ReturnReadDataState:=ZhushiShuoMing+'没有接收到数据!';
exit;
end
else
begin
ReturnReadDataState:=ZhushiShuoMing+'接收非法字符!';
exit;
end;
end;
procedure IniliazeDataForCommand;
begin
RegisterFirstWriteForComSetUp('UserCardComSettingData','UserComPortSet_PortValue',ComPortNumberStr);
RegisterFirstWriteForComSetUp('UserCardComSettingData','UserComPortSet_BaudValue',inttostr(ComBaudrateSet));
ComPortNumberStr:=RegisterReadForComSetUp('UserCardComSettingData','UserComPortSet_PortValue');
ComBaudrateSet:=strtoint(RegisterReadForComSetUp('UserCardComSettingData','UserComPortSet_BaudValue'));
BaudRateValueIndex:=ComBaudrateSet div 4800;
SetComPortStateBool:=CommOpen(ComPortNumberStr,ComBaudrateSet);
if SetComPortStateBool=true then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -