โปรแกรมนี้เปลี่ยนไฟล์ DBC เป็นรูปแบบต่าง ๆ
ปัจจุบันไม่รองรับ CAN-FD
โปรดพิจารณาบริจาคให้กับโครงการหากคุณพบว่ามีประโยชน์ โครงการนี้ต้องการการสนับสนุนของคุณเพื่อดำเนินการต่อ หากคุณต้องการการสนับสนุนที่ได้รับเงินกรุณาติดต่อ Mailto: [email protected]
อย่างที่คุณเห็นโดยโน้ตขนาดใหญ่ด้านบนปัจจุบัน CAN-FD ไม่ได้รับการสนับสนุนและน่าจะไม่ (ชั่วขณะ) ปัญหาคือ CAN-FD อนุญาตให้มีข้อความที่มีความยาว 64 บิตและโครงการนี้และรหัสที่สร้างขึ้นจากมันทำให้สมมติฐานที่ว่า 8 บิตนั้นมีไว้เพื่อให้ข้อความสามารถมีได้
DBCC เป็นโปรแกรมสำหรับการแปลงไฟล์ DBC เป็นหลักเป็นรหัส C ที่สามารถทำให้เป็นอนุกรมและ deserialize สามารถส่งข้อความเป็นโครงสร้างที่แสดงถึงข้อความและสัญญาณเหล่านั้น นอกจากนี้ยังเป็นไปได้ที่จะพิมพ์ข้อมูลที่มีอยู่ในโครงสร้าง
ดูไฟล์ใบอนุญาตสำหรับรายละเอียดของใบอนุญาตสำหรับโปรแกรม นี้ จะถูกเผยแพร่ภายใต้ใบอนุญาต MIT การพึ่งพาหากเชื่อมโยงกับอาจมีใบอนุญาตของตัวเองและชุดของข้อ จำกัด ของตัวเองหากสร้างขึ้น
ไฟล์แหล่งที่มา MPC.C และ MPC.H มาจากตัวแยกวิเคราะห์ที่เขียนใน C เรียกว่า MPC และได้รับอนุญาตภายใต้ใบอนุญาต 3 ข้อ BSD
ในการสร้างคุณต้องการคอมไพเลอร์ C (C99) เท่านั้นและทำ (อาจเป็น GNU Make ฉันไม่ได้พยายามสนับสนุนการใช้งานอื่น ๆ ) โปรแกรม DBCC นั้นเขียนไว้ในสิ่งที่ควรเป็นพกพา C โดยมีการพึ่งพาภายนอกเพียงอย่างเดียวคือไลบรารีแพลตฟอร์ม C ของคุณ
คุณควรจะพิมพ์:
make
ในการสร้างมีการผลิตที่เรียกว่า 'DBCC' ในการทดสอบเรียกใช้การทดสอบจำเป็นต้องใช้ Xmllint
-n สามารถใช้เพื่อระบุเวอร์ชันเอาต์พุตซึ่งอาจทำให้คุณสามารถเข้าถึงพฤติกรรมก่อนหน้านี้ได้หากมีการใช้งานความเข้ากันได้ย้อนหลัง คุณสามารถระบุเวอร์ชันที่จะใช้บนบรรทัดคำสั่งด้วยตัวเลือก -n เวอร์ชันล่าสุดจะถูกใช้โดยค่าเริ่มต้น
เวอร์ชัน 1:
พฤติกรรมมรดก/ดั้งเดิม โปรดทราบว่าสิ่งนี้ยังคงไม่ให้ผลลัพธ์ที่เสถียร แต่จะมีโอกาสที่ดีกว่าที่จะไม่มีการเปลี่ยนแปลง
เวอร์ชัน 2:
เวอร์ชันล่าสุด
ชื่อ enum มีคุณสมบัติด้วยชื่อข้อความ CAN
ชื่อฟังก์ชัน ENCODE/DECODE
ตัวสร้างโค้ดสามารถสร้างรหัสเพื่อแกะข้อความ (เปลี่ยนไบต์บางส่วนเป็นโครงสร้างข้อมูล), ถอดรหัสข้อความ (ใช้ค่าต่ำสุดและชดเชยค่าต่ำสุดและค่าสูงสุดกับค่าในโครงสร้างข้อมูล) และผกผันสามารถทำได้ (แพ็ค/เข้ารหัส)
คุณสามารถดูรหัสที่สร้างขึ้นจากไฟล์ DBC ภายในโครงการเพื่อทำความเข้าใจว่าควรทำงานอย่างไร
หากคุณต้องการประมวลผลข้อความ CAN ที่คุณได้รับคุณจะต้องโทรไปที่ 'unpack_message' การสร้างรหัสเป็นผู้ไม่เชื่อเรื่องพระเจ้าตามลำดับ CPUS BYTE ใช้ค่า 'UINT64_T' ที่มีแพ็คเก็ตเดียว (พร้อมกับ CAN ID และ DLC สำหรับแพ็คเก็ตนั้น) และแกะกล่องลงในโครงสร้างที่สร้างขึ้น ไบต์แรกของแพ็กเก็ต CAN ควรใส่ในไบต์ที่สำคัญน้อยที่สุดของ 'UINT64_T'
คุณสามารถใช้ฟังก์ชั่นต่อไปนี้เพื่อแปลงเป็น/จากข้อความ CAN:
static uint64_t u64_from_can_msg(const uint8_t m[8]) {
return ((uint64_t)m[7] << 56) | ((uint64_t)m[6] << 48) | ((uint64_t)m[5] << 40) | ((uint64_t)m[4] << 32)
| ((uint64_t)m[3] << 24) | ((uint64_t)m[2] << 16) | ((uint64_t)m[1] << 8) | ((uint64_t)m[0] << 0);
}
static void u64_to_can_msg(const uint64_t u, uint8_t m[8]) {
m[7] = u >> 56;
m[6] = u >> 48;
m[5] = u >> 40;
m[4] = u >> 32;
m[3] = u >> 24;
m[2] = u >> 16;
m[1] = u >> 8;
m[0] = u >> 0;
}
ตัวสร้างโค้ดจะสร้างโครงสร้างตามชื่อไฟล์ของไฟล์ DBC ดังนั้นสำหรับตัวอย่างไฟล์ DBC 'ex1.dbc' โครงสร้างข้อมูลที่เรียกว่า 'CAN_OBJ_EX1_H_T' ถูกสร้างขึ้น โครงสร้างนี้มีโครงสร้างข้อความ CAN ทั้งหมดซึ่งจะมีสัญญาณทั้งหมด การมีข้อความ/สัญญาณทั้งหมดในโครงสร้างเดียวมีข้อดีและข้อเสียสิ่งหนึ่งที่ทำให้ง่ายขึ้นคือการกำหนดโครงสร้างข้อมูลที่จำเป็น
/* reminder of the 'unpack_message' prototype */
int unpack_message(can_obj_ex1_h_t *o, const unsigned long id, uint64_t data, uint8_t dlc);
static can_obj_ex1_h_t ex1;
uint8_t can_message_raw[8];
unsigned long id = 0;
uint8_t dlc = 0;
your_function_to_receive_a_can_message(can_message_raw, &id, &dlc);
if (unpack_message(&ex1, id, can_message_u64, dlc) < 0) {
// Error Condition; something went wrong
return -1;
}
'unpack_message' เรียกใช้ฟังก์ชัน unpack ที่ถูกต้องสำหรับ ID นั้นเป็นตัวอย่างสำหรับ ID '0x020':
case 0x020: return unpack_can_0x020_MagicCanNode1RBootloaderAddress(&o->can_0x020_MagicCanNode1RBootloaderAddress, data, dlc);
ฟังก์ชั่นแกะบรรจุวัตถุข้อความในโครงสร้าง 'CAN_OBJ_EX1_H_T' สำหรับ ID นั้น สัญญาณแต่ละตัวสามารถถอดรหัสด้วยฟังก์ชั่นที่เหมาะสมสำหรับสัญญาณนั้น ตัวอย่างเช่น:
uint16_t b = 0;
if (decode_can_0x020_MagicNode1R_BLAddy(o, &b)) {
/* error */
}
ในการส่งข้อความแต่ละสัญญาณจะต้องมีการเข้ารหัสจากนั้นฟังก์ชั่นแพ็คจะส่งคืนข้อความที่บรรจุ
บันทึกอื่น ๆ :
สำหรับข้อกำหนดตามที่ฉันเข้าใจในรูปแบบไฟล์ DBC ดู dbc.md นี่คืองานที่กำลังดำเนินการ
มีไฟล์ VIM Syntax สำหรับไฟล์ DBC ในโครงการที่เรียกว่า dbc.vim
เช่นเดียวกับ C, XML สามารถสร้างได้โครงการประกอบด้วยไฟล์ XSD และ XSLT สำหรับ XML ที่สร้างขึ้น
ไฟล์ที่ใช้ XML ที่สามารถนำเข้าสู่ Beyond Bestorm ของ Security และใช้ในการทดสอบโครงสร้างพื้นฐานบัส
สามารถสร้างไฟล์ CSV แบบแบนซึ่งง่ายต่อการนำเข้าสู่ Excel
สามารถสร้างไฟล์ JSON ได้ซึ่งเป็นสิ่งที่เด็ก ๆ ทุกคนใช้ในปัจจุบัน
ปรึกษาหน้าคู่มือสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานที่แม่นยำของโปรแกรม
มันเป็นไปได้ที่จะสร้างภาพที่ดี (ASCII Art) ที่แสดงให้เห็นว่าข้อความมีโครงสร้างอย่างไรซึ่งช่วยในการทำความเข้าใจข้อความที่เป็นปัญหาและมีประโยชน์สำหรับวัตถุประสงค์ในการจัดทำเอกสารตัวอย่างเช่น: บางสิ่งบางอย่างเช่น:
Message Name: Example-1
Message ID: 0x10, 16
DLC: 1 (8-bits)
+-----+-----.-----.-----.-----+-----.-----+-----+
| | | | |
| | | | |
+-----+-----.-----.-----.-----+-----.-----+-----+
0 1 2 3 4 5 6 7
Bit 0: Signal-Name-1, 1 bit signal, scalar 1.0, offset 0
Bits 1-2: Signal-Name-2, 4 bit signal, signed, Motorola, ...
... etcetera ...
หรือสิ่งที่คล้ายกัน นี่จะเป็นโมดูลเอาต์พุตอื่น
<style type = "text/css"> body {margin: 40px auto; max-width: 850px; line-height: 1.6; font-size: 16px; color:#444; padding: 0 10px} H1, H2, H3