Hallo Ich möchte CAN Daten Abgreifen... Nun ist das Problem das meine Information in vogender Form vorliegt 2 Signale 1.: Byte 0 Bit 0-7 + Byte 1, Bit 0-3 2.: Byte 1 Bit 4-7 + Byte 2, Bit 0-3 Siehe Bild jetzt würde ich die gerne in "einer" Variablen speichern, damit ich diese Kenne von 12 Bit umrechnen kann und gegebenfalls verändern kann. Danach soll die geänderte Gette gespeichert werden und dann gesendet werden. Bitweises vergleichen usw klappt, aber das bekomme ich von der Programmierseite nicht hin. danke
P. Ostrich schrieb: > Bitweises vergleichen usw klappt, aber das bekomme ich von der > Programmierseite nicht hin. Bitmanipulationen Ist eine Kombination aus UND Operationen, ODER Operationen und Bitweisen Schieben mittels >> bzw. << Da musst du durch. In der µC Programmierung ist das tägliches Brot. Wenn du unsicher bist, dann einfach auf dem Papier die Operation durchführen, sich beobachten was man gemacht hat und das ganze dann in Code fassen.
> Kenne > Gette Anette ? Was ist nun an byte0|((byte1&0x0F)<<4) und (byte2<<4)|(byte1<<4) so schwierig ? Vielleicht weil du nicht C sondern BASCOM programmierst ? Woher sollen wir das aus deiner dürftigen Beschreibung, aus der man selbst MSB und LBS schätzen muss, erkennen ?
Thomas Eckmann schrieb: > int nData = Byte0; > > nData += (Byte1 << 8); > > > > mfg. Jetzt mal vollständig: int nData0 = Byte0; nData0 += ((Byte1 & 0x0F)<< 8); int nData1 = ((Byte1 & 0xF0)>> 4); nData1 += (Byte2 << 8); MaWin schrieb: >> Kenne > >> Gette > Was das sein soll, würde ich auch gerne wissen mfg.
Thomas Eckmann schrieb: > int nData0 = Byte0; > nData0 += ((Byte1 & 0x0F)<< 8); da wer ich nich schlau raus. 1. schreibst du byte 0 und die var nData0 = ok 2. schaust du was in Byte1 steht (mit (Byte1 & 0x0F)) = ok 3. verschiebst du alles um 8 stellen nach links (also ist es 0000 0000) = warum? 4. addierst du nData0 mit dem Ergebnis 0000 0000 und schreibst es dann in nData0. verstehe ich das von der Programmierung her nicht? Denn so macht das keinen Sinn für mich. Sorry Aber vielen Dank für eure Mühe... P.S.: es kommt ja noch dazu, das ich die Daten aneinander hängen muss. Sprich: Byte 0 = 1212 3434 Byte 1 = 5656 7878 das muss nachher so stehen: 7878 1212 3434 denn das ergibt eine Zahl die ich brauche. Und genau anders rum muss ich das auch so mit neuen werten schreiben.
P. Ostrich schrieb: > Byte 0 = 1212 3434 > > Byte 1 = 5656 7878 Das sind ja nun niemals nicht Bytes. Ein Byte ist 8 Bit lang und hat einen Wertebereich von 0 - 255. Oder in Hex 0x00 - 0xFF. P. Ostrich schrieb: > Thomas Eckmann schrieb: > >> int nData0 = Byte0; > >> nData0 += ((Byte1 & 0x0F)<< 8); wenn du in diesen Codefetzen in Byte0 = 0x55, und in Byte1 = 0x0A schreibst, dann ist nData0 == 0xA55. Und das ist doch genau das was du haben willst. Oder nicht? mfg.
P. Ostrich schrieb: > verstehe ich das von der Programmierung her nicht? offenbar, denn ... > Denn so macht das > keinen Sinn für mich. ... für die meisten hier macht das absolut Sinn. Ganz im Gegenteil. Das ist noch nicht mal besonders schwer, wenn man seine Grundlagen zum Thema Maskieren, Bitschieben und DAtentypen gelernt hat. > 3. verschiebst du alles um 8 stellen nach links (also ist es 0000 0000) Nö ist es nicht. In C wird immer mindestens in int gerechnet. Also ist das auf Bitebene eben nicht 0000 0000, sondern die 8 Bit um 8 Bit nach oben geschoben
Hi Neop13, ich habe mir mal alle Deine Beiträge hier durchgelesen und bin mir sicher, Du solltest Dir ein anderes Hobby suchen. Sowas von blind, der Typ - solche muss man schon suchen. Also ehrlich züchte lieber Radieschen oder sowas, da haste sicher mehr Erfolg. Sorry. Aber das mußte mal gesagt werden. Hat ja schließlich keinen Sinn, eine Schnecke für einen Sprint zu trainieren. Schönen Abend noch, - Frank
P. Ostrich schrieb: > verstehe ich das von der Programmierung her nicht? Denn so macht das > > keinen Sinn für mich. > > Sorry Versuch's mal so: C-BuchKaufen(); while (!AllesVerstanden) { C-BuchLesen(); } if (ImmerNochWasUnklar) { ImForumFragen("Wie geht das jetzt genau?"); } mfg.
Thomas Eckmann schrieb: > if (ImmerNochWasUnklar) > { > ImForumFragen("Wie geht das jetzt genau?"); > } puhh.. zum Glück "unreachable"
Thomas Eckmann schrieb: > P. Ostrich schrieb: >> Byte 0 = 1212 3434 >> >> Byte 1 = 5656 7878 > > Das sind ja nun niemals nicht Bytes. Sind es nicht... komisch 12123434 = 8 Zeichen = 8 Bit = 1 Byte 1212 = 1. Nibble, 3434 = 2. Nibble --> 2 Nibble = 1 Byte P.S.: Danke für eure Kommentare. Man dachte echt hier ist ein Forum wo nicht. Solche Ego Spinner rumhängen sondern auch Platz für neulinge oder nicht so erfahrene ist. Aber das zeigt ja, das ihr als GAST eingeloggt seid. Sicher ist das ich besonders schwer, aber manchmal hängt man an einer blöde simplen stelle und kommt nicht weiter. Danke allen die mir geholfen haben
hast recht. war auch zur Verdeutlichung gedacht, amit ihr genauer seht, was ich brauche. Sorry hab ich nicht klar genug ausgedrückt
Naja, wenigstens die Überschrift ist ja passend gewählt. Aber die Programmiersprache, in der Du das umsetzen willst, hast Du uns immer noch nicht verraten. P. Ostrich schrieb: > 12123434 = 8 Zeichen = 8 Bit = 1 Byte > 1212 = 1. Nibble, 3434 = 2. Nibble --> 2 Nibble = 1 Byte Du meinst wahrscheinlich das Richtige, drückst Dich aber falsch aus. 8 Zeichen können nicht 8 Bit sein, schreib es doch so: 76543210 => 1 Byte 7654 1. Nibble, 3210 2. Nibble.
Karl heinz Buchegger schrieb: > Bitmanipulationen OT: Nur der Vollständigkeit halber - diesen Artikel gibt es nicht... du meintest vermutlich diesen: Bitmanipulation Nur falls hier jemand nochmal drüber stolpert und sich wundert, dass der o.g. Link in einen leeren Artikel führt. - gerd
ja enau. nur blöd ausgedrückt. danke Holger. Wöchte das gerne in C Programmieren. Es handelt sich hier um Daten aus eine CAN-Botschaft.
Hallo, falls C, wie wärs mit Bitfelden:
1 | union
|
2 | {
|
3 | struct
|
4 | {
|
5 | unsigned char byte1_nibble1:4; |
6 | unsigned char byte1_nibble2:4; |
7 | unsigned char byte2_nibble1:4; |
8 | unsigned char byte2_nibble2:4; |
9 | } n; |
10 | unsigned char byte1; |
11 | unsigned char byte2; |
12 | } value; |
Da kannst du wahlweise auf nibbles, wie auch auf bytes zugreifen. Alternative als
1 | typedef union { ... } t_value; |
und
1 | t_value uCAN; |
. MfG, Andreas
P. Ostrich schrieb: > P.S.: Danke für eure Kommentare. Man dachte echt hier ist ein Forum wo > nicht. Solche Ego Spinner rumhängen sondern auch Platz für neulinge oder > nicht so erfahrene ist. Aber das zeigt ja, das ihr als GAST eingeloggt > seid. > > Sicher ist das ich besonders schwer, aber manchmal hängt man an einer > blöde simplen stelle und kommt nicht weiter. Du hilfst aber uns nicht dir helfen zu können. 1. Es würde Sinn machen Deine Fragen nochmal vor dem Post durchzulesen da man manchmal nicht weiß was Du willst 2. Du hast immer noch nicht gesagt was denn jetzt >> Kenne >> Gette sein soll 3. Hast Du dir jetzt mal die Bitoperationen im oben genannten Link angesehen? 4. Von welcher Programmiersprache reden wir eigentlich? So, ich bin gespannt auf Deine Antworten
Hi U.R. Schmitt HAtte die frage nicht auf mich bezogen ... sorry P. Ostrich schrieb: > Siehe Bild > > jetzt würde ich die gerne in "einer" Variablen speichern, damit ich > diese Kenne von 12 Bit umrechnen kann und gegebenfalls verändern kann. > > Danach soll die geänderte Kette gespeichert werden und dann gesendet > werden. damit ich diese kenne und von 12 Bit umrechnen kann. "Gette" Sollte "Kette" heißen Also zur verdeutlichung: es ist so, das diese 12 Bit lange Kette für einen Wert steht. z.B. 0x1001 0100 1010 = 2378dez --> 23,78°C und die habe ich 2mal. Stehen also in 3 Byte (siehe Bild oben). Ich muss dieses Ergebnis durch eine Korrektur laufen lassen und dann in gleicher weise weiter schicken. z.B. 24,36°C = 2436 --> 0x1001 1000 0100 Aber das mit dem abgespeicherten Nibbles in Bitfeldern klingt gut... da Ist ein wenig schwierig zu erklären werde ich mal mehr zu lesen. Danke
Hey P. Ostrich, liest du Dir jemals durch, was Du hier für einen stilistischen Blödsinn postest. Ich finde es unverschämt und respektlos gegenüber denen, die sich hier bemühen Dir zu helfen (obwohl das wohl sowieso zwecklos ist). Es fehlen Buchstaben, es sind Buchstaben vertauscht, Sätz sind keine oder enden im nichts. Das ist unerträglich und sollte damit quittiert werden, dass Dir keiner mehr antwortet, bis Du Dir mehr Mühe gibst. - Frank
P. Ostrich schrieb: > Aber das mit dem abgespeicherten Nibbles in Bitfeldern klingt gut... da Na, ja Sag bloss, du hast die Funktionalität immer noch nicht hingekriegt! Das ist doch auf dem Niveau von Bitmanipulations-Anfänger-Pipifax.
Thomas Eckmann schrieb: > int nData0 = Byte0; > nData0 += ((Byte1 & 0x0F)<< 8); > > int nData1 = ((Byte1 & 0xF0)>> 4); > nData1 += (Byte2 << 8); P. Ostrich schrieb: > 3. verschiebst du alles um 8 stellen nach links (also ist es 0000 0000) > = warum? Wenn ich das so lese denke ich, dass der TO deshalb nicht dahinter kommt, weil er von einer 8 bit Variablen ausgeht (int nData0) - was sie zumindest bei einem avr-gcc nicht ist sondern halt 16 bit. Vermutlich hängt das Verständnis da? - gerd
Karl heinz Buchegger schrieb: > Sag bloss, du hast die Funktionalität immer noch nicht hingekriegt! > Das ist doch auf dem Niveau von Bitmanipulations-Anfänger-Pipifax. So dumm war die Frage jetzt auch nicht. Jeder fängt mal klein an. Und um einmal ein Bit zu maskieren eignen sich tatsächlich die bitwise- und shift Operatoren besser als Bitfelder. Aber um ein Kommunikationsprotokoll sauber zu implementieren, ist für mich eine Bitfeld-Definition der PDUs im Header-File (z.B. snmp_api.h der CMU) immer noch am einfachsten zu kommentieren und zu verstehen. Aber über Geschmack lässt sich am besten streiten, besonders wenn es um Programmierstile geht. MfG, Andreas
Frank schrieb: > Ich finde es unverschämt und respektlos gegenüber denen, die > sich hier bemühen Dir zu helfen (obwohl das wohl sowieso zwecklos ist). > Es fehlen Buchstaben, es sind Buchstaben vertauscht, Sätz sind keine > oder enden im nichts. Ok Es tut mir leid. Es liegt wohl daran. das ich es nebenbei geschrieben habe und auch ständig unterbrochen werde. Ich werde mir mehr mühe geben deutlicher zu schreiben und auch langsamer zu tippen, damit keine Rechtschreibfehler entstehen. Aber respektlos usw. ...? Ich wurde als doofer Anfänger und unfähig abgestempelt. Und ich habe nur gesagt das es mir leid tut, dass ich das nicht von Geburt an schon konnte und noch lernen muss. Ich will keinem zu nahe treten. Aber dann Antworte mir doch einfach nicht, wenn du dich angegriffen fühlst. vielleicht sollte der Thread geschlossen werden will keinen Ärger machen und haben. Entschuldigt P.S.: > Es fehlen Buchstaben, es sind Buchstaben vertauscht, Sätz sind keine > oder enden im nichts. Es heißt "Sätze". Aber passiert mal ne ;-)
P. Ostrich schrieb: > Und ich habe nur gesagt das es > > mir leid tut, dass ich das nicht von Geburt an schon konnte und noch > > lernen muss. NIEMAND hat das mit der Muttermilch aufgesaugt. Und JEDER ist schon mal bei Sachen nicht weitergekommen, wo sich alle anderen nur an den Kopf gefasst haben. Aber so ein bisschen Bitgefriemel dauert nicht eine Woche, bis man es versteht. Es sei denn es fehlen die Grundlagen. mfg.
ja haste recht. Ich sitz halt nicht ständig davor. Ist ein Projekt, was ich erstmal hinten dran hängen musste. danke
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.