dbcppp 边学边记
1. USB - CAN 通过 USB 读取原始数据
2. DBC 文件
3. dbcppp 解析 DBC
4. dbcppp 根据 DBC 解析 USB 原始数据
------
dbcppp 能不能解析 CAN 数据?
dbcppp 解析 DBC 文件之后的用图?
------
遇事不决西西狗
/examples/BasicUsage/main.c 不会用,磨一个。
#include <fstream>
#include <unordered_map> #include "../../include/dbcppp/CApi.h" #include "../../include/dbcppp/Network.h" // from uapi/linux/can.h using canid_t = uint32_t;
// 路阳 can_frame 数据格式定义,这个有标准规定吗? struct can_frame { canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ uint8_t can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ uint8_t __pad; /* padding */ uint8_t __res0; /* reserved / padding */ uint8_t __res1; /* reserved / padding */ uint8_t data[8]; };
// 路阳 获取 frame_data,给 dbcppp 喂数据的函数
// 路阳 说明 dbcppp 还是会对 can_frame 做一些处理的
// 路阳 干了啥? void receive_frame_data(can_frame* frame) { // receive meaningful data // Example frame // Set data for test_msg_mux0 from src/Test/Test.dbc // The selcted mux does have the format /* BO_ 1 test_msg_mux0: 8 VehicleBus * [...] * SG_ s3_0 m3 : 8|8@1+ (1,-40) [0|0] "C" Receiver * SG_ s3_1 m3 : 16|11@1+ (0.5,1) [0|0] "C" Receiver * SG_ s3_2 m3 : 27|10@1+ (1,-20) [0|0] "C" Receiver * SG_ s3_3 m3 : 37|10@1+ (1,0) [0|0] "C" Receiver * SG_ s3_4 m3 : 47|1@1+ (1,0) [0|0] "" Receiver * SG_ s3_5 m3 : 48|1@1+ (1,0) [0|0] "" Receiver * SG_ s3_6 m3 : 49|1@1+ (1,0) [0|0] "" Receiver * SG_ s3_7 m3 : 50|11@1+ (0.125,-40) [0|0] "C" Receiver * SG_ s3_8 m3 : 61|1@1+ (1,0) [0|0] "" Receiver * SG_ s3_9 m3 : 62|1@1+ (1,0) [0|0] "" Receiver * SG_ s3_10 m3 : 63|1@1+ (1,0) [0|0] "" Receiver * [...] */ frame->can_id = 1; *reinterpret_cast<uint64_t*>(frame->data) = 0; // set mux_switch_value to 3 (m3) frame->data[0] |= 3; // set value for signal s3_1 to 13 // expected output after decoding and rawToPhys: s3_1 = 15 * 0.5 + 1 = 8.5 frame->data[2] |= 15; }
// 路阳 main 宇宙的起源
// 路阳 从这里你能探索出 dbcppp 使用流程 int main() {
// 路阳 先捡个锤子 INetwork std::unique_ptr<dbcppp::INetwork> net; {
// 路阳 加载 dbc 文件 std::ifstream idbc("your.dbc");
// 路阳 锤子要消化一下你喂的 dbc net = dbcppp::INetwork::LoadDBCFromIs(idbc); }
// 路阳 IMessage,还是个 map,啥啥啥, 先留个坑
std::unordered_map<uint64_t, const dbcppp::IMessage*> messages;
// 路阳 锤子吃的是 dbc,拉的是 Messages for (const dbcppp::IMessage& msg : net->Messages()) { messages.insert(std::make_pair(msg.Id(), &msg)); }
// 路阳 购物车,买 can_frame 要用,你不可能徒手抱着一堆字节码吧。 can_frame frame; while (1) { receive_frame_data(&frame);
// 获取的原始 can_frame 必须有 dbc 中匹配的 can_id,啥 can_id 不是巧克力。 auto iter = messages.find(frame.can_id);
// can_id 有效,找到对象了 if (iter != messages.end()) { const dbcppp::IMessage* msg = iter->second; std::cout << "Received Message: " << msg->Name() << "\n";
// can_id 完了,又来了个 signal 啥啥啥? for (const dbcppp::ISignal& sig : msg->Signals()) {
// MusSignal ??? const dbcppp::ISignal* mux_sig = msg->MuxSignal(); if (sig.MultiplexerIndicator() != dbcppp::ISignal::EMultiplexer::MuxValue || (mux_sig && mux_sig->Decode(frame.data) == sig.MultiplexerSwitchValue())) {
// 路阳 sig.RawToPhys(sig.Decode(frame.data)) std::cout << "\t" << sig.Name() << "=" << sig.RawToPhys(sig.Decode(frame.data)) << sig.Unit() << "\n"; } } } } std::cout << std::flush; }
涉及到的元素:
输入: can_frame
dbcppp: INetwork, IMessage, ISignal

浙公网安备 33010602011771号