2014-01-24 110 views
9

我正在研究連接OBD2適配器並獲取速度,轉速,節氣門位置等實時數據的應用程序。當我一次讀取一個命令時,它工作正常比如通過發送命令「010C \ r」,我得到當前的RPM。一起發送多個OBD命令並同時獲得響應

我認爲在一個請求中發送多個命令是不可能的。但是在像EngineLink HD,Dashcommand等其他應用程序中,我們發現多個組件在一次更新,就像我們駕駛汽車並檢查RPM,Sped和油門然後他們每1秒更新一次。它看起來像實時數據。

我很驚訝,它怎麼可能?

我們已經添加代碼,如果用戶想要顯示3種成分,則對於每一個組件,則產生一個線程,它處理請求和命令的響應等。因此,在這種情況下,會生成3個線程,我們會得到響應,但是如果我們在3個PID中觀察速度,則需要太多時間,然後在延遲3-4秒後更新速度。

我們還需要鎖定它發送請求的代碼,並得到響應bcoz OBD2適配器處理一次一個請求和響應。

如果我們不鎖碼,然後我們得到的,這可能是由於應用和OBD2適配器之間的socket通信使用公共的共享流無法預料的結果。

但是現在我想一次讀取多個命令。我想知道速度,轉速和節氣門位置等。因此,我想在一個請求中發送上述命令,並且一次獲得響應。

這怎麼可能?有人可以指導我。

+0

您好,我也正在OBD。我是OBD的新手。你能分享你的OBD知識嗎?如何使用wifi連接到OBD設備?如何與OBD通信以執行其命令?請幫我解決這個問題嗎? –

+0

你好,如果你能幫助我創建一個應用程序來讀取使用elm327 wifi模塊的OBD數據,那真的太好了嗎?如果你能聯繫我@ [email protected]會很感激。等待你的答覆。謝謝! –

回答

5

首先,我不認爲你需要3個線程。正如你所說,OBD-II一次只能處理1個命令,所以你可以使用1個線程,知道每秒必須做出哪些請求。

簡而言之,你不能一次讀取多個命令。正如你所說,你經歷了一些延遲。 OBD-II的默認設置對此負責。默認的等待時間,(據我所知)200毫秒。所以你每秒只能發送5個命令。這有點慢,並且有些應用程序每秒鐘都會收到20個請求。

您可以通過在命令結尾處發送一個額外的編號(編號x)來完成此操作。 OBD-II設備將等待車內設備的x響應。所以當你發送'010D1'時,它會等到1個回答進來,它會直接發回給你。那麼在50ms或者甚至更短的時間內處理命令是很簡單的。

這就是應用程序看起來像是在同一時間請求數據的方式。他們也可以使用一些技巧來等待收集所有數據,然後顯示它。

我希望我回答你所有的問題,否則再問一些。

編輯:

同樣對於succesfull命令,這個標準時間取。這是因爲一些命令可以有兩個源報告相同的數據。例如,速度表和GPS模塊都可以測量速度。如果兩者都連接到OBD-II總線,那麼您將得到2個答案。

'010D'將等待200ms,然後報告所有答案。使用'010D1'時,它會在有1個答案時直接發回第一個答案。

+0

謝謝埃裏克的答覆..我嘗試從我身邊,讓你知道 – NSS

+1

我的問題已被修復,因爲它是我們的核心功能之一的線程問題,線程休眠1秒,以確定斷開服務器,它創建問題..但現在,我的代碼工作正常。感謝您的建議!我們開始瞭解以更快的速度獲取OBD數據的一種新方法 – NSS

+0

每個命令都使用默認的等待時間,即使是成功的命令也是如此?我的理解是,只有在OBD無法獲得對PID的響應時(例如不支持),此超時才適用。 – PVS

5

的ELM327數據表提供了45頁以下信息:

多PID請求 的SAE J1979(ISO 15031-5)標準允許 請求多個PID的一個消息,但是隻有當你 連接到帶CAN的車輛(ISO 15765-4)。 一次最多可以請求六個參數,而 答覆是一條包含所有 響應的消息。例如,假設您需要定期瞭解 發動機負荷(04),發動機冷卻液溫度(05), 歧管壓力(0B)和發動機轉速(0C)。您可以發送四個獨立的請求 他們(01 04,那麼01 05,那麼01 0B等),或者你可以 把他們都到一個消息是這樣的:

01 04 05 0B 0C 到其中,典型的應答可能是: 00A 0:41 04 3F 05 44 0B 1:21 0C 17 B8 00 00 00

+0

這些PIDS是以並聯還是串聯的方式向ECU請求的?測試這種方法的一種方法是,請求0D 10次,然後如果ELM327芯片允許,它應該是相同的值。 –

+0

他們被串行處理。 OBD2是串行接口,無法改變這種行爲。 – DrMickeyLauer

相關問題