欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中用cantools和can工具包解析blf文件的方法

 更新時(shí)間:2023年09月01日 10:10:44   作者:羸弱的窮酸書生  
這篇文章主要給大家介紹了關(guān)于python中用cantools和can工具包解析blf文件的相關(guān)資料,blf數(shù)據(jù)不像mf4那樣自帶信號數(shù)據(jù)庫,因?yàn)樗怯浫罩居玫?一般情況下要盡可能的小,需要的朋友可以參考下

一、工具包安裝

pip install cantools python-can

二、解析blf文件

一般情況下,解析blf需要dbc文件,當(dāng)然其實(shí)不用dbc也可以,只不過解析比較麻煩,推薦還是配合dbc解析,這個(gè)也是我們最常用的辦法。所以要用dbc,需要先加載dbc文件,這里需要cantools,代碼:

import cantools
import can
dbc_file = r"C:\Users\master01\Downloads\blf_conf\FS04通用_TBOX(1).dbc"
dbc = cantools.db.load_file(dbc_file)

加載完dbc文件,就可以解析blf文件了,代碼

f = r"C:\Users\master01\Downloads\blfdata\問題blf\1.17-9-10.blf"
log_data = can.BLFReader(f)
for msg in log_data:
    print(msg)

打印結(jié)果是這樣的

Timestamp: 1673917200.026000        ID: 0301    S Rx                DL:  8    1d b0 41 54 07 02 00 00     Channel: 0
Timestamp: 1673917200.026000        ID: 070b    S Rx                DL:  8    00 c8 0c b6 24 b8 24 b8     Channel: 0
Timestamp: 1673917200.028000        ID: 0322    S Rx                DL:  8    00 00 00 00 00 00 03 00     Channel: 0
Timestamp: 1673917200.126000        ID: 030d    S Rx                DL:  8    00 14 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.126000        ID: 0320    S Rx                DL:  8    06 b1 00 00 00 00 07 00     Channel: 0
Timestamp: 1673917200.127000        ID: 0708    S Rx                DL:  8    00 48 00 48 00 08 00 32     Channel: 0
Timestamp: 1673917200.129000        ID: 0712    S Rx                DL:  8    00 06 81 0d 21 05 00 00     Channel: 0
Timestamp: 1673917200.271000    ID: 1821a7c1    X Rx                DL:  8    02 2f 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.321000        ID: 0110    S Rx                DL:  8    05 36 16 67 00 09 20 6b     Channel: 0
Timestamp: 1673917200.322000        ID: 0111    S Rx                DL:  8    16 5d 00 00 d4 00 20 bf     Channel: 0
Timestamp: 1673917200.322000        ID: 0112    S Rx                DL:  8    49 32 00 10 00 16 6d 4c     Channel: 0
Timestamp: 1673917200.326000        ID: 0300    S Rx                DL:  8    00 3a c2 f8 00 00 00 00     Channel: 0
Timestamp: 1673917200.326000        ID: 0710    S Rx                DL:  8    00 00 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.427000        ID: 0709    S Rx                DL:  8    0e 02 0e b0 4a 0c ff fe     Channel: 0
Timestamp: 1673917200.427000        ID: 070a    S Rx                DL:  8    11 51 1f fd 46 de 1c 83     Channel: 0
Timestamp: 1673917200.428000        ID: 0711    S Rx                DL:  8    02 df 00 09 02 d5 00 d4     Channel: 0
Timestamp: 1673917200.438000        ID: 0308    S Rx                DL:  8    03 22 0a 3c 0a 00 00 2a     Channel: 0
Timestamp: 1673917200.550000        ID: 03a1    S Rx                DL:  8    00 00 06 b1 00 00 15 00     Channel: 0
Timestamp: 1673917200.550000        ID: 03a2    S Rx                DL:  8    00 00 00 00 00 00 05 00     Channel: 0
Timestamp: 1673917200.633000        ID: 0270    S Rx                DL:  8    00 67 67 00 00 00 00 a2     Channel: 0
Timestamp: 1673917200.638000        ID: 0307    S Rx                DL:  8    41 14 03 c0 36 00 00 03     Channel: 0
Timestamp: 1673917200.638000        ID: 0309    S Rx                DL:  8    1c 1c 1c 1c 1c 1c c3 50     Channel: 0
Timestamp: 1673917200.655000        ID: 03a0    S Rx                DL:  8    06 b1 00 00 00 00 15 00     Channel: 0
Timestamp: 1673917200.657000        ID: 030a    S Rx                DL:  8    00 00 00 00 00 00 00 00     Channel: 0

可以發(fā)現(xiàn),時(shí)間戳解析出來了,其它的數(shù)據(jù)都是16進(jìn)制,沒法直接看,當(dāng)然我們?nèi)绻煜lf格式,可以自己把數(shù)據(jù)還原出來,但是既然已經(jīng)用第三方庫,我們當(dāng)然就不用自己解析了,而且仔細(xì)觀察一下即可發(fā)現(xiàn),之前的加載dbc并沒有用上,所以這時(shí)一個(gè)重要的函數(shù)登場了,那就是dbc.decode_message(id,data),具體代碼如下

decoded = {}
for msg in logdata:
    try:
        dec = dbc.decode_message(msg.arbitration_id, msg.data)
        if dec:
            for key, data in dec.items():
                if key not in decoded:
                    decoded[key] = []
                decoded[key].append([msg.timestamp, data])
    except:
        pass

因?yàn)槲疫@里是最后把數(shù)據(jù)解析出來轉(zhuǎn)成mf4了,所以構(gòu)建了一個(gè)decoded字典,每個(gè)key里記一個(gè)信號,熟悉mf4的應(yīng)該知道,mf4里每個(gè)信號主要包含兩部分,一個(gè)是時(shí)間戳,一個(gè)是數(shù)據(jù),有了這兩個(gè),我們就可以創(chuàng)建mf4文件了,最后放上創(chuàng)建mf4的代碼

from asammdf import MDF,Signal
sigs = []
for k,v in decoded.items():
    timestamps = [i[0] for i in v]
    data = [i[1] for i in v]
    s = Signal(data,timestamps,name=k)
    sigs.append(s)
mdf = MDF()
mdf.append(sigs)
mdf.save("xx.mf4",overwrite=True)

這樣就實(shí)現(xiàn)了blf文件的解析與轉(zhuǎn)換,當(dāng)然,轉(zhuǎn)換的格式很自由,只要熟悉相應(yīng)的格式,比如csv,hdf5,xlsx,json,pickle都可以,因?yàn)槲覀円呀?jīng)拿到原始數(shù)據(jù)了,保存成什么格式就很簡單了。

總結(jié)

到此這篇關(guān)于python中用cantools和can工具包解析blf文件的文章就介紹到這了,更多相關(guān)python解析blf文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論