function hex(c:char):Integer ;
var
x:integer;
begin
if c=' ' then
x:=0
else if (Ord(c)>=ord('0')) and (Ord(c)<=ord('9')) then
x:=Ord(c)-Ord('0')
else if (Ord(c)>=ord('a')) and (Ord(c)<=ord('f')) then
x:=Ord(c)-Ord('a')+10
else if (Ord(c)>=ord('A')) and (Ord(c)<=ord('F')) then
x:=Ord(c)-Ord('A')+10
else
//输入错误
x:=-1;
Result:=x;
end;//该函数接收1个至2个字符
//转换成功.输出对应16进制数的值
//转换失败.输出-1。
function HexToInt(S:String): Integer;
var
tmpInt1,tmpInt2:Integer ;
begin
if Length(S)=1 then
begin
Result:=hex(S[1]);
end
else if Length(S)=2 then
begin
tmpInt1:=hex(S[1]);
tmpInt2:=hex(S[2]);
if (tmpInt1=-1) or (tmpInt2=-1) then
Result:=-1
else
Result:= tmpInt1*16+tmpInt2;
end
else
//输入错误,转换失败
Result:=-1;
end;//发送数据
procedure TMainForm.btnSendClick(Sender: TObject);
var
Len:Integer;
i,count,tmpInt:Integer;
tmpVar:Variant;
tmpStr,Output:String;
begin
if not MSComm.PortOpen then
begin
showmessage('没有打开串口!');
Exit;
end
else begin
//发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节
if HexSend then
begin
Output:=mmSend.Text;
Len:=Length(Output);
if Len>0 then
begin
i:=1;
count:=1;
//创建一个Variant数组
tmpVar:=VarArrayCreate([1,1],varByte);
while(i<Len) do
begin
//每3个字符串中截取2个字符,转换为16进制
tmpStr:=Copy(Output,i,2);
tmpStr:=LowerCase(tmpStr);
tmpInt:=HexToInt(tmpStr);
if tmpInt=-1 then
begin
showmessage('发送的数据格式有问题!');
exit;
end
else begin
tmpVar[Count]:=tmpInt;
Inc(count);
//增大Variant数组
VarArrayRedim(tmpVar,count);
end;
i:=i+3;
end;
MSComm.Output :=tmpVar;
end;
end
else begin
MSComm.Output :=mmSend.Text;
end;
end;
end;
这是一段串口调试精灵的源代码,我不明白为什么要当选择用二进制方式传输时要每每3个字符串中截取2个字符,转换为16进制,谁能给我讲讲
var
x:integer;
begin
if c=' ' then
x:=0
else if (Ord(c)>=ord('0')) and (Ord(c)<=ord('9')) then
x:=Ord(c)-Ord('0')
else if (Ord(c)>=ord('a')) and (Ord(c)<=ord('f')) then
x:=Ord(c)-Ord('a')+10
else if (Ord(c)>=ord('A')) and (Ord(c)<=ord('F')) then
x:=Ord(c)-Ord('A')+10
else
//输入错误
x:=-1;
Result:=x;
end;//该函数接收1个至2个字符
//转换成功.输出对应16进制数的值
//转换失败.输出-1。
function HexToInt(S:String): Integer;
var
tmpInt1,tmpInt2:Integer ;
begin
if Length(S)=1 then
begin
Result:=hex(S[1]);
end
else if Length(S)=2 then
begin
tmpInt1:=hex(S[1]);
tmpInt2:=hex(S[2]);
if (tmpInt1=-1) or (tmpInt2=-1) then
Result:=-1
else
Result:= tmpInt1*16+tmpInt2;
end
else
//输入错误,转换失败
Result:=-1;
end;//发送数据
procedure TMainForm.btnSendClick(Sender: TObject);
var
Len:Integer;
i,count,tmpInt:Integer;
tmpVar:Variant;
tmpStr,Output:String;
begin
if not MSComm.PortOpen then
begin
showmessage('没有打开串口!');
Exit;
end
else begin
//发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节
if HexSend then
begin
Output:=mmSend.Text;
Len:=Length(Output);
if Len>0 then
begin
i:=1;
count:=1;
//创建一个Variant数组
tmpVar:=VarArrayCreate([1,1],varByte);
while(i<Len) do
begin
//每3个字符串中截取2个字符,转换为16进制
tmpStr:=Copy(Output,i,2);
tmpStr:=LowerCase(tmpStr);
tmpInt:=HexToInt(tmpStr);
if tmpInt=-1 then
begin
showmessage('发送的数据格式有问题!');
exit;
end
else begin
tmpVar[Count]:=tmpInt;
Inc(count);
//增大Variant数组
VarArrayRedim(tmpVar,count);
end;
i:=i+3;
end;
MSComm.Output :=tmpVar;
end;
end
else begin
MSComm.Output :=mmSend.Text;
end;
end;
end;
这是一段串口调试精灵的源代码,我不明白为什么要当选择用二进制方式传输时要每每3个字符串中截取2个字符,转换为16进制,谁能给我讲讲
如:对于上面要发送的数据内容:第一次取数据(I:=1);则对应上面的数据,取出来的是"01"第二次时就会取得(I:=3)时的数据,取两位为:'02'.....依此类推了.....