LoginSignup
12
11

More than 5 years have passed since last update.

[メモ] オープンソースのcantools の libcandbcで、.dbcファイルの読み込み

Posted at

".dbc" ファイルは、そのスジ(車関係)の方々はよくよくご存知かと思います。

Cのプログラムで簡単に使いたい、というとき、cantools に含まれる、libcandbc を使うと、簡単に読み込みできます。
.lとか、.y のファイルがありますが、cのファイルを生成してくれているようなので、それらは気にしなくていいようです。

# ライセンスは、GPLv2。 なので、その辺は注意。

(例) Visual Studioで使ってみる

  1. .dbcのデータをさがしてくる。(j1939_utf8.dbcとかで検索?)
  2. Projectのページで、ファイルダウンロードして解凍するか、svnで取得する。
  3. cantools-code/src/libcandbc のみ使用するので、うまいとこにコピーする。
  4. サンプルコード(↓のtetdbc.c)を同じフォルダに作成。
  5. Visual Studioを立ち上げて、 File => New => Project From Exsisting Code...から
  6. Visual C++ [Next]で、Project file location:に先ほどのフォルダ、Project name:をてきとうに (testdbcとか)いれて、[Next]
  7. Project type:は、Console application project (printfを使ってるので...)で、[Next]、[Next]、[Finish]
  8. Solution Explorerで、testdbcのプロジェクトプロパティを開いて(右クリ-> Properties)、
    • VC++ DirectriesInclude Directries.;を入れて、[Apply] => .;\$(VC_IncludePath);\$(WindowsSDK_IncludePath);
    • C/C++ => PreprocessorPreprocessor DefinisionsYY_NO_UNISTD_H;を追加して、[Apply]
  9. ビルドして、実行。
testdbc.c
#include <stdio.h>
#include "dbcReader.h"

int main(int ac, char *av[])
{
    dbc_t *p; 

    p = dbc_read_file("./j1939_utf8.dbc");

    if (p == NULL) return -1;

    for (message_list_t *ml = p->message_list; ml != NULL; ml = ml->next)
    {
        printf("ID:$%08x - %s \n", ml->message->id, ml->message->name);
        for (signal_list_t *sl = ml->message->signal_list; sl != NULL; sl = sl->next)
        {
            printf("\t%s\n", sl->signal->name);
        }
    }

    return 0;
}
実行結果
ID:$c0000000 - VECTOR__INDEPENDENT_SIG_MSG 
    TrailerWeight
    ReferenceTirePressSetting
    ReferenceTirePress
    TirePressThresholdDetection
    TireAirLeakageRate
    CTIWheelEndElectricalFault
    CTITireStatus
    CTIWheelSensorStatus
    TireTemp
    TirePress
ID:$88f02dfe - AccelerationSensor 
    SpprtVrblTrnsRpttnRtFrAcclrtnSns
    VrtclAcclrtnExRngeFigureOfMerit
    LngtdnlAcclrtnExRngFgureOfMerit
    LtrlAcclrtnExRangeFigureOfMerit
    VerticalAccelerationExRange
    LateralAccelerationExRange
    LongitudinalAccelerationExRange
ID:$98fceafe - VEP4 
    HybrdBatteryPackRemainingCharge
ID:$8cf029fe - SSI2 
    RllAndPtchExRngMsurementLatency
    RollAngleExRangeFigureOfMerit
    RollAngleExRangeCompensation
    PitchAngleExRangeFigureOfMerit
    PitchAngleExRangeCompensation
    RollAngleExRange
    PitchAngleExRange
...
...
...

ID:$9cfda7fe - VROM 
    VoltageRegulatorEnabled
    VoltageRegulatorSoftStartState
    VltgRgltrUndrfrqncyCmpnstnEnbld
    VltgRgltrVAr_PwrFctrOprtingMode
    VltgRglatorLoadCompensationMode
ID:$8cfda6fe - VREP 
    GnrtrOtputVoltageBiasPercentage
    GeneratorExcitationFieldCurrent
    GeneratorExcitationFieldVoltage
12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11