CANBUS Nachrichten senden, per Seriell übermittelt, Problem mit HEX

Hallo Zusammen,

ich stehe ein wenig auf dem Schlauch...
Ich habe es "geschafft" Daten seriell an den Arduino zu senden und zu speichern.
Ich habe es "geschafft" CAN Bus Nachrichten zu versenden (MCP2515).

Nun möchte ich übermittelte Daten (Text gespeichert als String) per CAN Nachricht schicken. CAN IDs und Bytes werden ja als HEX angegeben (z.B. 0x57 für ein "W")

Wie schaffe ich nun den Text z.B. "WOLF" in 0x57 0x4F 0x4C 0x46 anzugeben.

Im loop hole ich mir den String

if (Serial.available() > 0) {
    incomingString = Serial.readString();  // per ASCII über HTerm WOLF
    }
  }

und möchte ihn in seine einzelnen Buchstaben und HEX formatiert an folgendes geben

frame.can_id = 0x048;
    frame.can_dlc = 4;
    frame.data[0] = 0x00;   // Soll "W" also 0x57 
    frame.data[1] = 0x00;   // Soll "O" etc.
    frame.data[2] = 0x00;   // Soll "L"
    frame.data[3] = 0x00;   // Soll "F"

Vielleicht könnt ihr mir eine Richtung weisen,
vielen Dank
Sven

HEX ist nur eine der vielen Darstellungen der Daten für Menschen.
Du bist also auf einem falschen Dampfer.

2 Likes

Schonmal so versucht:

frame.data[0] = incomingString[0];
frame.data[1] = incomingString[1];
frame.data[2] = incomingString[2];
frame.data[3] = incomingString[3];

Eventuell könnte man auch Zeiger übergeben. Dazu muß man aber Dein Programm und die verwendeten Bibliotheken kennen.

1 Like

Hi agmue,

wow das funktioniert :wink:
Vielen Dank!

image

Danke für Deine Rückmeldung :slightly_smiling_face:

Die Standardbibliotheken wie string.h bieten weitere Möglichkeiten, beispielsweise strncpy.

Damit @combie glücklich ist: Bei Details nutze bitte die zum von der Arduino-IDE genutzten Compiler passende Doku C++ reference.

1 Like

Mit strncpy wäre ich etwas vorsichtig, denn es arbeitet ja im Prinzip auch auf `\0'-terminierten C-Strings.

'W'
'O'
'L'
'F'
'\0'

Möglicherweise hilft es, nach Ende des Empfangs (wodurch eigentlich wird der bestimmt?) ein Null-Byte anzufügen oder die echten Zeichen mitzuzählen und dann mit memcpy zu arbeiten. Das ist dann aber immer noch C-Programmierung :slight_smile:

Das Terminierungszeichen selbst braucht höchstwahrscheinlich nicht mit auf den CAN - es kommt darauf an, wie die Empfängerseite organisiert ist und mit der Nachrichtenlänge umgeht.

1 Like

strncpy hat auch ein unschönes Verhalten (aus meinem Tutorial):

Gruß Tommy

1 Like

Vielen Dank für eure vielen Hinweise.
Ich werde mich mal näher in das Thema Strings einlesen. Die CAN Nachrichten triggern nur bestimmte Funktion in meine CarInfotainment Netzwerk auf dem Schreibtisch. Sollten zu lange oder fehlerhafte Botschaften geschickt werden ist dies daher nicht tragisch.

Unterscheide auch in Deinen Gedanken zwischen Strings (der Klasse) und strings (die mit '\0' terminierten C-Strings.
Nutze, wenn möglich, nur eine von beiden in einem Projekt.

Gruß Tommy

1 Like

Ja!
Und dazu noch std::string

Natürlich kann man das bunt mischen, wenn man den Überblick behält.
Basiert sowieso alles auf Null terminierten Strings.

1 Like

Intern ja.

Gruß Tommy

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.