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?
:
Bearbeitet durch User
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)
:
Bearbeitet durch User
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.