在將CAN數據導入應用程序時發(fā)生丟失CAN幀的情況,通常是由于應用程序花費太多時間處理某一報文,應用程序暫停等待用戶交互,或者應用程序正在等待共享系統(tǒng)資源,如數據文件等等。不管什么原因,應用程序開發(fā)人員應該計劃檢測這些丟棄的報文,以防止在由應用程序行為導致錯誤時搜索系統(tǒng)問題。
為了檢測這個問題,CANlib提供了三種方法來檢查接收緩沖區(qū)狀態(tài)和確定CAN幀是否已經丟棄:
?1.
canRead標志參數
用于確定CAN幀是否已被丟棄的第一種方法是監(jiān)視由canRead函數返回的標志參數。標志參數包含兩個位,它們表示在此函數調用和和當前調用返回的最后一個報文之間是否發(fā)生軟件或硬件溢出。這些位被定義為用于硬件溢出的canMSGERR_HW_OVERRUN和用于軟件溢出的canMSGERR_SW_OVERRUN。你也可以使用canMSGERR_OVERRUN掩碼同時檢查這兩種情況。因此,當應用程序檢查到這些位集中的一個時,應用程序就會獲知在當前CAN幀和接收的前一個CAN幀之間丟棄了報文。
要了解在使用軟件的情況下如何顯示,可以假設一個接收緩沖區(qū),它可容納10幀(當然,CANlib中的實際默認接收緩沖區(qū)大小遠大于10)。硬件已接收到10個CAN幀并將其放入可填入的緩沖區(qū)。

硬件接收到另一個CAN幀,但接收緩沖區(qū)已滿,因此該幀未添加到緩沖區(qū)。

硬件接收到第12個CAN幀,覆蓋未添加到緩沖區(qū)的幀。

應用程序調用canRead刪除第一個接收的CAN幀,并為要添加到接收緩沖區(qū)的第12幀留下點。

第1到10的CAN幀在由canRead檢索時不會指示溢出。當第11幀丟棄,通過canRead從緩沖區(qū)檢索時,第12個CAN幀將指示溢出。
?2.
canReadStatus
用于確定CAN幀是否已被丟棄的第二種方法是調用canReadStatus。如果設置了canSTAT_HW_OVERRUN或canSTAT_SW_OVERRUN位,該函數返回的標志參數將指示溢出。你可以使用canSTAT_OVERRUN掩碼檢查這些溢出位是否已設置。
此狀態(tài)信息是異步更新的,意味著canReadStatus返回的值是最后一次報告的值,但不一定是當前狀態(tài)。要確保報告的數據是最新的,你可以以周期性速率調用canRequestChipStatus。canRequestChipStatus要求更新狀態(tài)信息,但是函數退出時信息不是最新的。調用完成后將保持當前的狀態(tài)一段時間。
所以讓我們拿前面的我們的完整的緩沖區(qū)以及硬件接收到第11個報文為例來說明。我們每秒調用canRequestChipStatus兩次,每秒調用一次canReadStatus。

此時canReadStatus不會指示溢出。當硬件接收到第12個CAN幀覆蓋未添加到緩沖區(qū)的幀時,芯片狀態(tài)改變以指示溢出。

在下一個周期性canRequestChipStatus調用過程中報告該狀態(tài)開始。當進程完成時,下一次調用canReadStatus將指示溢出。這意味著根據第12個CAN幀在canRequestChipStatus和canReadStatus調用的周期中到達的時間,canReadStatus調用將不會在事件(在本例中)后最多一秒鐘指示狀態(tài)。
一旦在canReadStatus調用的標志參數中指示溢出,狀態(tài)將保持鎖定狀態(tài),直到你使用canIOCtl例程與canIOCTL_CLEAR_ERROR_COUNTERS函數清除狀態(tài)。這是為了防止應用程序由于檢查到溢出和使用canReadStatus例程輪詢狀態(tài)之間的競爭情況而丟棄檢測到的溢出。
03.
請求接收緩沖區(qū)級別
第三種方法是通過使用函數參數設置為canIOCTL_GET_RX_BUFFER_LEVEL的canIoCtl例程來監(jiān)視接收緩沖區(qū)的當前深度。返回的緩沖區(qū)將是當前存儲在接收緩沖區(qū)中的CAN幀的計數。
請記住,有時候與其把時間花費在檢查緩沖區(qū)級別,不如花點時間清空接收緩沖區(qū)。在執(zhí)行預定義塊傳輸時,檢查接收緩沖區(qū)級別可能更有用,其中應用程序可以等待直到在處理幀之前接收到整個塊。
注意事項
你可能會注意到,當使用第二、三個方法(canReadStatus或canIOCTL_GET_RX_BUFFER_LEVEL)時,如果緩沖區(qū)已滿并處于溢出狀態(tài),那么在接下來的canRead調用中指示溢出狀態(tài)。要在這些方法中檢索數據,接收隊列必須置于穩(wěn)定狀態(tài),以便檢查整個隊列。在此過程中,由于空間不足,報文可能在驅動程序和應用程序緩沖區(qū)之間被丟棄。這種丟棄由使用canRead檢索的下一個CAN幀的溢出狀態(tài)表示。
要點總結
應用程序開發(fā)人員應該在canRead()處理期間始終檢測丟棄的報文,以防止在由應用程序行為導致錯誤時搜索系統(tǒng)問題。你的應用程序設計可能會對CAN總線上的流量造成問題,這是你的第一條指示。使用此方法進行監(jiān)視將有助于在握手報文丟棄或預期的周期性報文超時時,確定故障發(fā)生在何處。雖然你可以使用單獨的工具來監(jiān)視總線上所需的報文,但監(jiān)視溢出標志將指示你的應用程序節(jié)點是最終原因或至少有風險。
你可以使用canRead溢出信息來跟蹤溢出的頻率。當流量帶寬由于報文突發(fā)而增加時,這可以識別應用的可能問題。
當在GUI上指示當前溢出狀態(tài)或向用戶發(fā)出重要報文可能已被丟棄的警告時,使用canReadStatus方法。
當你愿意停止GUI或其他進程時,將使用檢查接收緩沖區(qū)級別,以便在達到特定大小后專門計算資源立即清空緩沖區(qū)——防止發(fā)生溢出。一個這樣的情況是閃爍節(jié)點。
審核編輯:劉清
電子發(fā)燒友App
























評論