2016-01-29 49 views
0

我的電腦中有GP-IB卡,通過GP-IB連接到DMM。我在卡上運行了診斷員並確認它正在工作。我能夠控制它扔在那裏軟件測試。現在我正在嘗試創建一個程序來完成它,但是當它發送命令時,它總會給DMM帶來錯誤。GB-IP功能不能正常工作

我有3個源文件Master.pas,SubClass.pas和ApiGpib.pas

在master.pas我有這樣的發送命令到設備。

var 
Ret    : DWORD;       
Yradr    : DWORD;     
Srlen    : DWORD;    
Cmd     : array[0..31] of DWORD;   
csBuf    : String; 



/Sending a command to the device//////////////////////////////////////////////// 
procedure TFormMaster1.ButtonSENDClick(Sender: TObject); 
var 
    srBuffer: String;          // command 
    SendBuf: PChar; 
begin 
    Yradr := StrToInt(YRADRBox.Text);     //card address 
    srBuffer := EditSENDDATA.Text; 
    Srlen := Length(srBuffer);        // Length of text 
    SendBuf := PChar(srBuffer);       // change string to Pchar 
    if Srlen <> $0 then         //string no empty 
    begin        // Send a command 
     EditTEXTRET.Text := 'Waiting for return???'; 
     Refresh();           

     Cmd[0] := 2;      // Number of equipment to talk to 
     Cmd[1] := Myadr;     // My device address 
     Cmd[2] := Yradr;     // Card address 
     Ret := GpTalk(@Cmd, Srlen, SendBuf);   // Sends address's, length, text 
     CheckRet('GpTalk', (Ret and $FF), csBuf);  // return value up to 255 length 
     EditTEXTRET.Text := csBuf;      // Return text 
    end 
    else 
     EditTEXTRET.Text := 'No text to send'; 

end; 

現在在ApiGpib.pas中我有GpTalk這樣的函數。

type 
    PDWORD=^DWORD 
    function GpTalk(Cmd:PDWORD; Srlen:DWORD; Srbuf:PChar):DWORD;stdcall; 
    ... 
    ... 
    ... 
Implementation 
    function GpTalk;    external 'ApiGpib1.dll' ; 

它會在DMM上出錯,我不能查看ApiGpib1.dll。

  • 問題是
    +你看到邏輯有什麼問題嗎?
    +我該如何解決這個問題?

最後只是在CheckRet函數中做了一些事情。在Subclass.pas中我有這個。

type 
function CheckRet(Func:String;Ret:DWORD;var csBuf:string):DWORD; 

Implementation 
function CheckRet(Func: String; Ret: DWORD; var csBuf: String):DWORD; 
var 
    RetCode,Ret1: DWORD; 
begin 
    RetCode := 0;       
    Ret1 := Ret and $ff;      
    if Ret1 >= 3 then 
    begin         
     RetCode := 1;       
     case Ret1 of 
      3: csBuf := Func + ' : FIFO「à‚É‚Ü‚¾ƒf[ƒ^‚ªŽc‚Á‚Ä‚¢‚Ü‚·B'; 
      80: csBuf := Func + ' : I/OƒAƒhƒŒƒXƒGƒ‰[‚Å‚·B'; 
      82: csBuf := Func + ' : ƒŒƒWƒXƒgƒŠÝ’è‚̃Gƒ‰[‚Å‚·BConfig.exe‚ÅŠm」F‚µ‚Ä‚­‚¾‚³‚¢B'; 
      128: csBuf := Func + ' : ŽóMƒoƒbƒtƒ@‚ð’´‚¦‚½A‚Ü‚½‚ÍSRQ‚ðŽóM‚µ‚Ä‚¢‚Ü‚¹‚ñB'; 
      200: csBuf := Func + ' : ƒXƒŒƒbƒh‚ªì¬‚Å‚«‚Ü‚¹‚ñB'; 
      201: csBuf := Func + ' : ‘¼‚̃Cƒxƒ「ƒgŠÖ」‚ªŽÀs’†‚Å‚·B'; 
      210: csBuf := Func + ' : DMA‚ªÝ’è‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B'; 
      240: csBuf := Func + ' : EscƒL[‚ª‰Ÿ‚³‚ê‚Ü‚µ‚½B'; 
      241: csBuf := Func + ' : ƒtƒ@ƒCƒ‹「üo—̓Gƒ‰[‚Å‚·B'; 
      242: csBuf := Func + ' : ƒAƒhƒŒƒXŽw’肪ŠÔˆá‚Á‚Ä‚¢‚Ü‚·B'; 
      245: csBuf := Func + ' : ƒoƒbƒtƒ@‚ª¬‚³‚·‚¬‚Ü‚·'; 
      246: csBuf := Func + ' : •s³‚ȃIƒuƒWƒFƒNƒg–¼‚Å‚·B'; 
      247: csBuf := Func + ' : ƒfƒoƒCƒX–¼‚̉¡‚̃`ƒFƒbƒN‚ª–³Œø‚Å‚·B'; 
      248: csBuf := Func + ' : •s³‚ȃf[ƒ^Œ^‚Å‚·B'; 
      249: csBuf := Func + ' : ‚±‚êˆÈãƒfƒoƒCƒX‚ð’ljÁ‚Å‚«‚Ü‚¹‚ñB'; 
      250: csBuf := Func + ' : ƒfƒoƒCƒX–¼‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB'; 
      251: csBuf := Func + ' : ƒfƒŠƒ~ƒ^‚ªƒfƒoƒCƒXŠÔ‚ňá‚Á‚Ä‚¢‚Ü‚·B'; 
      252: csBuf := Func + ' : GP-IBƒGƒ‰[‚Å‚·B'; 
      253: csBuf := Func + ' : ƒfƒŠƒ~ƒ^‚Ì‚Ý‚ðŽóM‚µ‚Ü‚µ‚½B'; 
      254: csBuf := Func + ' : ƒ^ƒCƒ€ƒAƒEƒg‚µ‚Ü‚µ‚½B'; 
      255: csBuf := Func + ' : ƒpƒ‰ƒ[ƒ^ƒGƒ‰[‚Å‚·B'; 
     end; 
    end 
    else 
     csBuf := Func + ' : ³íI—¹‚µ‚Ü‚µ‚½B'; 


    Ret1 := Ret and $ff00;     
    case Ret1 of 
     $100: csBuf := csBuf + ' -- [SRQ]‚ðŽóM<STATUS>';   // 10 -> [256] 
     $200: csBuf := csBuf + ' -- [IFC]‚ðŽóM<STATUS>';   // 10 -> [512] 
     $300: csBuf := csBuf + ' -- [SRQ]‚Æ[IFC]‚ðŽóM<STATUS>';  // 10 -> [768] 
    end; 

    Result := RetCode; 
end; 

EDIT 發現在DLL中的GpTalk功能這就是。可能幫助找到一個錯誤?

Format     
(C) 
    DWORD Srlen, Ret; 
    DWORD * Cmd; 
    char * Srbuf; 
    Ret = GpTalk(Cmd, Srlen, Srbuf); 



(Visual Basic) 
    Dim Srlen As Long, Ret As Long 
    Dim Cmd(xxxx) As Long '(xxxx specifies the maximum number of command arrays.) 
    Dim Srbuf As String 
    Dim SrbufB(xxxx) As Byte '(xxxx specifies the maximum amount of data.) 
    Ret = GpTalk(Cmd(0), Srlen, Srbuf) 
    Ret = GpTalkBinary(Cmd(0), Srlen, SrbufB(0)) 



Mode  Master mode/Slave mode 

Parameters   
     Cmd  : 

     [0] Number of talkers and listeners (= Number of listeners+1) 
       (Slave mode = 0) 
     [1] Talker address 
     [2] Listener address 


     Srlen  :  Transmit data length (byte) 
     Srbuf  :  Transmit data 
     SrbufB  :  Transmit data array(for binary) 
     Ret   :  Return value 
     0  : Normal completion 
     80 : GpIni() hasn't execute 
     140 : Asynchronous function is executing now 
     240 : ESC key pressed 
     242 : Miss in address specified 
     243 : Miss in buffers 
     252 : GP-IB error 
     254 : Timeout 
     255 : Illegal call 




Notes    
1 Command array: 
Since the number of commands to be sent is given to Cmd[0], specify 0 for Cmd[0] in slave mode. 

2 1Mbyte will be sent if transmit data length = 0. 
3 If you have already used DOS-Version, you do not need to execute Dmainuse function when using FIFO. 
4 When transmits binary data by VB, use GpTalkBinary. And secure buffers by Byte type. Refer to VB's help "unicode". 

回答

0
  1. 在D10-西雅圖,你必須使用PAnsiCharAnsiString數據緩衝區
    (因爲PCharPWideChar現代德爾福版本)。
  2. GpTalk return data is Srbuf?如果是這樣,緩衝區的長度是否足以應對?

srBuffer: AnsiString;          // command 
    SendBuf: PAnsiChar; 
... 
    SendBuf := PAnsiChar(srBuffer);       // change string to Pchar 
... 
function GpTalk(Cmd:PDWORD; Srlen:DWORD; Srbuf: PAnsiChar):DWORD;stdcall; 
+0

1.你能在代碼中告訴我需要改變什麼嗎? 2.它返回的文字是日文,所以不知道它的說法。我希望有一次,我得到DMM停止錯誤出來,它會在返回時顯示英文的東西。 – user41758

+0

查看快速檢查Ansi更換。看起來'csBuf'不參與數據流,並且不需要替換它。 – MBo

+0

是的!那工作。唯一可能需要解決的是SendBuf:PAnsiChar。我認爲你做了一個錯字。 – user41758