刚刚学D,做了个简单的上位机,现在有个问题,数据接收来时都是ASCII码显示的,就像这样的3A 30 43 30 33 31 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
开始:从机地址 功能代码 返回的字节个数 数据1 数据2
30 30 30 30 30 30 30 30 30 30 44 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 0D 0A
数据3 数据4 数据5 数据6 数据7 数据8 校验码 CR LF
现在想把上面的数据的某个数据比如数据4截取出来显示在Edit框中,以十进制的形式显示数据,该如何实现呢,望大家帮帮忙呀,小弟在此谢了!!
开始:从机地址 功能代码 返回的字节个数 数据1 数据2
30 30 30 30 30 30 30 30 30 30 44 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 0D 0A
数据3 数据4 数据5 数据6 数据7 数据8 校验码 CR LF
现在想把上面的数据的某个数据比如数据4截取出来显示在Edit框中,以十进制的形式显示数据,该如何实现呢,望大家帮帮忙呀,小弟在此谢了!!
//字符串转换为十六进制字符串:例如‘ABCD’-> ‘41424344’*************************
//==============================================================================
function BinaryToHexStr(Str:string):string;
var i: integer;
begin
Result := ' ';
for i:=1 to Length(Str) do Result := Result + IntToHex(Ord(Str[i]),2);
end; //==============================================================================
//十六进制字符串转换为字符串:例如‘41424344’-> ‘ABCD’*************************
//==============================================================================
function HexStrToBinary(Str:string):string;
var i, Len: integer;
Point: Pointer;
begin
Len := Length(Str) div 2;
Point := AllocMem(Len + 1);//Len + 1是为nil结尾的标志空出一个字节
Pointer(Result) := Point;
for i:=0 to Len do Result[i]:= Chr(StrToint( '$ ' + Copy(Str, i*2-1, 2)));
ReallocMem(Point, Len + 1);
end;
Copy(s,开始位置,长度)
关键是你要知道数据4开始位置结束位置(或者长度)
转十进制:假如你截取到的数据是2A 3B,看你数据是否是低位在前,是就需要颠倒下(一般都需要,具体根据你自己的实际情况),
像这样转StrToInt('$3B2A'),不是的话就StrToInt('$2A3B'),就是字符表示前面加上$符号就可以转整数了,
SS:='30 30 30 30 30 30 30 30 30 30 44 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 0D 0A'拿这个来举例子copy(ss,25,4)就得到30 30 44 39了
begin
s1:=Copy(str,1,2);
k:=StrToInt('$'+s1);//控制器编号
s2:=Copy(str,3,2);//电压值 高字节
s3:=Copy(str,5,2);//电压值 低字节
i:=StrToInt('$'+s2)*256+strtoint('$'+s3);
dy:=(9.93*i)/1024;
s1:=FormatFloat('0.00',dy);
end;