通过delphi的spcomm控件对下位机发送指令
我是要通过delphi的spcomm对下位机发送指令,下位机只能识别16进制,如:123C4B等等。所以我想只能是byte数组。比如说在memo1输入1234ABCD,最...
我是要通过delphi的spcomm对下位机发送指令,下位机只能识别16进制,如:12 3C 4B等等。所以我想只能是byte数组。比如说在memo1输入1234ABCD,最后发送数字型:12 34 AB CD或其对应十进制(18 52 171 205),最后接收下位机返回的数据。所以现在各位大神能不能给个思路啊。
展开
2个回答
展开全部
SPCOMM有时候没办法实时的返回接收的数据,好像要等他缓冲区满了才会接收回来,建议用MSCOMM,给你贴段我的DEMO代码
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;
HexSend 就是判断是否是16进制发送
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;
HexSend 就是判断是否是16进制发送
展开全部
procedure TForm1.SendHex(S: String);var s2:string; buf1:array[0..50000] of char; i:integer;begin s2:=''; for i:=1 to length(s) do 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 begin s2:=s2+copy(s,i,1); end; end; for i:=0 to (length(s2) div 2-1) do buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2))); Comm1.WriteCommData(buf1,(length(s2) div 2));end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询