网上看到的都是下面这种方式给的例子
sbuf[1]:=byte($ FA); //帧头
sbuf[2]:=byte($ FB);
sbuf[3]:=byte($ 80); //命令号
sbuf[4]:=byte($ 02); //数据长度
sbuf[5]:=byte($ 8D); //数据
sbuf[6]:=byte($ 8A); //数据
sbuf[6]:=byte($ 5A);//帧尾 校验和
可是我的数据是变量呀,如8B8A,DF4等(数据是1或2byte),不可能向上那样一一填写进去。还从网上同行处得到sendstr:=chr($FA)+chr($FB)+chr($80)+char(length)+data
其中data为我要发送的数据,可是以16进制接收的data不正确,请问data该如何
处理使接收的数据正确,或者该如何发送 。谢谢。
就象串口调测软件那样,发送和接收都是16进制的
sbuf[1]:=byte($ FA); //帧头
sbuf[2]:=byte($ FB);
sbuf[3]:=byte($ 80); //命令号
sbuf[4]:=byte($ 02); //数据长度
sbuf[5]:=byte($ 8D); //数据
sbuf[6]:=byte($ 8A); //数据
sbuf[6]:=byte($ 5A);//帧尾 校验和
可是我的数据是变量呀,如8B8A,DF4等(数据是1或2byte),不可能向上那样一一填写进去。还从网上同行处得到sendstr:=chr($FA)+chr($FB)+chr($80)+char(length)+data
其中data为我要发送的数据,可是以16进制接收的data不正确,请问data该如何
处理使接收的数据正确,或者该如何发送 。谢谢。
就象串口调测软件那样,发送和接收都是16进制的
yourstringdata=#$12#$34#$56#$ad#$78...;
procedure A8051tran(data:string);
var
Len:integer; //数据长度
sendstr:string; //发送的数据
chksum:integer; //校验和
i:integer; //求校验和时的循环变量
l:Integer; //发送
dataHex:array[0..250] of Char;
begin
chksum:=0;
sendstr:=''; //清空传送字串
Len:=length(data);
Form1.memo1.lines.add(data);
sendstr:=chr($FA)+chr($FB)+chr($80)+chr((Len div 2)+1); for l:=((Len-1)div 2) downto 0 do
begin
dataHex[l]:=Chr(StrToInt('$'+copy(data,l*2+1,2)));
end;
for l:=0 to ((Len-1)div 2) do
begin
sendstr:=sendstr+dataHex[l];
end;
// 帧头+帧头+命令+长度(1Byte)+资料(不固定长度的字串)
// sendstr:=chr($FA)+chr($FB)+chr($80)+chr(Len+1)+data;
for i:=1 to length(sendstr) do
chksum:=chksum+ord(sendstr[i]);
chksum:=chksum mod 256; //检查码
sendstr:=sendstr+chr(chksum); //CR
sleep(10);
Form1.Comm1.WriteCommData(pchar(sendstr) ,length(sendstr));
Sleep(10);
end;在发送8D8A时是正确的,可是8A8时
就不正确了,应该是
for l:=((Len-1)div 2) downto 0 do
begin
dataHex[l]:=Chr(StrToInt('$'+copy(data,l*2+1,2)));
end;
有问题,但是对于8A8这样3位的数应该如何处理呢