我用spcomm控件想得到串行口连接设备中的数据,但是发送命令发送出去后得到的接受结果和发送命令一样。不能得到设备中的数据。请问是不是从设备中得到数据也需要协议?
不知道在我发送命令给设备后,设备中的数据是不是已经进入到机器的缓冲区中了?
怎么样才能得到外部设备的数据?

解决方案 »

  1.   

    使用命令禁止本地回应:ATE0,就可以避免得到刚才的发送命令。
    从设备中得到数据需要协议,可以自定义,设备中应有相应的cpu板,这样才能实现与PC的互通;
    数据写入缓冲区后可以回显OK啊;
    整个系统实现通信需要两部分:pc和设备,二者配合起来才能互通啊。pc要有软件,设备中要有相应的硬件以及软件(比如单片机),呵呵,否则单方面跟谁通啊。
      

  2.   

    我是用以下的方法实现的,但是就是不能得到外部设备的数据啊
    procedure TFcomm.FormShow(Sender: TObject);
    begin
    comm1.StartComm;
    end;procedure TFcomm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    comm1.StopComm;
    end;procedure TFcomm.senddata;
    var
    i:integer;
    commflg:boolean;
    begin
       viewstring:='';
      commflg:=true;
      for i:=1 to 12 do
      begin
      if not fcomm.Comm1.WriteCommData(@sbuf[i],1) then
      begin
      commflg:=false;
      break;
      end;
      sleep(2);{发送时字节间的延时}
      viewstring:=viewstring+inttohex(sbuf[i],2)+'' ;
      end;
      viewstring:='发送'+ viewstring;
      fcomm.memo1.lines.add(viewstring);
       fcomm.Memo1.Lines.Add('');
      if not commflg then messagedlg('发送失败!',mterror,[mbyes],0);
      label1.Caption:='201';
    end;procedure TFcomm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
      var
    i:integer;
    beginviewstring:='';
    move(buffer^,pchar(@rbuf)^,bufferlength);
    for i:=1 to bufferlength do
    viewstring:=viewstring+inttohex(rbuf[i],2)+'';
    viewstring:='接受'+viewstring;
    memo1.lines.add(viewstring);
    memo1.lines.add('');
    read(buffer,sizeof(buffer));
    label1.Caption:='001';
    end;procedure TFcomm.Button1Click(Sender: TObject);
    begin
    sbuf[1]:=byte($00); //帧头
    sbuf[2]:=byte($00); //命令号
    sbuf[3]:=byte($00);
    sbuf[4]:=byte($00);
    sbuf[5]:=byte($00);
    sbuf[6]:=byte($00);
    sbuf[7]:=byte($00);
    sbuf[8]:=byte($00);
    sbuf[9]:=byte($00);
    sbuf[10]:=byte($00);
    sbuf[11]:=byte($00);
    sbuf[12]:=byte($55);
     //帧尾
    senddata;//调用发送函数
    end;