Hallo liebe Mikrocontroller.net Member,
Problemstellung: Ich möchte mittels eines Mikrocontrollers Daten zu
einer Platine schicken und auch empfangen. Die Kommunikation läuft über
den CAN-BUS. Mittels Can-Befehle lassen sich die Einstellungen an der
Platine vornehmen und die Platine sendet regelmäßig Informationen
zurück.
Jetzt sind die Daten pro gesendete Nachricht 8 Byte lang. Mein Problem
ist aber das z.B. Informationen nicht Byte weise Inhalten sind. Die
ersten drei Bits ist eine Information. Die nächste zwei die nächste usw.
Die Daten empfangen funktioniert schon, jedoch weiß ich nicht wie ich
die Daten sinnvoll abspeichern kann.
Jede Information möchte ich in eine Variable abspeichern. Verwende ich
dafür ein struct? Wäre das sinnvoll? Habt ihr andere Vorschläge die ich
nicht kenne?
z.B. struct Test{
unsigned int = Helligkeit; //3Bit Helligkeit
unsigned int = ProgrammStatus; // 4Bit ...
}
Test test; und hier die Variablen abspeichern?
Die Buffer sind immer in 2 Byte unterteilt aber jetzt können Nachrichten
genau über die Grenze gehen. (zwischen zwei Buffern)
Kann ich irgendwie Bit Zahlen aneinander hängen? oder nur Teile einer
binären Zahl an ein Teil einer anderen binären Zahl?
So möchte ich die Nachrichten richtig auf die Variablen selektieren.
Verwendeter Mikrocontroller dsPIC30F4011
Falls ihr Quellcode benötigt oder andere Informationen die ich vergessen
habe bitte nennen :)
Desweiteren stelle ich gerade fest, wenn ich eine Nachricht bekomme, wie
kann ich unterscheiden ob es die Nachricht mit der ID 500, 501 oder 502
war? Ich möchte die Nachrichten aus der Übertragung mit der id500 z.B.
in ein anderes struct gespeichert werden, als die Nachrichten aus der
Übertragung mit der ID 501. Wie könnte man die Nachrichten
unterscheiden?
Uwe S. schrieb: > z.B. struct Test{ > unsigned int = Helligkeit; //3Bit Helligkeit > unsigned int = ProgrammStatus; // 4Bit ... > } https://msdn.microsoft.com/de-de/library/yszfawxh.aspx > > Test test; und hier die Variablen abspeichern? > Die Buffer sind immer in 2 Byte unterteilt aber jetzt können Nachrichten > genau über die Grenze gehen. (zwischen zwei Buffern) Einfach das hi-Byte um acht Bit verschieben und zusammen mit dem lo-byte zu einem 16Bit-Wert verknoten. Und das ganze dann dem bit field zuordnen.
Hallo Uwe S. Über die Filter kann man eine "Nachrichtenbereichsbeschränkung" erreichen. In dem Fall eben ID 500, 501 oder 502. Den Identifier kann aus dem empfangsregister ausgelesen werden und so die Nachricht eindeutig zuordnen. Gruß BT
Uwe S. schrieb: > Jetzt sind die Daten pro gesendete Nachricht 8 Byte lang. Mein Problem > ist aber das z.B. Informationen nicht Byte weise Inhalten sind. Die > ersten drei Bits ist eine Information. Die nächste zwei die nächste usw. Möglicherweise wäre eine "Union" ganz praktisch.
1 | typedef union { |
2 | unsigned char bytes[8]; |
3 | struct { |
4 | unsigned erste3bits_INFO : 3; |
5 | unsigned naechste2bits_INFO : 2; |
6 | unsigned whatever : ?; |
7 | ...
|
8 | } bits; |
9 | } ID500_NACHRICHT; |
10 | |
11 | typedef union { |
12 | unsigned char bytes[8]; |
13 | struct { |
14 | ...
|
15 | } bits; |
16 | } ID501_NACHRICHT; |
17 | ...
|
Abspeichern würdest du es dann zunächst aus den CAN RX Registern
byteweise
n500.bytes[i] = CANRX[i];
Zugriff hättest du über
n500.erste5bit_INFO
(n500 wäre hier eine Variable ovm Typ ID500_NACHRICHT)
Vielen Dank die Antworten haben mir sehr weiter geholfen! :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.