解释一下这些DELPHI代码.

解释一下这些DELPHI代码.

知识准备:

1、Copy函数:将源字符串(S)从指定下标(Index)处开始,拷贝长度为Count的子串,并返回该子串。

function Copy(S; Index, Count: Integer): string;

function Copy(S; Index, Count: Integer): array;

举个例子说吧:S:='abcdefg'; sR:=Copy(S,2,3) 那sR得到的值为——sR:='bcd'不要困惑,delphi字符串下标是从1开始的,C/C++是从0开始的。

2、delphi里的十六进制数表示:

如:0F800H,delphi里表示为$F800; C/C++里表示为0xF800.

3、Comm1.WriteCommData(buff,length);

这是从串口发送数据的函数。(你用到了第三方包中提供的串口操作包)

这个函数是讲,从串口发送buff从头算长度为length个字节。

-----------------------------------------------------

for i:=1 to length(s) do //length(s),得到S的长度

begin

if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))or((copy(s,i,1)>='a') and (copy(s,i,1)<='f'))

or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then

//S[i]是否为十六进制数。0~f,即0~9,a~f。()其实我认为,也应该把大写字母A~F考虑进去。

begin

s2:=s2+copy(s,i,1);//将符合十六进制规范的表示存入S2

end;

end;

上面这段代码,是从S中过滤掉了那些不属于十六进制规范的表示。

如:S为'8f9d04g5dh',经过滤就得到了'8f9d045d'(g、h被过滤)

----------------------------------------------------------

for i:=0 to (length(s2) div 2-1) do

buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));

显然,每两个十六进制数为一个字节,如$8f为一个字节;$8为4bit;$ffff为一个字,$ffffffff为一个双字,即32位.

在串口传输时,是按字节来传的,所以要除2,因为i从0开始,所以除2减1。

上面这部份代即将过滤好的十六进制字符串按字节转换成数值存入buf1。

如:S2:='8f9d045d',buf1:=$8f,buf1:=$9d,buf1:=$04,

buf1:=$5d.

-------------------------------------------------------

Comm1.WriteCommData(buf1,(length(s2) div 2));

从串口发出去了~~~

-------------------------------------------------------

不知道我有没有说清楚,希望楼主可以理解!

输出字符串中符合16位进制的字符.