本發(fā)明涉及一種獲取車輛狀態(tài)信息的方法,尤其是一種獲取can總線獲取車輛信息的方法和裝置。
背景技術(shù):
:隨著電子技術(shù)的發(fā)展,傳統(tǒng)的車輛都往智能化方向發(fā)展,車輛的電控系統(tǒng)越來越多,并且,遍布于車身的各種傳感器實時的監(jiān)測車輛的狀態(tài)信息,并將此信息發(fā)送至相對應(yīng)的控制單元內(nèi)。車身上的這些控制單元并不是獨立工作的,它們作為一個整體,需要信息的共享,因此存在信息傳遞的問題。目前普遍采用can-bus即can總線技術(shù)(控制器局域網(wǎng)總線技術(shù)),通過該種方式,每個控制單元都連接到這兩條上,這樣此信息會在總線系統(tǒng)上進行傳遞,每個與總線系統(tǒng)連接的控制單元都會接收到此信息,如果此信息對自己有用則會存儲下來,如果對其無用,則會進行忽略。can總線技術(shù)通過這種方式實現(xiàn)多個控制單元間的信息共享,所有的信息,不管信息容量的大小,都可以通過can總線進行傳遞,提高了整個系統(tǒng)的運行效率。獲取can總線的車輛狀態(tài)信息并解析該信息能夠?qū)τ谥悄芷嚨墓δ軐崿F(xiàn)十分重要,每個廠商的每個車型都有不同的can總線信號格式的定義,因此,需要一種有效的能夠從各種車型中解析到can總線消息的方法。技術(shù)實現(xiàn)要素:本發(fā)明的目的是為了提供一種能夠動態(tài)解析can總線消息的方法。一種can總線消息解析系統(tǒng),包括:數(shù)據(jù)接口,用于獲取can總線消息的幀數(shù)據(jù);調(diào)用模塊,用于根據(jù)所獲取的總線消息數(shù)據(jù)幀的前4個字節(jié)獲取消息號,并調(diào)用解析函數(shù)模塊;解析函數(shù)模塊,根據(jù)所述消息號,加載信號描述符變量模塊中所述消息號所對應(yīng)信號的解析變量,并對所述總線消息數(shù)據(jù)幀的后8個字節(jié)進行解析,獲得原始數(shù)據(jù),將獲得的原始數(shù)據(jù)保存至信號描述符變量模塊;信號描述符變量模塊,按照消息中的每個信號,分別存儲用于從總線消息數(shù)據(jù)幀中解析獲得該信號原始數(shù)據(jù)的變量,以及用于存儲解析獲得的信號的原始數(shù)據(jù)。上述系統(tǒng)中,信號描述符變量模塊,所述描述符變量中包括第一標(biāo)識位,用于標(biāo)識變量中是否保存有原始數(shù)據(jù)。上述系統(tǒng)中,所述信號描述符變量模塊,還存儲將原始數(shù)據(jù)換算為物理數(shù)據(jù)的變量;以及,調(diào)用物理數(shù)據(jù)接口獲取原始數(shù)據(jù);物理數(shù)據(jù)接口,按照所述變量將原始數(shù)據(jù)換算為物理數(shù)據(jù)。上述系統(tǒng)中,所述物理數(shù)據(jù)接口將換算得到的物理數(shù)據(jù)發(fā)送到上層應(yīng)用。上述系統(tǒng)中,所述數(shù)據(jù)幀數(shù)據(jù)結(jié)構(gòu)為摩托羅拉升序編碼格式motolsb或者摩托羅拉降序編碼格式motomsb或者英特爾編碼格式intel中的一種。一種can總線消息解析方法,包括:獲取can總線消息的幀數(shù)據(jù);根據(jù)所獲取的總線消息數(shù)據(jù)幀的前4個字節(jié)獲取消息號;查找該消息號對應(yīng)的洗好描述符,獲得各信號描述符分別對應(yīng)的解析變量,分別從所述數(shù)據(jù)幀的后8個字節(jié)中解析獲得各消息描述符對應(yīng)的原始數(shù)據(jù)。上述方法還包括:查找該消息號對應(yīng)的消息描述符,獲得各消息描述符分別對應(yīng)的換算變量,根據(jù)所述換算變量將信號描述符所對應(yīng)的原始數(shù)據(jù)換算為物理數(shù)據(jù)。一種can總線消息解析函數(shù)存取方法,獲取數(shù)據(jù)庫容器文件dbc中的消息號以及信號名;查找所述信號名,獲取從數(shù)據(jù)幀中獲取所述信號原始數(shù)據(jù)的第一變量集合;查找所述信號名,獲取將所述信號原始數(shù)據(jù)換算為物理數(shù)據(jù)的第二變量集合;按照預(yù)置的格式保存所述信號名以及所對應(yīng)的所述第一變量集合與第二變量集合。上述方法中,所述按照預(yù)置的格式保存第一變量集合與第二變量集合,具體為:保存信號名對應(yīng)原始數(shù)據(jù)在數(shù)據(jù)幀的起始位置、原始數(shù)據(jù)長度以及原始數(shù)據(jù)位的初始化數(shù)據(jù);保存信號名對應(yīng)的原始數(shù)據(jù)到物理數(shù)據(jù)的換算比例、原始數(shù)據(jù)到物理數(shù)據(jù)的偏移、物理數(shù)據(jù)的最小值及物理數(shù)據(jù)最大值。上述方法中,所述按照預(yù)置的格式保存還包括保存所述消息號。本發(fā)明實施例可以有效的從各種車型中解析得到can總線的消息,提高了解析效率,降低各種車型can總線消息定義不同造成的解析錯誤的風(fēng)險。附圖說明為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明系統(tǒng)實施例示意圖;圖2為本發(fā)明方法實施例流程圖。具體實施方式下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有付出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。本發(fā)明實施例可以有效的從各種車型中解析得到can總線的消息,提高了解析效率,降低各種車型can總線消息定義不同造成的解析錯誤的風(fēng)險。由于每個廠商的每個車型都有不同的canbus矩陣表格,該表格以dbc文件格式定義。從而導(dǎo)致通過canbus解析不同車輛類型狀態(tài)的時候,需要實現(xiàn)不同的解析模塊。其中,dbc是microsoftvisualfoxpro數(shù)據(jù)庫容器文件。為實現(xiàn)本發(fā)明目的,首先對dbc文件進行解析。比如,dbc文件的某段數(shù)據(jù)內(nèi)容為:bo_1028t_box_404:8tboxsg_tboxnmsleepacknowledge:13|1@0+(1,0)[0|1]""bcm,ic,pepssg_tboxnmsleepindication:12|1@0+(1,0)[0|1]""bcm,ic,pepssg_tboxnmlimphome:10|1@0+(1,0)[0|1]""bcm,ic,pepssg_tboxnmring:9|1@0+(1,0)[0|1]""bcm,ic,pepssg_tboxnmalive:8|1@0+(1,0)[0|1]""bcm,ic,pepssg_tboxnmdestinationaddress:7|8@0+(1,0)[0|255]""bcm,ic,peps以上dbc文件數(shù)據(jù)中,包含canbus消息的消息名,“t_box_404”為消息名。以及,消息名中包括canbus消息的消息號,為0x404。以上dbc文件數(shù)據(jù)中,“tboxnmsleepacknowledge”、“tboxnmsleepindication”、“tboxnmlimphome”、“tboxnmring”、“tboxnmalive”、“tboxnmdestinationaddress”為消息名t_box_404對應(yīng)的信號名。對應(yīng)于每個信號,信號名后面的數(shù)據(jù)表示該信號的描述信息,包括解析變量以及換算變量。其中,所述解析變量用于描述信號在總線采集到的幀數(shù)據(jù)中的起始位(bit),位寬,bit的endian模式,現(xiàn)在通用的有3中模式,motorla升序,motorla降序,intel小端序,分別對應(yīng)"motolsb_order","motomsb_order","intel_order";根據(jù)這三者信息,可以從幀數(shù)據(jù)中獲取到信號的原始數(shù)據(jù)。所述換算變量,用于描述信息中包括原始數(shù)據(jù)到物理數(shù)據(jù)的變換比例和偏移量,原始數(shù)據(jù)×變換比例+偏移量就是對應(yīng)的物理數(shù)據(jù),經(jīng)過這樣的計算,就可以獲取到信號表示的物理數(shù)據(jù)。以sg_tboxnmsleepacknowledge:13|1@0+(1,0)[0|1]""bcm,ic,peps為例,信號名tboxnmsleepacknowledge的變量中,13表示該信號原始數(shù)據(jù)在數(shù)據(jù)幀中的起始位置,位寬為1;"@0"表示采用了motorla升序排列;"+"表示有符號類型;"(1,0)"表示乘法因子和偏移量,ex:value*1+0就是具體的數(shù)值;"[0|1]"表示這個值的最大值和最小值;"""bcm,ic,peps"表示bcm,ic,peps會關(guān)心這個tboxnmsleepacknowledge變量。在一個實際的canbus消息數(shù)據(jù)幀中共包含12個字節(jié),其中,前4個字節(jié)用于放置所述消息號,后8個字節(jié)用于放置該消息的內(nèi)容。參見以下canbus數(shù)據(jù)幀的舉例,消息號0x404被置于數(shù)據(jù)幀中的前4個字節(jié)中。因此,當(dāng)從canbus總線上獲取到如下的數(shù)據(jù)幀時,則表示該canbus數(shù)據(jù)幀中存儲的是消息名為t_box_404對應(yīng)的消息內(nèi)容。0x040x040x000x00xxxxxxxxxxxxxxxx通過對dbc文件的解析,獲得dbc文件中定義的所有消息名,以及各消息名對應(yīng)的信號集合,即獲得一個解析can消息的模塊,該模塊由.h頭文件和.c實現(xiàn)文件構(gòu)成。其中,.h頭文件的消息結(jié)構(gòu)體通過掃描dbc文件實現(xiàn),信號枚舉定義通過掃描dbc文件獲取各個消息的信號集構(gòu)成,.h頭文件的其他部分是模塊接口聲明。其中,.c實現(xiàn)文件,包含了模塊的接口實現(xiàn),由模塊初始化接口,模塊卸載接口,獲取信號物理數(shù)據(jù)的接口構(gòu)成。其中,模塊初始化接口的功能是初始化模塊的數(shù)據(jù)接口,打開物理設(shè)備,同時啟動一個后臺線程。該后臺線程用于獲取物理設(shè)備上的canbus消息,然后通過消息的前4個字節(jié)調(diào)用不同的canbus解析函數(shù)。該函數(shù)通過掃描dbc文件后動態(tài)生成,每個動態(tài)生成的解析函數(shù)讀寫動態(tài)生成的can_item變量,can_item數(shù)組的內(nèi)容通過掃描dbc文件生成。由于不同的dbc文件有不同的消息頭定義,所以調(diào)用canbus解析函數(shù)的部分,也是通過掃描dbc文件的消息生成。模塊卸載接口主要功能是釋放模塊申請的資源。獲取信號物理數(shù)據(jù)的接口主要功能是通過信號枚舉獲取該信號的物理值。以下通過具體實例說明can消息解析模塊的實現(xiàn)。can消息解析模塊的頭文件,結(jié)構(gòu)組成包括:信號集對應(yīng)的枚舉定義以及接口聲明。其中,信號集合的枚舉定義如下例所示:can消息解析模塊的頭文件,模塊包括:模塊數(shù)據(jù)結(jié)構(gòu)定義、信號描述符結(jié)構(gòu)變量定義、消息解析函數(shù)定義以及調(diào)用消息解析函數(shù)的語句塊。1)模塊數(shù)據(jù)結(jié)構(gòu)定義如下:order_type表示原始數(shù)據(jù)在總線上的排列格式,包括三種類型,分別是摩托羅拉升序編碼格式motolsb、摩托羅拉降序編碼格式motomsb、以及英特爾編碼格式intel。2)信號描述符數(shù)據(jù)結(jié)構(gòu)定義以下為一信號描述符結(jié)構(gòu)變量舉例。以上述{motolsb_order,0,13,1,1.0,0.0,0.0,1.0,"tboxnmsleepacknowledge",0x404,false,pthread_rwlock_initializer}為例,其中:motolsb_order表示信號編碼格式為摩托羅拉升序編碼格式;0為u64raw的初始化值,此時還未獲取到canbus上的原始數(shù)據(jù),u64raw初始化值為0;13是變量u32start表明的原始數(shù)據(jù)在數(shù)據(jù)幀內(nèi)的起始bit位置;該原始數(shù)據(jù)的比特位長度u32len為1;該信號原始數(shù)據(jù)到物理數(shù)據(jù)的變換比例doublescale為1.0;該信號原始數(shù)據(jù)到物理數(shù)據(jù)的偏移值doubleoffset為0.0該信號物理數(shù)據(jù)的最小值doubleminimum為0.0該信號物理數(shù)據(jù)的最大值doublemaximum為1.0信號的描述字符串變量constchar*desc表明該信號的信號名為tboxnmsleepacknowledge信號的消息號碼變量u32id中0x404為信號tboxnmsleepacknowledge對應(yīng)的消息號;boolloaded變量值為false,表明該信號的原始數(shù)據(jù)未從canbus上獲取過;pthread_rwlock_initializer,是posix線程庫中初始化鎖的宏,有兩個場景需要使用到這個鎖,其一是當(dāng)數(shù)據(jù)采集層從車身獲取數(shù)據(jù)后,填充到相應(yīng)系統(tǒng)buffer,其二是當(dāng)tbox上的業(yè)務(wù)層從buffer列表中獲取這個數(shù)據(jù)上傳平臺,這兩種情況都需要檢查這個鎖,是否是正在寫或者正在讀取。3)消息解析函數(shù)定義其中,get_field64和load_item函數(shù)在實現(xiàn)文件中靜態(tài)定義,get_field64用于從數(shù)據(jù)幀中解析獲取信號的原始數(shù)據(jù),load_item用于將原始數(shù)據(jù)保存到信號描述符變量中,并在第一次獲取到信號數(shù)據(jù)或者原始數(shù)據(jù)有變化時候通知上層模塊。4)調(diào)用消息解析函數(shù)的語句case0x404:get_t_box_404(frm+4);break;以上舉例中,調(diào)用消息號為0x404,消息名為t_box_404的解析函數(shù),對canbus數(shù)據(jù)幀的后8個字節(jié)(即偏移前4個字節(jié))的數(shù)據(jù)進行解析。綜上所述,為了實現(xiàn)對canbus消息的解析,通過對dbc文件的讀取掃描,按照dbc文件中定義的canbus消息所對應(yīng)信號原始數(shù)據(jù)的解析變量和原始數(shù)據(jù)到物理數(shù)據(jù)的變量,獲得了dbc文件中涉及的所有消息的解析函數(shù);通過預(yù)置的信號描述符結(jié)構(gòu),按照dbc文件中每個信號的數(shù)據(jù)規(guī)則對信號描述符的變量進行初始化;其中u64raw以及boolloaded為默認(rèn)初始值,信號描述符其余變量是通過讀取dbc文件獲得的解析信號所需的變量值,用于對數(shù)據(jù)幀解析獲得原始數(shù)據(jù),以及換算到物理數(shù)據(jù)。從而,canbus消息解析系統(tǒng)中包含了dbc文件中所有消息對應(yīng)的信號,及信號描述符變量,生成解析函數(shù),從而在解析的過程中通過對解析函數(shù)的調(diào)用獲取和保存原始數(shù)據(jù),以及將原始數(shù)據(jù)換算為物理數(shù)據(jù)。參照圖1,具體說明本發(fā)明實施例對canbus消息解析的系統(tǒng)。數(shù)據(jù)接口11,用于獲取canbus總線消息的幀數(shù)據(jù);在實際的應(yīng)用中,canbus數(shù)據(jù)幀通常包括12個字節(jié),其中前4個字節(jié)存儲的數(shù)據(jù)是canbus總線消息的消息號,后8個字節(jié)存放的數(shù)據(jù)為消息號對應(yīng)的消息內(nèi)容。調(diào)用模塊12,根據(jù)數(shù)據(jù)接口11所獲取的總線消息數(shù)據(jù)幀的前4個字節(jié)獲取消息號,并根據(jù)消息號調(diào)用解析函數(shù)模塊。解析函數(shù)模塊13,針對不同的canbus消息號,預(yù)置分別存儲了用于解析該消息的解析函數(shù);所述解析函數(shù)通過加載信號描述符變量模塊14中canbus消息對應(yīng)的每個信號的解析變量,對數(shù)據(jù)接口獲取的can總線消息數(shù)據(jù)幀的后8個字節(jié)的數(shù)據(jù)進行解析,獲得原始數(shù)據(jù);以及,將獲得的原始數(shù)據(jù)保存至信號描述符變量模塊。信號描述符變量模塊14,存儲有消息號所對應(yīng)的信號描述符的變量集合,即按照消息中的每個信號,分別存儲用于從總線消息數(shù)據(jù)幀中解析獲得該信號原始數(shù)據(jù)的變量,以及將原始數(shù)據(jù)換算為物理數(shù)據(jù)的變量,以及對于每個信號分別存儲解析獲得的信號的原始數(shù)據(jù)。信號描述符變量模塊結(jié)構(gòu)定義參見上文所述的信號描述符數(shù)據(jù)結(jié)構(gòu)定義描述部分。信號描述符變量集合舉例如下。以上述{motolsb_order,0,13,1,1.0,0.0,0.0,1.0,"tboxnmsleepacknowledge",0x404,false,pthread_rwlock_initializer}為例,其中:motolsb_order表示信號編碼格式為摩托羅拉升序編碼格式;0為u64raw的初始化值,此時還未獲取到canbus上的原始數(shù)據(jù),u64raw初始化值為0;13是變量u32start表明的原始數(shù)據(jù)在數(shù)據(jù)幀內(nèi)的起始bit位置;該原始數(shù)據(jù)的比特位長度u32len為1;該信號原始數(shù)據(jù)到物理數(shù)據(jù)的變換比例doublescale為1.0;該信號原始數(shù)據(jù)到物理數(shù)據(jù)的偏移值doubleoffset為0.0該信號物理數(shù)據(jù)的最小值doubleminimum為0.0該信號物理數(shù)據(jù)的最大值doublemaximum為1.0信號的描述字符串變量constchar*desc表明該信號的信號名為tboxnmsleepacknowledge信號的消息號碼變量u32id中0x404為信號tboxnmsleepacknowledge對應(yīng)的消息號;boolloaded變量值為false,表明該信號的原始數(shù)據(jù)未從canbus上獲取過;pthread_rwlock_initializer,是posix線程庫中初始化鎖的宏,有兩個場景需要使用到這個鎖,其一是當(dāng)數(shù)據(jù)采集層從車身獲取數(shù)據(jù)后,填充到相應(yīng)系統(tǒng)buffer,其二是當(dāng)tbox上的業(yè)務(wù)層從buffer列表中獲取這個數(shù)據(jù)上傳平臺,這兩種情況都需要檢查這個鎖,是否是正在寫或者正在讀取。解析函數(shù)模塊13解析獲得消息號所對應(yīng)的信號的原始數(shù)據(jù)時,信號描述符變量模塊14將所述原始數(shù)據(jù)保存至相應(yīng)的信號描述符變量中,即將u64raw變量中的初始值更新為所獲取的原始數(shù)據(jù)。參見上文對信號描述符數(shù)據(jù)結(jié)構(gòu)定義的描述,變量結(jié)合中包含第一標(biāo)識位,用于標(biāo)識變量中是否保存有原始數(shù)據(jù),當(dāng)?shù)谝淮伪4嬖紨?shù)據(jù)替代初始化值時,該標(biāo)識位由false變?yōu)閠rue;并且,信號描述符變量模塊調(diào)用物理數(shù)據(jù)接口獲取所述更新后的原始數(shù)據(jù);物理數(shù)據(jù)接口15,用于將信號描述符變量中的原始數(shù)據(jù)換算為物理數(shù)據(jù),將原始數(shù)據(jù)換算為物理數(shù)據(jù)的參數(shù)保存在信號描述符變量模塊中,物理接口數(shù)據(jù)按照信號描述符變量模塊中的參數(shù)將原始數(shù)據(jù)換算為物理數(shù)據(jù)。以及,在原始數(shù)據(jù)發(fā)生變化時,所述物理數(shù)據(jù)接口還將換算得到的物理數(shù)據(jù)發(fā)送到上層應(yīng)用。其中,所述數(shù)據(jù)幀數(shù)據(jù)結(jié)構(gòu)為摩托羅拉升序編碼格式motolsb或者摩托羅拉降序編碼格式motomsb或者英特爾編碼格式intel中的一種。參照圖2,說明本發(fā)明方法實施例的實現(xiàn)。步驟21:獲取can總線消息的幀數(shù)據(jù);步驟22:根據(jù)所獲取的總線消息數(shù)據(jù)幀的前4個字節(jié)獲取消息號;步驟23:查找該消息號對應(yīng)的信號描述符,獲得各信號描述符分別對應(yīng)的解析變量;步驟24:利用解析函數(shù)及所述解析變量,分別從所述數(shù)據(jù)幀的后8個字節(jié)中解析獲得各消息描述符對應(yīng)的原始數(shù)據(jù)。若從can總線解析得到消息所對應(yīng)信號的原始數(shù)據(jù)時,還包括:步驟25:保存所述原始數(shù)據(jù)與該信號的信號描述符的對應(yīng)關(guān)系;步驟26:查找該消息號對應(yīng)的消息描述符,獲得各消息描述符分別對應(yīng)的換算變量;步驟27:根據(jù)所述換算變量將信號描述符所對應(yīng)的原始數(shù)據(jù)換算為物理數(shù)據(jù);步驟28:將所述物理數(shù)據(jù)發(fā)送至上層應(yīng)用。在步驟25中,若第一次獲取保存信號的原始數(shù)據(jù),則在該信號描述符所對應(yīng)的標(biāo)志位中進行標(biāo)記。以上對實施例的說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對這些實施例的多種修改對本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實施例中實現(xiàn)。因此,本發(fā)明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。當(dāng)前第1頁12