我现在想用delphi和安捷伦34970A完成通讯工作(用的是232接口),可是在执行到viPrintf(vi,'CONF:TEMP TC,K,(@101,102,103)');这句时,34970A根本就没有按照我的要求设置,不知道为什么。另外我还用了viScanf,执行这条语句时,返回的是乱码,viQuery时,34970A有反应了,一声风鸣声后报错。请高手指教一下,谢谢!
声明:
unit vis;interfacefunction viOpenDefaultRM(var sesn: Integer): Integer; stdcall; external'visa32.dll';
function viOpen(sese: Integer; viDesc: PChar; mode: Integer; timeout: Integer; var vi: Integer): Integer; stdcall; external 'visa32.dll';
function viClose(vi: Integer): Integer;stdcall;external 'visa32.dll';
function viPrintf(vi:Integer; writeFmt: PChar): Integer; cdecl; external 'visa32.dll';
function viScanf(vi: Integer; readFmt: PChar;var params: PChar): Integer; cdecl; external 'visa32.dll';
function viQueryf(vi: Integer; writeFmt: PChar; readFmt: PChar; params: PChar): Integer;cdecl; external 'visa32.dll';
function viSetBuf(vi: Integer; wr: Integer; buf: Integer): Integer;stdcall; external 'visa32.dll';implementationend.程序:
procedure TForm1.btn1Click(Sender: TObject);
var
  freqchar: PChar;
begin
  x := viOpenDefaultRM(defrm);
  viOpen(defrm,'ASRL1::INSTR',0,0,vi);
  edt1.Text := IntToStr(vi);
  if vi > 0 then
  begin    viPrintf(vi,'*RST');      //viprintf(vi,'*RST' +chr(10));
    edt1.Text := '连接正常:' + IntToStr(vi);    viPrintf(vi,'CONF:TEMP TC,K,(@101,102,103)');    viClose(vi);
    viClose(defrm);  end;end;

解决方案 »

  1.   

    你好像调用的是封装好的DLL进行通信的,你可以尝试一下用SPCOMM进行通信,
      

  2.   

    是的,我用的是封装好的Dll通讯的,我查了很多的参考文献参考文献上说都可以的啊,但是将的都是很模糊的!所以我就搞不清楚了!不过还是要谢谢你,我再去试试串口通讯!
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, SPComm, StdCtrls;type
      TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        btn3: TButton;
        mmo1: TMemo;
        mmo2: TMemo;
        cm1: TComm;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
        procedure btn3Click(Sender: TObject);
        procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
          BufferLength: Word);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure SendHex(S: String);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
    begin
      cm1.StopComm;
      cm1.CommName := 'com1';
      cm1.BaudRate := 9600;
      cm1.ParityCheck := False;
      cm1.Parity := None;
      cm1.ByteSize := _8;
      cm1.StopBits := _1;  cm1.StartComm;
    end;procedure TForm1.btn2Click(Sender: TObject);
    begin
      cm1.StopComm;
    end;procedure TForm1.btn3Click(Sender: TObject);
    var
      p:pchar;
      x:integer;
    begin
      //mmo1.Lines.Text := 'CONF:TEMP THER,5000,1,0.1,(@101)';
      //mmo1.Lines.Text := 'READ?';
      //mmo1.Lines.Text := 'CONF:VOLT:DC (@101)';
       //SendHex(Mmo1.Lines.Text);   //发送十六进制   x:=Length(mmo1.Lines.Text);    //发送字符
        p:=Pchar(mmo1.Lines.Text);
        cm1.WriteCommData(p,x);
        Sleep(100);end;procedure TForm1.SendHex(S: String);
    var
      s2:string;
      buf1:array[0..50000] of char;
      i:integer;
    begin
      s2:='';
      for i:=1 to  length(s) do
      begin
        if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))or((copy(s,i,1)>='a') and (copy(s,i,1)<='f'))
            or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
        begin
            s2:=s2+copy(s,i,1);
        end;
      end;
      for i:=0 to (length(s2) div 2-1) do
        buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));
      Cm1.WriteCommData(buf1,(length(s2) div 2));
    end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
     tmpArray:array[0..4096] of Byte;
     ArraySize,i: DWORD;
     Count:DWORD;
     tmpStr:string;
     pStr:PChar;
    begin
      //if Check1.Checked  then
      //begin
       pStr:=Buffer;
       tmpStr:=string(pStr);
       Dec(PStr);
       for i:=0 to Length(tmpStr)-1 do
        begin
         inc(PStr);
         tmpArray[i]:=Byte(PSTR^);
         Mmo2.Lines.Add(IntToHEX(Ord(tmpArray[i]),2));
        end;
       exit;
      //end;
      //pStr:= Buffer;
      //mmo2.Lines.Add(pStr);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      cm1.StopComm;
    end;end.
    我试了串口也不行,设备根本就没有反应?