(串口编程)为何命令发不出去,接收数据无响应(spcomm控件)!!!

时间:2022-04-14 04:10:28
请问,为什么我的程序(计算机与测速雷达的接口程序)在实际的测试中,好象测速指令(FE,3F)根本没有发送出去,因为我在CommReceiveData()中加showmessage()根本不弹出,好象根本没有接收到任何消息。而我用串口精灵发送FE,3F就有返回值。
我写的代码如下:(是不是我发送的不是十六进制造成的结果)
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;

就这意思,试试吧

#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;

就这意思,试试吧