Buka SAE J1939
SAE J1939 adalah protokol untuk membentuk pesan bus-bus dengan cara tertentu yang sesuai dengan kendaraan industri seperti traktor, mesin, truk dan banyak lagi.
SAE J1939 adalah protokol yang sangat mudah digunakan, tetapi ada kekurangan informasi tentang SAE J1939, karena biaya dokumen protokol, tersedia cara membentuk pesan bus-bus sesuai dengan standar protokol SAE J1939. Jadi oleh karena itu saya sedang menulis protokol SAE J1939 yang tersedia secara gratis untuk digunakan pada sistem tertanam seperti STM32, Arduino, AVR, PIC dll atau PC.
Untuk belajar membangun proyek ini, Anda harus terlebih dahulu memahami SAE J1939. Saya telah menulis proyek ini dalam bahasa C karena C adalah standar industri. Dialek bahasa C yang saya pilih adalah ANSI C (C89) dan saya tidak menggunakan alokasi memori dinamis di perpustakaan ini. Jadi itu akan bekerja dengan standar MISRA C
Dengan perpustakaan ini, Anda dapat berkomunikasi dengan katup, mesin, aktuator, mesin, perangkat keras dan semua hal lain yang cocok untuk aplikasi seluler industri yang berat. Saya telah membangun struktur dasar proyek dan saya berharap bahwa pengguna lain akan mengirim permintaan tarik kode C mereka untuk fungsi tambahan ke standar SAE J1939 karena SAE J1939 adalah standar yang sangat besar.
Mencari Perpustakaan C Canopen untuk sistem tertanam? https://github.com/danielmartensson/easy-canopen
Mencari kerangka kerja C ++ GUI yang menggunakan SAE J1939 terbuka di atas USB? https://github.com/danielmartensson/goobysoft
Mencari proyek C STM32 dengan Sae J1939 terbuka? https://github.com/danielmartensson/stm32-plc
Memulai
Hal pertama yang perlu Anda ketahui adalah membaca dokumen PDF saya sendiri tentang SAE J1939 Open di dalam folder Documentation . Pelajari struktur proyek, kalau tidak, Anda tidak akan dapat memahami SAE J1939. Setelah Anda mendapat pemahaman dasar tentang proyek, Anda dapat membangunnya. Tetap sederhana dan ikuti standar SAE J1939!
Setelah Anda memahami struktur proyek, lalu pilih Processor Choice dalam File Hardware -> Hardware.h . Di sini Anda dapat memilih misalnya STM32 , Arduino , PIC , AVR dll. Atau jika Anda ingin menjalankannya di PC terlebih dahulu, lalu pilih PROCESSOR_CHOICE 0 dan jalankan beberapa contoh. Itulah mode debugging untuk umpan balik kaleng internal.
Cara Menggunakan Proyek
- Langkah 1: Unduh repositori ini
- Langkah 2: Pergi ke
Hardware -> Hardware.h dan pilih prosesor Anda, jika tidak tersedia, silakan tulis kode untuk itu dan kirimkan saya permintaan tarik - Langkah 3: Salin folder
Src ke folder proyek Anda di dalam IDE Anda. Ganti nama Src menjadi contoh Open SAE J1939 . Itu nama yang bagus. - Langkah 4: Gunakan
Examples -> Open SAE J1939 -> Main.txt contoh sebagai kode awal awal Anda untuk proyek SAE J1939.
/*
* Main.c
*
* Created on: 16 juli 2021
* Author: Daniel Mårtensson
*/
#include <stdio.h>
/* Include Open SAE J1939 */
#include "Open_SAE_J1939/Open_SAE_J1939.h"
/* Include ISO 11783 */
#include "ISO_11783/ISO_11783-7_Application_Layer/Application_Layer.h"
void Callback_Function_Send ( uint32_t ID , uint8_t DLC , uint8_t data []) {
/* Apply your transmit layer here, e.g:
* uint32_t TxMailbox;
* static CAN_HandleTypeDef can_handler;
* This function transmit ID, DLC and data[] as the CAN-message.
* HardWareLayerCAN_TX(&can_handler, ID, DLC, data, &TxMailbox);
*
* You can use TCP/IP, USB, CAN etc. as hardware layers for SAE J1939
*/
}
void Callback_Function_Read ( uint32_t * ID , uint8_t data [], bool * is_new_data ) {
/* Apply your receive layer here, e.g:
* CAN_RxHeaderTypeDef rxHeader = {0};
* static CAN_HandleTypeDef can_handler;
* This function read CAN RX and give the data to ID and data[] as the CAN-message.
* if (HardWareLayerCAN_RX(can_handler, &rxHeader, ID, data) == STATUS_OK){
* *is_new_data = true;
* }
*
* You can use TCP/IP, USB, CAN etc. as hardware layers for SAE J1939
*/
}
/* This function reads the CAN traffic */
void Callback_Function_Traffic ( uint32_t ID , uint8_t DLC , uint8_t data [], bool is_TX ) {
/* Print if it is TX or RX */
printf ( "%st" , is_TX ? "TX" : "RX" );
/* Print ID as hex */
printf ( "%08Xt" , ID );
/* Print the data */
uint8_t i ;
for ( i = 0U ; i < DLC ; i ++ ) {
printf ( "%Xt" , data [ i ]);
}
/* Print the non-data */
for ( i = DLC ; i < 8U ; i ++ ) {
printf ( "%Xt" , 0U );
}
/* New line */
printf ( "n" );
}
/* Apply your delay here */
void Callback_Function_Delay ( uint8_t delay ){
/* Place your hardware delay here e.g HAL_Delay(delay); for STM32 */
}
int main () {
/* Create our J1939 structure */
J1939 j1939 = { 0 };
/*
* Callbacks can be used if you want to pass a specific CAN-function into the hardware layer.
* All you need to do is to enable INTERNAL_CALLLBACK inside hardware.h
* If you don't want to have the traffic callback, just set the argument as NULL.
* If you don't want any callback at all, you can write your own hardware layer by selecting a specific processor choice at hardware.h
*/
CAN_Set_Callback_Functions ( Callback_Function_Send , Callback_Function_Read , Callback_Function_Traffic , Callback_Function_Delay );
/* Load your ECU information */
Open_SAE_J1939_Startup_ECU ( & j1939 );
/* SAE J1939 process */
bool run = true;
while ( run ) {
/* Read incoming messages */
Open_SAE_J1939_Listen_For_Messages ( & j1939 );
/* Your application code here */
}
/* Save your ECU information */
Open_SAE_J1939_Closedown_ECU ( & j1939 );
return 0 ;
} Lihat contoh dalam Examples -> SAE J1939 Cara Mengubah Alamat, Nama atau Identifikasi untuk ECU Anda.
Struktur proyek
Contoh kerja bagaimana struktur Sae J1939 terbuka selesai
Bagan aliran ini dalam kode bagaimana Open Sae J1939 Library berfungsi. Contoh ini menunjukkan cara mengirim permintaan dan mendapatkan jawaban.
- Langkah 1:
ECU X akan mengirim PGN ke ECU Y . Menafsirkan PGN sebagai kode fungsi. | Enum_j1939_status_codes SAE_J1939_SEND_REQUEST_ECU_IENDIFIKASI ( J1939 * J1939 , UInt8_t da ) { |
| return SAE_J1939_SEND_REQUEST ( J1939 , DA , PGN_ECU_IENDIFIKASI ); |
| } |
- Langkah 2:
ECU Y akan membaca pesan PGN itu dari ECU X | bool is_new_message = can_read_message ( & id , data ); |
| if ( is_new_message ) { |
| / * Simpan terbaru */ |
| J1939 -> id = id ; |
| memcpy ( J1939 -> data , data , 8 ); |
| J1939 -> id_and_data_is_updated = true; |
| |
| uint8_t id0 = id >> 24 ; |
| uint8_t id1 = id >> 16 ; |
| uint8_t da = id >> 8 ; /* Alamat tujuan yang merupakan ECU ini. jika da = 0xff = disiarkan ke semua ECU. Terkadang DA bisa menjadi nomor ID juga */ |
| uint8_t sa = id ; / * Alamat Sumber ECU yang kami dapatkan dari */ |
| |
| / * Baca permintaan dari ECU lain */ |
| if ( id0 == 0x18 && id1 == 0xea && ( da == j1939 -> Information_this_ecu . this_ecu_address || da == 0xff )) { |
| SAE_J1939_READ_REQUEST ( J1939 , SA , data ); |
- Langkah 3: Kode fungsi
PGN akan ditafsirkan oleh ECU Y . | void SAE_J1939_READ_REQUEST ( J1939 * J1939 , UINT8_T SA , data UInt8_t []) { |
| uint32_t pGN = ( data [ 2 ] << 16 ) | ( Data [ 1 ] << 8 ) | data [ 0 ]; |
| if ( pGN == pGN_AcknowledGement ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); |
| } lain jika ( pGN == pGN_Address_Claimed ) { |
| SAE_J1939_RESPONSE_REQUEST_ADDRESS_CLAIMED ( J1939 ); |
| } lain jika ( pGN == pGN_Commanded_address ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); |
| } lain jika ( pGN == pGN_Address_delete ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); / * Bukan Sae J1939 Standar */ |
| } lain jika ( pGN == pGN_DM1 ) { |
| SAE_J1939_RESPONSE_REQUEST_DM1 ( J1939 , SA ); |
| } lain jika ( pGN == pGN_DM2 ) { |
| SAE_J1939_RESPONSE_REQUEST_DM2 ( J1939 , SA ); |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); |
| } lain jika ( pGN == pGN_DM3 ) { |
| SAE_J1939_RESPONSE_REQUEST_DM3 ( J1939 , SA ); |
| } lain jika ( pGN == pGN_Request ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); |
| } lain jika ( pGN == pGN_TP_CM ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); |
| } lain jika ( pGN == pGN_TP_DT ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_ACKNEWLEDGEMENT_PGN_SUPPORTED , Group_Function_value_normal , pgn ); |
| } lain jika ( pGN > = pGN_AUXILIARY_VALVE_estimated_flow_0 && PGN <= pGN_AUXILIARY_VALVE_ESTIMATED_FLOW_15 ) { |
| Iso_11783_response_request_auxiliary_valve_estimated_flow ( J1939 , PGN & 0xf ); / * PGN & 0xf = valve_number */ |
| } lain jika ( pGN == pGN_General_purpose_valve_estimated_flow ) { |
| Iso_11783_response_request_general_purpose_valve_estimated_flow ( J1939 , SA ); |
| } lain jika ( pGN > = pGN_AUXILIARY_VALVE_Measured_position_0 && PGN <= pGN_AUXILIARY_VALVE_Measured_position_15 ) { |
| Iso_11783_response_request_auxiliary_valve_measured_position ( J1939 , PGN & 0xf ); / * PGN & 0xf = valve_number */ |
| } else if ( pgn == pGN_Software_Identification ) { |
| SAE_J1939_RESPONSE_REQUEST_SOFTWARE_IENDIFIKASI ( J1939 , SA ); |
| } else if ( pgn == pGN_ECU_Identifikasi ) { |
| SAE_J1939_RESPONSE_REQUEST_ECU_IENDIFIKASI ( J1939 , SA ); |
- Langkah 4: Kode fungsi
PGN sekarang ditafsirkan sebagai ECU Identification oleh ECU Y . Kemudian ECU Y akan menyiarkan ECU Identification ke semua ECUs .- Langkah 4.1.1: Untuk 1 pesan paket,
ECU Y akan menyiarkan ECU Identification . | Enum_j1939_status_codes SAE_J1939_RESPONSE_REQUEST_ECU_ENTIKASI ( J1939 * J1939 , UInt8_t da ) { |
| / * Temukan panjang bidang array */ |
| uint8_t length_of_each_field = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . length_of_each_field ; |
| if ( length_of_each_field < 2 ) { |
| / * Jika setiap bidang memiliki panjang 1, maka kita dapat mengirim identifikasi ECU karena itu adalah pesan normal */ |
| uint32_t id = ( 0x18fdc5 << 8 ) | J1939 -> Information_this_ecu . this_ecu_address ; |
| data uint8_t [ 8 ]; |
| Data [ 0 ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_part_number [ 0 ]; |
| Data [ 1 ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_serial_number [ 0 ]; |
| Data [ 2 ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_location [ 0 ]; |
| Data [ 3 ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_type [ 0 ]; |
| data [ 4 ] = 0xff ; /* Disimpan */ |
| data [ 5 ] = 0xff ; /* Disimpan */ |
| data [ 6 ] = 0xff ; /* Disimpan */ |
| data [ 7 ] = 0xff ; /* Disimpan */ |
| return can_send_message ( id , data ); |
| } kalau tidak { |
- Langkah 4.1.2:
ECU X Baca respons dari ECU Y karena ECU Identification disiarkan. | } else if ( id0 == 0x18 && id1 == 0xfd && da == 0xc5 ) { |
| SAE_J1939_READ_RESPONSE_REQUEST_ECU_IENDIFIKASI ( J1939 , SA , data ); |
- Langkah 4.2.1: Untuk pesan multi paket, byte kontrol dapat menjadi BAM atau RTS. BAM hanya digunakan jika Anda mengirim ke semua alamat
ECUs EG 0xFF = 255 . Tetapi jika byte kontrol adalah RTS, misalnya alamat bukan 0xFF , maka ECU Y akan mengirim RTS dan mendengarkan respons CTS oleh ECU X RTS adalah pertanyaan untuk "Beri tahu saya kapan saya bisa mengirimkan pesan?" Dan CTS adalah respons Now you can transmit the message to me . | J1939 -> this_ecu_tp_cm . Total_message_size = 0 ; |
| uint8_t i ; |
| untuk ( i = 0 ; i < length_of_each_field ; i ++ ) { |
| J1939 -> this_ecu_tp_dt . Data [ i ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_part_number [ i ]; |
| J1939 -> this_ecu_tp_dt . Data [ length_of_each_field + i ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_serial_number [ i ]; |
| J1939 -> this_ecu_tp_dt . Data [ length_of_each_field * 2 + i ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_location [ i ]; |
| J1939 -> this_ecu_tp_dt . Data [ length_of_each_field * 3 + i ] = J1939 -> Information_this_ecu . This_Identification . ECU_Identifikasi . ecu_type [ i ]; |
| J1939 -> this_ecu_tp_cm . Total_message_size += 4 ; |
| } |
| |
| / * Kirim tp cm */ |
| J1939 -> this_ecu_tp_cm . number_of_packages = J1939 -> this_ecu_tp_cm . Total_message_size % 8 > 0 ? J1939 -> this_ecu_tp_cm . Total_message_size / 8 + 1 : J1939 -> this_ecu_tp_cm . total_message_size / 8 ; / * Pembulatan */ |
| J1939 -> this_ecu_tp_cm . PGN_OF_THE_PACKETED_MESSAGE = PGN_ECU_IENDIFIKASI ; |
| J1939 -> this_ecu_tp_cm . control_byte = da == 0xff ? Control_byte_tp_cm_bam : control_byte_tp_cm_rts ; / * Jika disiarkan, maka gunakan byte kontrol bam */ |
| Status enum_j1939_status_codes = SAE_J1939_SEND_TRANSPORT_PROTOCOL_Connection_management ( J1939 , DA ); |
- Langkah 4.2.2: Jika
ECU Y mengirim RTS, maka ECU X akan membaca RTS dan respons dengan CTS kembali ke ECU Y | if ( j1939 -> from_other_ecu_tp_cm . control_byte == control_byte_tp_cm_rts ) { |
| J1939 -> this_ecu_tp_cm = j1939 -> from_other_ecu_tp_cm ; / * Salin - Kita perlu memiliki data yang sama */ |
| J1939 -> this_ecu_tp_cm . control_byte = control_byte_tp_cm_cts ; / * Kita hanya perlu mengubah byte kontrol dari RT ke CTS */ |
| SAE_J1939_SEND_TRANSPORT_PROTOCOL_Connection_management ( J1939 , SA ); |
| } |
- Langkah 4.2.3: Setelah
ECU Y telah menerima CTS, maka ia akan mengirimkan data, dalam hal ini ECU Identification , kembali ke ECU X | if ( j1939 -> from_other_ecu_tp_cm . control_byte == control_byte_tp_cm_cts ) { |
| SAE_J1939_SEND_TRANSPORT_PROTOCOL_DATA_TRANSFER ( J1939 , SA ); |
| } |
- Langkah 4.2.3: Setelah
ECU Y mengirim paket demi paket ... | Enum_j1939_status_codes sae_j1939_send_transport_protocol_data_transfer ( J1939 * j1939 , uint8_t da ) { |
| uint32_t id = ( 0x1ceb << 16 ) | ( Da << 8 ) | J1939 -> Information_this_ecu . this_ecu_address ; |
| uint8_t i , j , paket [ 8 ]; |
| uint16_t bytes_sent = 0 ; |
| Status enum_j1939_status_codes = status_send_ok ; |
| untuk ( i = 1 ; i <= j1939 -> this_ecu_tp_cm . number_of_packages ; i ++ ) { |
| paket [ 0 ] = i ; / * Jumlah paket */ |
| untuk ( j = 0 ; j < 7 ; j ++ ) { |
| if ( bytes_sent < j1939 -> this_ecu_tp_cm . total_message_size ) { |
| Paket [ j + 1 ] = J1939 -> this_ecu_tp_dt . data [ bytes_sent ++ ]; / * Data yang telah kami kumpulkan */ |
| } kalau tidak { |
| paket [ j + 1 ] = 0xff ; /* Disimpan */ |
| } |
| } |
| status = can_send_message ( id , paket ); |
| Can_delay ( 100 ); / * Penting dapat menunda sesuai dengan standar */ |
| if ( status ! = status_send_ok ) { |
| status pengembalian ; |
| } |
| } |
| status pengembalian ; |
| } |
- Langkah 4.2.4: Kemudian
ECU X menerima setiap paket dan membangun pesan dengan mengetahui kode fungsi PNG . | void sae_j1939_read_transport_protocol_data_transfer ( J1939 * j1939 , uint8_t sa , data uint8_t []) { |
| / * Simpan data urutan */ |
| J1939 -> from_other_ecu_tp_dt . sequence_number = data [ 0 ]; |
| J1939 -> from_other_ecu_tp_dt . from_ecu_address = SA ; |
| uint8_t i , j , index = data [ 0 ] - 1 ; |
| untuk ( i = 1 ; i < 8 ; i ++ ) { |
| J1939 -> from_other_ecu_tp_dt . data [ indeks * 7 + i - 1 ] = data [ i ]; / * Untuk setiap paket, kami mengirim 7 byte data di mana data byte pertama [0] adalah nomor urutan */ |
| } |
| / * Periksa apakah kami telah menyelesaikan pesan kami - return = tidak selesai */ |
| if ( j1939 -> from_other_ecu_tp_cm . number_of_packages ! = J1939 -> from_other_ecu_tp_dt . Sequence_number || j1939 -> from_other_ecu_tp_cm . Number_of_packages == 0 ) { |
| kembali ; |
| } |
| |
| / * Pesan kami selesai - bangun dan sebut saja selesai_data [total_message_size] */ |
| uint32_t pGN = J1939 -> from_other_ecu_tp_cm . PGN_OF_THE_PACKETED_MESSAGE ; |
| uint16_t total_message_size = j1939 -> from_other_ecu_tp_cm . total_message_size ; |
| uint8_t complete_data [ max_tp_dt ]; |
| uint16_t incerted_bytes = 0 ; |
| untuk ( i = 0 ; i < j1939 -> from_other_ecu_tp_dt . Sequence_number ; i ++ ) { |
| untuk ( j = 0 ; j < 7 ; j ++ ) { |
| if ( Inserted_bytes < total_message_size ) { |
| complete_data [ Inserted_bytes ++ ] = J1939 -> from_other_ecu_tp_dt . data [ i * 7 + j ]; |
| } |
| } |
| } |
| |
| / * Kirim akhir pesan ack kembali */ |
| if ( j1939 -> from_other_ecu_tp_cm . control_byte == control_byte_tp_cm_rts ) { |
| SAE_J1939_SEND_ACKNEWLEDGEMENT ( J1939 , SA , CONTROL_BYTE_TP_CM_ENDOFMSGACK , Group_function_value_normal , pgn ); |
| } |
Dan akhirnya menerapkan pesan. | case PGN_ECU_Identification : |
| SAE_J1939_READ_RESPONSE_REQUEST_ECU_IENDIFIKASI ( J1939 , SA , LEBIH_DATA ); |
| merusak ; |
Fungsionalitas SAE J1939
- Sae J1939: 21 Lapisan Transportasi
- Pengakuan
- Meminta
- Manajemen Koneksi Protokol Transport dengan BAM, CTS, RTS dan EOM
- Transfer Data Protokol Transportasi
- SAE J1939: 71 Lapisan Aplikasi
- Meminta identifikasi komponen
- Minta Identifikasi ECU
- Meminta identifikasi perangkat lunak
- Meminta hak milik a
- Meminta hak milik b
- SAE J1939: 73 Lapisan Diagnostik
- DM1
- DM2
- DM3
- DM14
- DM15
- DM16
- SAE J1939: 81 Lapisan Manajemen Jaringan
- Alamat diklaim
- Alamat diperintahkan
- Alamat tidak diklaim
- Hapus alamat
Fungsi tambahan
- ISO 11783 Traktor dan Mesin untuk Pertanian dan Kehutanan
- ISO 11783-7 Menerapkan Lapisan Aplikasi Pesan
- Perintah katup bantu
- Aliran perkiraan katup tambahan
- Posisi terukur katup tambahan
- Perintah Katup Tujuan Umum
- Aliran Perkiraan Katup Tujuan Umum
Pertanyaan dan jawaban
- T: Dapatkah perpustakaan ini digunakan dengan
C++ ?- A: Ya itu bisa digunakan dengan
C++
- T: Saya ingin membangun di perpustakaan ini, apa yang harus saya lakukan?
- A: Pertama Anda perlu tahu
ANSI C (C89) dan operasi Bitwise. Maka Anda perlu memahami struktur SAE J1939:21 Transport Layer . Jangan lupa untuk memperbarui PDF dengan fungsionalitas baru Anda.
- T: Dapatkah saya menggunakan ini di Arduino saya?
- A: Ya, kode
C ini adalah 100% kode C murni dan hanya menggunakan perpustakaan standar C dan juga kode tidak memperhitungkan perangkat keras apa yang Anda gunakan.
- T: Apakah saya perlu menginstal perpustakaan untuk menggunakan perpustakaan?
- A: Tidak, cukup salin file
.c dan .h ke proyek Anda dan kompilasi. Saya telah menggunakan ini dengan kerangka kerja QT.
- T: Proyek ini sudah cukup tua sekarang dan bukan pembaruan, apakah masih layak untuk digunakan?
- A: Ya, perpustakaan ini hanya memperbarui ketika saya atau lainnya mencakup lebih banyak fungsi dari SAE J1939. Alasan mengapa saya menulis ini di
ANSI C (C89) adalah karena ini adalah standar industri dan Anda akan selalu dapat mengkompilasi perpustakaan ini dan menggunakannya di semua sistem.
- T: Apa rencana Anda dengan perpustakaan?
- A: Untuk membuat SAE J1939 tersedia untuk semua orang
- T: Saya tidak punya bus CAN, tetapi dapatkah saya menggunakan perpustakaan ini dengan UART, USB, WiFi dll?
- A: Ya. Ini hanya cara untuk membentuk pesan dengan cara tertentu.
- T: Dapatkah saya mengirim data dengan perpustakaan ini, bahkan jika saya tidak memiliki can-bus?
- A: Ya. Ada sesuatu yang disebut permintaan pengiriman DM14, respons status DM15 dan transfer biner DM16. Gunakan itu jika Anda ingin mentransfer data dengan cara industri.
- T: Dapatkah saya mengirim pesan multi paket dari beberapa ECU ke satu ECU secara bersamaan?
- A: Tidak. Jika Anda mulai mengirim multipackage dari beberapa ECU ke ECU lain, maka ECU itu tidak dapat memahami pesannya. Kirimkan hanya pesan multipackage satu pada saat itu jika alamat tujuannya sama.
- T: Saya tidak ingin menggunakan
ANSI C (C89) dengan Open SAE J1939. Dapatkah saya menggunakan standar C terbaru dengan Sae J1939 terbuka?- Ya, Anda dapat menggunakan standar C terbaru dengan perpustakaan ini.
- T: Apakah mungkin untuk mengkompilasi pustaka ini ke mesin Windows MS-DOS atau Windows 95?
- Kompiler yang kompatibel dengan C89 dan sebuah IDE dan seharusnya tidak menjadi masalah
- T: Dapatkah saya menyesuaikan memori yang ditempati oleh program?
- A: Ya, Anda dapat menyesuaikan DECINES
MAX_PROPRIETARY_A , MAX_PROPRIETARY_B dan MAX_PROPRIETARY_B_PGNS di file Structs.h sesuai dengan kasus penggunaan Anda. Nilai default 'waras' disediakan, tetapi Anda dapat mengaturnya seminimal mungkin jika dukungan PGN milik tidak diperlukan atau meningkatkannya jika lebih banyak PGN perlu digunakan.
Masalah dan jawaban
- I: Saya tidak dapat mengkompilasi perpustakaan ini. Saya menggunakan
Keil Microvision .- A:
Keil Microvision tidak dapat menangani angka biner seperti 0b010101 . Coba STM32CubeIDE sebagai gantinya karena Open SAE J1939 dibuat di STM32CubeIDE
- I: Dapatkah Anda memberi kami beberapa contoh perangkat keras misalnya
STM32 ?- A: Ya! Ada contoh STM32 cara mendapatkan koneksi dengan bus CAN termasuk pendengar interupsi untuk pesan. Buka
Examples -> Hardware di Look for CAN_STM32.txt . Juga ada contoh USB juga untuk QT C++ .