Kennung | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Config Data Stream 0x21 , CAN-ID: 0x42 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Format | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beschreibung | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Überträgt den Datenstrom einer Konfigurationsdatei. Folgt unmittelbar auf das (letzte) Antwortframe der "Config Data Anforderung" oder zum Mitteilen einer Konfigurationsänderung per Broadcast. Durch die DLC wird der Inhalt unterschieden: DLC = 6: Ist das erste Paket im Datenstrom. Es definiert den Datenstrom als Antwort auf eine Config Data Anfrage. Es enthält die Dateilänge in Bytes, sowie die CRC der zu übertragenden Bytes. Bei diesem Typ des Datenstroms wird zur Kollisionsauflösung der Hash des Empfängers verwendet. DLC = 7: Ist das erste Paket im Datenstrom. Es definiert den Datenstrom als Broadcast einer Konfigänderung. Es enthält die Dateilänge in Bytes, sowie die CRC der zu übertragenden Bytes, sowie einem reservierten Byte. Der Datenstrom ist bei dieser Übertragungsform immer(?) Zlib-Komprimiert. Bei diesem Typ des Datenstroms wird zur Kollisionsauflösung der Hash des Senders verwendet. DLC = 8: Datenpaket: Es enthält immer 8 Byte an Daten. Stehen weniger Daten zur Verfügung, so wird mit 0x00 gepaddet. Wird immer ab dem 2.ten Datenpaket gesendet. Hash richtet sich nach obiger Systematik. Alle anderen DLC-Längen: Tritt im Datenstrom eine andere Länge auf, so ist der Empfang abzubrechen bzw zu beenden. Bei der Steuerung der Datenströme ist zu beachten, dass immer nur ein Datenstrom gesendet wird. Beim Senden des Datenstroms sollte eine gewisse Restbandbreite des CAN-Busses frei gelassen werden (z.B. druch Einfügen von Pausen beim Senden der Datagramme) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beispiel | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Antwort | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Besonderheiten | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die Pakete werden vom Empfänger nicht bestätigt und werden mit niedriger Prio und Bandbreite im CAN übertragen Der CRC ist ein 16-Bit-CRC mit dem Startwert 0xFFFF und dem Polynom 0x1021. Der CRC wird über alle Datenpakete des Streams berechnet. Also inclusive der im letzten Paket angehängten Nullbytes. Der Algorithmus ist wie folgt programmiert: u16 CtDataSender::updateCRC (u16 CRC_acc, u8 CRC_input) { #define POLY 0x1021 // Create the CRC "dividend" for polynomial arithmetic (binary arithmetic with no carries) CRC_acc = CRC_acc ^ (CRC_input << 8); // "Divide" the poly into the dividend using CRC XOR subtraction CRC_acc holds the // "remainder" of each divide. Only complete this division for 8 bits since input is 1 byte for (int i = 0; i < 8; i++) { // Check if the MSB is set (if MSB is 1, then the POLY can "divide" into the "dividend") if ((CRC_acc & 0x8000) == 0x8000) { // if so, shift the CRC value, and XOR "subtract" the poly CRC_acc = CRC_acc << 1; CRC_acc ^= POLY; } else { // if not, just shift the CRC value CRC_acc = CRC_acc << 1; } } // Return the final remainder (CRC value) return CRC_acc; } |