📄 publicunitforcall.~pas
字号:
unit PublicUnitForCall;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Dialogs, ComCtrls, ExtCtrls, StdCtrls;
VAR
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:integer;
ReadCommPortValueForBug:string;
BaudRateValueIndex:integer;
GivenDelayTimeForDll:integer;
OperatorSectorAndBlockIndexStr:string;
OperatorSendDataContentStr:string;
CommandIndexForCall:integer;
ReceiveStr : string;
hComm : THandle;
KeyPasswordSendOK:boolean=false;
CommOpenConnencted:boolean;
DelayTimeForReceive:integer;
function Com_Open(ComPortSet_PortString:string;RegComPortSet_BaudRate:integer):boolean;
function ReverseHexStr(StrForReverse:string):string;
function LEDStrProcess(InputStr:string):string;
function FloatToHex(SingleValue:single):string ;
function Hex_Int(HexStr: String): Integer;
function HexToFloat(ReadStrhex: string):single;
function StringXorOperator(const s:string):string;
function ByteAndProcess(const Hex1,Hex2:string):string;
function replacing(S,source,target:string):string;
function StrCommandForSendToComPort(SendCommandForCom:string;ReadDelayTimeForReceive:integer):pchar;
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;
function DataReceived(): boolean;
function DataProcess(StrForSend : string): string;
function ReadPassWordOK(TempCharPass:string;TempCharKey:string):boolean;
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);
procedure WriteMoneyToCardFunction(OperatorType:string;SendCommandIndex:integer;WriteOtherData:string;WriteDataStr:string);
implementation
{
procedure Com_Close;
begin
if CommOpenConnencted=false then
exit
else
begin
closeHandle(hComm);
purgecomm( hComm,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
end;
end;
function Com_Open(ComPortSet_PortString:string;RegComPortSet_BaudRate:integer):boolean;
var
ComConfi : TCOMMCONFIG;
begin
if(hComm<>0) then
CloseHandle(hComm);
hComm:=CreateFile(PChar(ComPortSet_PortString),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
if(hComm=INVALID_HANDLE_VALUE) then
begin
result:= false;
CommOpenConnencted:=false;
ShowMessage('串口设置失败,请您重新进行串口设置!');
exit;
end;
GetCommState(hComm,ComConfi.DCB);
ComConfi.dcb.BaudRate:=RegComPortSet_BaudRate;
//设置检验位
ComConfi.dcb.Parity:=0;
//设置数据位
ComConfi.dcb.ByteSize:=8;
//设置停止位
ComConfi.dcb.StopBits:=0;
if not SetCommState(hComm,ComConfi.dcb) then
begin
result:= false;
CommOpenConnencted:=false;
ShowMessage('串口设置失败,请您重新进行串口设置!');
closeHandle(hComm);
exit;
end
else
begin
result:=ReadPassWordOK('AABB0474032152','AABB0D7441757468206279204C696E01');
if result then
// closeHandle(hComm);
SetComPortStateBool:=true;
end;
//SetComPortStateBool:=result;
IniReadCommandDataArrayString;
end;
}
function ReverseHexStr(StrForReverse:string):string;
var
TempStr,ResultStr: string;
ByteNum,i:integer;
begin
ByteNum:=length(StrForReverse) div 2;
for i:=1 to ByteNum do
begin
TempStr:=copy(StrForReverse,2*i-1,2);
ResultStr:=TempStr+ResultStr;
end;
result:=ResultStr;
end;
function LEDStrProcess(InputStr:string):string;
var
tempHexStrArray:string;
InputStrLen,i:integer;
AddZeroHex,ResultStrForShow:string;
DotPos:integer;
DotStr,ResultDotStr,ResultStr:string;
FrontStr,EndStr:string;
TempFrontStr,TempEndStr:string;
FirstByte,SecondByte:byte;
begin
InputStrLen:=length(InputStr);
DotPos:=pos('.', InputStr);
if dotpos=1 then
begin
InputStr:='0'+InputStr;
InputStrLen:=length(InputStr);
DotPos:=pos('.', InputStr);
end;
if DotPos>0 then
begin
for i:=1 to 8-InputStrLen+1 do
begin
AddZeroHex:=AddZeroHex+'00';
end;
FrontStr:=copy(InputStr,1,dotpos-2);
for i:=1 to length(FrontStr) do
begin
TempFrontStr:=TempFrontStr+'0'+FrontStr[i];
end;
EndStr:=copy(InputStr,dotpos+1,InputStrLen-dotpos);
for i:=1 to length(EndStr) do
begin
TempEndStr:=TempEndStr+'0'+EndStr[i];
end;
DotStr:=copy(InputStr,dotpos-1,1);
FirstByte:=strtoint('$'+DotStr);
SecondByte:=strtoint('$80');
FirstByte:=FirstByte xor SecondByte;
ResultDotStr:=inttohex(FirstByte,2);
result:=ReverseHexStr(AddZeroHex+TempFrontStr+ResultDotStr+TempEndStr);
end
else
begin
for i:=1 to 8-InputStrLen do
begin
AddZeroHex:=AddZeroHex+'00';
end;
for i:=1 to InputStrLen do
begin
tempHexStrArray:='0'+InputStr[i];
ResultStrForShow:=ResultStrForShow+ tempHexStrArray;
end;
result:=ReverseHexStr(AddZeroHex+ResultStrForShow);
end;
end;
function FloatToHex(SingleValue:single):string ;
var
decimal_fractionHex:string;
IntegerPartHex:string;
OnePositiveNegativeHex:string;
dotPostionIndex,LengthValueStr:integer;
SingleValueStr:string;
tempDesimal:string;
begin
if (SingleValue<=8388607) and (SingleValue>=0) then
begin
SingleValuestr:=FormatFloat('#0.##',SingleValue);
LengthValueStr:=length(SingleValuestr);
dotPostionIndex:=pos('.',SingleValuestr);
if dotPostionIndex=0 then
begin
result:=inttohex(round(abs(SingleValue)),6)+'00';
exit;
end
else
begin
tempDesimal:=copy(SingleValuestr,dotPostionIndex+1,LengthValueStr-dotPostionIndex);
if length(tempDesimal)=1 then
tempDesimal:=tempDesimal+'0';
decimal_fractionHex:=inttohex(strtoint(tempDesimal),2);
IntegerPartHex:=inttohex(strtoint(copy(SingleValuestr,1,dotPostionIndex-1)),6);
result:=IntegerPartHex+decimal_fractionHex;
end;
end
else
begin
showmessage('您输入的数值超出范围,应在0~8388607之间,请重新输入');
exit;
end;
end;
function FloatToHex2(SingleValue:single):string ;
var
ReadStrSingleToStr:string;
decimal_fractionHex:string;
IntegerPartHex:string;
OnePositiveNegativeHex:string;
dotPostionIndex,LengthValueStr:integer;
SingleValueStr:string;
tempDesimal:string;
begin
if (SingleValue<=8388607) and (SingleValue>=0) then
begin
SingleValuestr:=FormatFloat('#0.##',SingleValue);
LengthValueStr:=length(ReadStrSingleToStr);
dotPostionIndex:=pos('.',ReadStrSingleToStr);
if dotPostionIndex=0 then
begin
result:=OnePositiveNegativeHex+inttohex(round(abs(SingleValue)),6)+'00';
exit;
end
else
begin
tempDesimal:=copy(ReadStrSingleToStr,dotPostionIndex+1,LengthValueStr-dotPostionIndex);
if length(tempDesimal)=1 then
tempDesimal:=tempDesimal+'0';
decimal_fractionHex:=inttohex(strtoint(tempDesimal),2);
IntegerPartHex:=inttohex(strtoint(copy(ReadStrSingleToStr,1,dotPostionIndex-1)),6);
result:=IntegerPartHex+decimal_fractionHex;
end;
end
else
begin
showmessage('您输入的数值超出范围,应在0~8388607之间,请重新输入');
exit;
end;
end;
function HexToFloat(ReadStrhex: string):single;
var
decimal_fractionHex:string;
decimal_fractionFloat:Single ;
decimal_fractionint:integer;
IntegerPartHex:string;
IntegerPartint:integer;
OnePositiveNegativeByteStr:string;
TheXorHexStr:string;
begin
TheXorHexStr:=ByteAndProcess('FFFFFFFF',ReadStrhex);
OnePositiveNegativeByteStr:=copy(TheXorHexStr,1,1);
if OnePositiveNegativeByteStr='0' then
begin
decimal_fractionHex:=copy(TheXorHexStr,7,2);
decimal_fractionint:=Hex_Int(decimal_fractionHex)+1;
IntegerPartHex:=copy(TheXorHexStr,1,6);
IntegerPartint:=Hex_Int(IntegerPartHex);
result:= (IntegerPartint+decimal_fractionint*0.01)*(-1);
end
else
begin
decimal_fractionHex:=copy(ReadStrhex,7,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -