Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Write Parser Bitweise setzen #249

Open
MrFrost74 opened this issue Feb 3, 2025 · 2 comments
Open

Write Parser Bitweise setzen #249

MrFrost74 opened this issue Feb 3, 2025 · 2 comments

Comments

@MrFrost74
Copy link

MrFrost74 commented Feb 3, 2025

canbus-messages (1).json

Hallo,

Ich habe in einem Byte einer Nachricht (byte1 einer 8 Byte Nachricht) verschiedene Signale ( immer 2bit).

Das setzen der Bits von 0 auf 1 funktioniert.

Signal 1 auf bit 0&1 auf 1 setzen = 1
Signal 2 auf bit 2&3 auf 1 Setzen = 4
Signal 1 & 2 auf 1 setzen = 5

Allerdings wenn ich eines der Signal auf 0 setzen möchte funktionier das nicht, der Wert bleibt unverändert.

Write Parser für Signal 1:
buffer[1] = buffer[1] | (value &0x03);

Write parser für Signal 2:
buffer[1]= buffer[1] | (value &0x03) << 2

Im Anhang die Konfiguration der Nachricht:
Signal1 --> SystemEnable (Name in der Konfiguration)
Signal2 --> BatteryCooling (Name in der Konfiguration)

Jemand eine Idee was ich falsch mache?

@crycode-de
Copy link
Owner

Mit buffer[1] = buffer[1] | (value & 0x03) kannst du nur Bits setzen, aber nicht zurücksetzen.
Zum Zurücksetzen brauchst du dann sowas wie buffer[1] = buffer[1] & ~(value & 0x03)

Um es etwas verständlicher zu machen, hilft vielleicht das ganz mal Binär darzustellen:

Signal Binär Dezimal
1 0b00000001 1
2 0b00000100 4
1+2 0b00000101 5

Sprich du musst eigentlich nur Bit 0 und bit 2 "schalten".

Für Signal 1:

if (value) {
  buffer[1] = buffer[1] | 1; // Bit 0 setzen
} else {
  buffer[1] = buffer[1] & ~1; // Bit 0 löschen
}

Für Signal 2:

if (value) {
  buffer[1] = buffer[1] | (1<<2); // Bit 2 setzen
} else {
  buffer[1] = buffer[1] & ~(1<<2); // Bit 2 löschen
}

@crycode-de
Copy link
Owner

Nachtrag: Dafür kannst du auch sehr gut zwei Parser vom Datentyp boolean nehmen und dabei die Bitmaske dann auf Bit 0 bzw. Bit 2 setzen.

Als Beispiel:
Image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants