From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.
We appreciate your patience as we improve our online experience.
From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.
We appreciate your patience as we improve our online experience.
之前已經跟很多台 Handler/Prober做過 GPIB的通訊,都能正常。只有這一台Handler的通訊一直無法成功~
Handler提供的指令很簡單,就是收到SRQ 0x41後,就用ibwrt指令詢問一個資訊,再用ibrd讀回。
但是現在ibwrt的指令一直出現EABO (6)錯誤,也確定不是線的問題了。以下是我的代碼,不知道是哪邊有錯…
跟其他家handler的通訊模式也是類似,就可以正常,另外附上NI IO Trace 抓到的log
GHostUD = ibfind("GPIB0"); if (ibsta & ERR) { error_flag |=1; GpibError("ibdev0 Error"); } GDevUD = ibdev( /* Create a unit descriptor handle */ GPIB0, /* Board Index (GPIB0 = 0, GPIB1 = 1, ...) */ 5, /* primary address */ 0, /* Device secondary address */ T10s ,//T3s, /* Timeout setting (T3s = 3 seconds) */ //josh 2k50822 1, /* Assert EOI line at end of write */ 0x0C0A); /* EOS termination mode */ if (ibsta & ERR) { /* Check for GPIB Error */ error_flag |= 2; GpibError("ibdev Error"); } if (!error_flag) { ibrsc( GHostUD , 1) ; // request system control. ibsic( GHostUD); //assert interface clear ibclr(GDevUD); ibtmo(GDevUD, 12); ibconfig(GDevUD,IbcUnAddr,1); // Send UNT abd UNL at the end of device-lelvel reads and writes Sleep(100); } char srq; while (!Exit_Flag) //receive srq { ibwait(GDevUD, 0); ibrsp(GDevUD,&srq); if ((s&0x41)!=0x41) { ibwrt(GDevUD, "FULLSITES?\r\n",12); ibrd(GDevUD,Gcmds, 64); ..... ..... } }
已解決! 轉到解決方案。
您好,
請問實際遇到的問題是EABO(6)錯誤,還是EBUS(14)錯誤?因爲從附上的圖看到的是EBUS(14)錯誤。
不好意思 我附錯圖 應該是附件這一張
是先出現 EABO (6) 我再試著讀一次,才出現EBUS(14)...
另外我附的source中有的判斷式是手誤,應該是 if (srq & 0x41 ==0x41)
通常在讀取或寫入操作期間發生timeout,就會導致EABO(6)錯誤,不過也可能是因為在進行I/O 操作時,呼叫ibclr函式或類似函式而導致。若未啟用 PCI 匯流排主控 (在電腦 BIOS 中的選項),則在透過 PCI-GPIB 介面卡進行寫入操作時,即可能收到逾時。 若您正在讀取的儀器無法理解先前指令,因此沒有可向您寫入的資訊,也可能使您在讀取操作期間收到逾時的情況。 有數項原因可能讓儀器沒有可提供的資訊:
-傳給儀器的訊息可能拼寫錯誤。 例如,「*IDN?」是相容於 IEEE 488.2 儀器的常用識別查詢。 這很容易誤拼為「*IND?」,讓儀器無法理解,因此就不會產生可供您從儀器讀取的訊息字串。
-傳給儀器的訊息可能包含儀器無法理解的指令。 例如,只有相容於 IEEE 488.2 的儀器可理解先前範例中的「*IDN?」訊息。 如果儀器是不相容於 IEEE 488.2 的舊版裝置,那麼即無法理解「*IDN?」,因此也不會產生可供您從儀器讀取的訊息字串。
-儀器可能使用特定的 EOS (字串結束) 字元做為終止方法,但是您可能忘記在訊息中附加該終止字元。 例如,若儀器預期以換行字元做為 EOS 字元,那麼使用「ID?」即無效,而是需使用「ID?\n」(其中「\n」代表 IBIC 的換行字元) 才會有效。
-可能預期 EOI (end or identify,即「結束或識別」,5 條匯流排管理通道的其中之一) 為終止方法,但是若儀器在結束傳送訊息時並未設定 EOI 通道,則進行的任何讀取操作皆會逾時。
解決方案:
> 確定您的訊息由儀器可理解的指令組成。 查看裝置的使用者手冊以取得可能指令的清單。
> 查看使用者手冊,確認儀器是否需要處於 GPIB 或 488.2 模式才可成為 GPIB 接收器。 通常當儀器處於前述模式時,僅會對標準指令做出回應,否則即使傳送有效指令至該儀器,亦會發生錯誤。
> 確認您對儀器使用的終止方法正確。 雖然一律會使用位元組數 (預期會在訊息中收到特定數量的位元組),但是部分儀器為使用 EOS 與位元組數、某些使用 EOI 與位元組數,某些則僅使用位元組數。 查看裝置的使用者手冊,了解可搭配儀器使用的可能終止方法。
> 如果終止方法為 EOS,則請確定將終止字元附加至訊息結尾處。 可在 GPIB 設定公用程式中指定終止字元,但是 NI-488.2 驅動程式不會自動附加該項目
> 使用 ibtmo 指令延長 I/O 操作的逾時期間。
> 如果收到所有資料與 EABO 錯誤,那麼請找出特定的字串結束字元 (例如換行字元或歸位字元),並設定 GPIB 介面卡,以利用 ibeos 函式終止讀取該字元。
然後,EBUS(14)是命令字節傳輸錯誤。設備會在默認配置或ibtmo功能指定的時間限制內接受這些命令字節。如果在發送這些命令字節時發生逾時,則會產生EBUS結果。
因此,可試試增加逾時時間。
附上 NI-488.2 適用於 Windows 的使用者手冊