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

📄 publicunitforcall.~pas

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