以16进制数发送串口指令,如何写?(10分)

  • 主题发起人 主题发起人 carrie4002
  • 开始时间 开始时间
C

carrie4002

Unregistered / Unconfirmed
GUEST, unregistred user!
想把$3F、$6C、$11、$2E连接起来一次性发送给串口,
是:Str:='$3F $6C $11 $2E';
Form2.Comm1.WriteCommData(pchar(Str),Length(Str));
吗?
其中:3F:是汇编里的?;
6C:是汇编里的L;(装入)
11:通道号;
2E:是汇编里的结束符"。"句号;
 
申明一个数组
...
var senddata : array of byte;//用于存放发送的十六进制数组
...
定义一个发送过程
procedure send(arr:array of byte ;len :integer); //发送数据过程定义!!!!
var//arr 为发送的十六进制数组,len为数组长度
i:integer;
begin
for i:=1 to len do
begin
if not form1.comm1.writecommdata(@arr,1) then
begin
commflg:=false;
break;
end;
end;
end;
 
TO whbfeng:
谢谢你。
据说可以一次性发送的。
我只是不知道命令字符的格式对否?
 
诚请大虾们!急
 
TO 凤舞九天:
谢谢你。你的代码还是不行。
 
向串口发送命令数据,仅供参考:
procedure TmainF.SendTXT(Mode :Char; texts: string);
var
ll: dword;
Len,ci,i: dword;
begin
Len:=Length(texts);
if Len = 0 then
begin
StatusBar1.Panels[0].text:='Command Error';
exit;
end;
SendC[0]:=#2;
if (Mode ='S') then
begin
if SetupF.OperateObject.ItemIndex < 0 then exit;
case SetupF.OperateObject.ItemIndex of
0:
begin
SendC[2]:=#$F0;
ci:=3;
end;
1:
begin
SendC[2]:=#$F2;
ci:=3;
end;
2:
begin
SendC[2]:=#$a0;
ci:=3;
end;
3:
begin
SendC[2]:=#$a0;
SendC[3]:=#$0A;
SendC[4]:=char(STRtoINT(SetupF.CIDText.text));
ci:=5;
end;
end;
end else if (Mode = 'T') then
begin
SendC[2]:=#$AA;
ci:=3;
end;
ll:=ci;
ChangeTXT(texts,len,ci);
// if (SendC[ll]=#$ff) then
// SendC[2]:=#$ff;
SendC[1]:=char(ci-1);
ll:=0;
for i:=0 to ci-1 do
begin
ll:=ll+word(SendC);
end;
SendC[ci]:=char(ll);
SendC[ci+1]:=#0;
ll:=Ci+1;
writefile(hFileRs232,SendC,ll,ll,bb);
if disp = 0 then CMDWindow.Lines.Insert
(0,ChgOutTxt2Cahr('S:'+ByteToString(@SendC[0],ll),SetupF.OperateObject.ItemIndex));
end;
 
TO wymacu:
谢谢你。你的代码似乎不太适合我。
 
Str:=#$3F#$6C#$11#$2E;
Form2.Comm1.WriteCommData(pchar(Str),Length(Str));
 
TO foam:
谢谢关注。每字符之间还有空格,是否该是:
Str:='#$3F #$6C #$11 #$2E';
Form2.Comm1.WriteCommData(pchar(Str),Length(Str));
 
这个函数可以把文本框内的16进制字符(包括空格)转化为字符串,
然后通过WriteCommData送到串口。
//16进制字符串转换成字符串
function HexStrToStr(const S:string):string;
var
t:Integer;
ts:string;
M,Code:Integer;
begin
t:=1;
Result:='';
while t<=Length(S) do
begin
while not (S[t] in ['0'..'9','A'..'F','a'..'f']) do
inc(t);
if (t+1>Length(S))or(not (S[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
ts:='$'+S[t]
else
ts:='$'+S[t]+S[t+1];
Val(ts,M,Code);
if Code=0 then
Result:=Result+Chr(M);
inc(t,2);
end;
end;


例:
Str := HexStrToStr(Edit1.Text); // Edit1为存放16进制字符的文本框
lstrcpy(cStr, pchar(Str));
Form2.Comm1.WriteCommData(cStr,StrLen(cStr));
 
to 潇潇红叶,:
谢谢。我先试一下。
 
把命令字串定义为数组即可。然后将数组写入通讯缓存。
const StrArry:array[1..10] of byte=($AA,$BB,$CC,$DD,$AA,$BB,$CC,$DD,$AA,$BB);
.....
CommVstr.WriteCommData(@StrArry,sizeof(StrArry));
 
多人接受答案了。
 
后退
顶部