我写的代码如下:(是不是我发送的不是十六进制造成的结果)
procedure TfrmData.Button1Click(Sender: TObject);
var
s:string;
Count:Integer;
p:pchar;
begin
//设置串口参数 ,并打开串口
comm.CommName:=Cmb_com.text;
comm.BaudRate:=9600;
comm.ByteSize:=_8;
comm.StopBits:=_1;
comm.Parity:=none;
//打开串口
try
Comm.StartComm;
except
raise Exception.Create('打开串口错误');
end;
//准备接收火花开机识别码,并发送测速命令,和接收火花传回速度值
sleep(1000);
s := Char($FE) + Char($3F);//发送测速指令
Count:=Length(s);
p:=pchar(s);
comm.WriteCommData(p,Count);//这步好象没有发送成功,要不然应该有返回值,可是下面CommReceiveData()没有任何响应
Button1.Enabled:=false;
end;
//从端口接收数据
procedure TfrmData.CommReceiveData(Sender:Tobject;Buffer:Pointer;
BufferLength:Word);
var
strRecv,tmpstr:string;
//b:array [1..4096] of byte;
b:array [0..50000] of char;
flag1,flag2,flag3,flag4:Boolean;
strlen,i,pos,speed1,speed2,speed3,speed4:Integer;
// 超速目标/最大目标/相对方向最大/自身速度
begin
showmessage('如果接受到数据,这里应该弹出');//后加的,为了测试是否缓存接收到数据,而实际测试中没有弹出
strRecv:='';
speed1:=0;
speed2:=0;
speed3:=0;
speed4:=0;
flag1:=false;
flag2:=false;
flag3:=false;
flag4:=false;
Move(Buffer^,b,BufferLength);
for i:=0 to bufferlength do
strRecv:=strRecv+b[i];
strlen:=Length(strRecv);
for i := 1 to strlen do
begin
if Byte(strRecv[i])=$F1 then //$F1后面为超速目标的速度
begin
flag1:=true;
pos := i;
tmpstr := Copy(strRecv, pos+1, 1);
speed1:=strtoint(tmpstr);//取出速度
if speed1>240 then //判断是否超出00-F0范围
speed1:=0;
break;
Delete(strRecv, pos, 2);//从缓存中删除该数据
break;
end;
if Byte(strRecv[i])=$F2 then //$F2后面为最大速度目标速度
begin
flag2:=true;
pos := i;
tmpstr := Copy(strRecv, pos+1, 1);
speed2:=strtoint(tmpstr);//取出速度
if speed2>240 then //判断是否超出00-F0范围
speed2:=0;
break;
Delete(strRecv, pos, 2);//从缓存中删除该数据
break;
end;
if Byte(strRecv[i])=$F4 then //$F4后面为相对方向最大速度
begin
flag3:=true;
pos := i;
tmpstr := Copy(strRecv, pos+1, 1);
speed3:=strtoint(tmpstr);//取出速度
if speed3>240 then //判断是否超出00-F0范围
speed3:=0;
break;
Delete(strRecv, pos, 2);//从缓存中删除该数据
break;
end;
if Byte(strRecv[i])=$F8 then //$F8后面为自身速度
begin
flag4:=true;
pos := i;
tmpstr := Copy(strRecv, pos+1, 1);
speed4:=strtoint(tmpstr);//取出速度
if speed4>240 then //判断是否超出00-F0范围
speed4:=0;
break;
Delete(strRecv, pos, 2);//从缓存中删除该数据
break;
end;
//添加到数据库对应的字段里
if flag1 and flag2 and flag3 and flag4 then
begin
ADOTable1.Append; //增加一条新记录
ADOTable1.FieldValues['Patrol speed'] :=speed4;
ADOTable1.FieldValues['Fastest goal'] :=speed2;
ADOTable1.FieldValues['Strongest echo'] :=speed3;
ADOTable1.FieldValues['Exceeding'] :=speed1;
ADOTable1.Post;
flag1:=false;
flag2:=false;
flag3:=false;
flag4:=false;
end;
sleep(100);
end;
end;
3 个解决方案
#1
高手都到哪里去了,怎么就不能帮小弟看看吗?
#2
com的属性改一下试试 Flow control部分
#3
s := Char($FE) + Char($3F);//发送测速指令
-------------------
我觉得是这里的错,因为你应该发送16进制数,而不是字符
var
s : array[0..1] of byte;
begin
s[0] := $FE;
s[1] := $3F;
Count:=Length(s);
p:=pchar(s);
comm.WriteCommData(p,Count);
end;
就这意思,试试吧
-------------------
我觉得是这里的错,因为你应该发送16进制数,而不是字符
var
s : array[0..1] of byte;
begin
s[0] := $FE;
s[1] := $3F;
Count:=Length(s);
p:=pchar(s);
comm.WriteCommData(p,Count);
end;
就这意思,试试吧
#1
高手都到哪里去了,怎么就不能帮小弟看看吗?
#2
com的属性改一下试试 Flow control部分
#3
s := Char($FE) + Char($3F);//发送测速指令
-------------------
我觉得是这里的错,因为你应该发送16进制数,而不是字符
var
s : array[0..1] of byte;
begin
s[0] := $FE;
s[1] := $3F;
Count:=Length(s);
p:=pchar(s);
comm.WriteCommData(p,Count);
end;
就这意思,试试吧
-------------------
我觉得是这里的错,因为你应该发送16进制数,而不是字符
var
s : array[0..1] of byte;
begin
s[0] := $FE;
s[1] := $3F;
Count:=Length(s);
p:=pchar(s);
comm.WriteCommData(p,Count);
end;
就这意思,试试吧