Hallo, ich habe ein Gerät mit einer seriellen Schnittstelle, das man mit 4bit steuert und per 12bit Daten übergibt, man kann aber nur 8bit pro Transmission übertragen. Wie kann ich das am einfachsten trennen, sodass ich eine Methode schreiben kann, der ich einen char als Steuerbefehl und einen int mit den Datne übergeben kann`? Danke + Gruß, Konrad
Um welche Programmiersprache geht es? Wie hast du die daten vorligen, 22 uint8_t
Ich nehme mal an Du willst die 1x4 Bit und die 1x12 Bit in einen Sendepuffer schreiben, der aus lauter Bytes besteht (Array). Dann würden die 1x4 Bits und weitere 4 Bits von den 12 in einem Byte stehen, und die übrigen 8 Bits von den 12 würden in einem weiteren Byte stehen. Sowas macht man mit Bit Shifting. Gibt Tausende Beispiele dafür. http://stackoverflow.com/questions/141525/what-are-bitwise-shift-bit-shift-operators-and-how-do-they-work
Cmd 4 bit nach links schieben, und mit den obersten 4 bit des Datenwortes verodern -> 1. zu übertragendes Byte. Dann die unteren 8 bytes des Datenwortes übertragen.
1 | send(unsigned char cmd, unsigned int data) |
2 | {
|
3 | unsigned char b; |
4 | |
5 | b = (cmd << 4) | ((data >> 8) & 0x0f); |
6 | send_byte(b); |
7 | |
8 | b = data & 0xff; |
9 | send_byte(b); |
10 | } |
1. Die Daten an die richtige Stelle innerhalb eines Bytes schieben. 2. Die restlichen Bits ausmaskieren. 3. Die verschiedenen Teile miteinander verodern. Also zum Beispiel so (je nach Byte/Bit-Reihenfolge anpassen):
1 | void send(uint8_t byte); |
2 | |
3 | void send_cmd(uint8_t cmd, uint16_t data) |
4 | {
|
5 | send(((cmd << 4) & 0xF0) | ((data >> 8) & 0x0F)); |
6 | send(data & 0xFF); |
7 | }
|
Fehlt hier nicht noch die Frage wozu das ganze gut sein soll um danach alle möglichen "Lösungen" zu servieren die mit dem Problem nicht das Geringste zu tun haben?
> Fehlt hier nicht noch die Frage wozu das ganze gut sein soll
Nö. Ich würde ja noch eine union vorschlagen, die eine struct (mit
Bitfeldern drin) mit einem uint8_t[2] überlagert. Dann kann sich der
Compiler um die Bits kümmern.
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.