串口初始化:
  MSComm1.CommPort:=1;
  MSComm1.Settings:='2400,n,8,1';
  MSComm1.InputMode :=1;
  MSComm1.RThreshold :=1;  //接收缓冲区收到每一个字符都会使MScomm控件产生OnComm事件.
  MSComm1.InputLen :=1;功能实现:发送十六进制数据:68 11 11 11 11 11 11 11,返回值应为十六进制表示:FE 11 11 11 11 11 11 11 
发送代码:
procedure TForm1.Button1Click(Sender: TObject);
var
  sendbuf : array of byte  ;
begin
  SetLength(sendbuf,8);
  sendbuf[0]:=$68;
  sendbuf[1]:=$11;
  sendbuf[2]:=$11;
  sendbuf[3]:=$11;
  sendbuf[4]:=$11;
  sendbuf[5]:=$11;
  sendbuf[6]:=$11;
  sendbuf[7]:=$99;
  //showmessage(inttostr(sendbuf[7]));
  if MSComm1.PortOpen then
  MSComm1.Output:=sendbuf;
end;接收代码:
procedure TForm1.MSComm1Comm(Sender: TObject);
var
   Vbuf : Variant;
   s: array of byte;
   i: integer;
   temstr:string;
   m,inputlen:integer;
begin
  if MSComm1.CommEvent = comEvReceive   then
  begin
    inputlen:=MSComm1.InBufferCount;
    vbuf := MSComm1.Input;  
    s:=Vbuf;
    for i:=0 to inputlen do //循环读字节
    begin
      m:=s[i];
      temstr:=IntToHex(m,2);
      Memo1.Lines.Add(temstr);
    end; 
  end;
end;
问题:在memo1里显示接收到的返回值为:
FE
00
00
00
12
00
00
00
00
11
00
00
00
12
00
00
00
而不是预期的返回值:FE 11 11 11 11 11 11 11为什么呀??????????

解决方案 »

  1.   

    你的S BYTE数组没有分配空间吧
      

  2.   

    接收缓冲区收到每一个字符都会使MScomm控件产生OnComm事件,这个你是否跟踪了,每次收到一个字节,你的InBufferCount是不是8呢,这样就会循环8个8
      

  3.   

    楼上的说的好,是呀,我跟踪了一下发现一个问题:在接收的事件里:
    ...
    inputlen:=MSComm1.InBufferCount;
    vbuf := MSComm1.Input;
    Memo1.Lines.Add('inputlen:'+inttostr(inputlen));//这里发现出现了8,7,6三个数字
    ...
      

  4.   

    因为每收到一个字符都会触发接收事件,接收事件里我应该这样写:
    procedure TForm1.MSComm1Comm(Sender: TObject);
    var
      Vbuf : Variant;
      s: array of byte;
      i: integer;
      temstr:string;
      m,inputlen:integer;
    begin
      if MSComm1.CommEvent = comEvReceive then
      begin
      inputlen:=MSComm1.InBufferCount;
      vbuf := MSComm1.Input;   
      m:=Vbuf[0];//因为每次接收的是一个字符,这里Vbuf只有一个元素。
      temstr:=temstr+IntToHex(m,2);//这里做累计。
      Memo1.Lines.Add(temstr);
      end;  
    end;
    可是还是不中,只收到两个字节:FE 11
      

  5.   

    我根据了一下,inputlen:=MSComm1.InBufferCount;
    Memo1.Lines.Add('inputlen:'+inttostr(inputlen));
    发现inputlen出现了两次:8和7执行结果如下:
    inputlen:8
    FE
    inputlen:7
    11
      

  6.   

    多谢crhallan与bdmh,尤其是bdmh,你总是在我遇到问题的时候给予我帮助,再次谢谢了,我现在骄傲且自豪地宣布:困难已经阻止不了我了,我已经自豪地解决了问题!!!结帖给分了!!!谢谢!!!!!!!!!!!!!!