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

📄 publicunitforcall.~pas

📁 delphi 编写的串口读写动态库
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
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 + -