Hallo Gemeinde! Ich stehe (mangels Debugger) vor folgender Aufgabe: Aus einem CANBusstrom werden zwei Bytes (5 und 4) herausgefischt, die zusammen eine Variable mit Werten 0 bis 65535 füllen sollen. unsigned int Get_Rudder(void) char Data[8]; unsigned int Rudder_Received; Rudder_received = Data[5]; Rudder_received = rudderangle << 8; Rudder_received = Data[4]; Frage: kann ich nun diese mit z.B. 34 beschriebene Variable an eine int übergeben ohne dass sich Tumult unter den Nullen breit macht?
Wie wärs mit:
1 | uint16_t val = Byte[4] << 8; |
2 | val |= Byte[5]; |
Was dein Code da oben macht ist mir im Moment schleierhaft. /edit: Wenn der CAN-Bus die Werte als ASCII-Zeichen schickt, muss du natürlich vorher noch die Umwandlung von ASCII zu Wert machen.
> was zum Geier ist uint16_t??
Siehe <stdint.h>. Das gehört in die Werkzeugkiste jedes ernsthaften
µC-C-Programmierers.
GEILE SCHEISSE!! Hast Du das grad extra für mich programmiert? Freu! Ich komme meinem Problem gerade näher.... wenn ich eine unsigned int in eine int schiebe.... was muss ich beachten? Irgendein Bit ist doch für +/- zuständig, also kanns beim heiteren Nullenschieben doch knallen oder??
Hc Zimmerer schrieb: >> was zum Geier ist uint16_t?? > > Siehe <stdint.h>. Das gehört in die Werkzeugkiste jedes ernsthaften > µC-C-Programmierers. @TO Was jedoch nicht heineingehört > char Data[8]; > unsigned int Rudder_Received; > > Rudder_received = Data[5]; > Rudder_received = rudderangle << 8; ist ein 'char' als Datentyp für ein Byte. Das kann, je nach Compiler bzw. dessen Einstellungen, massig ins Auge gehen.
Hc Zimmerer schrieb: > Das gehört in die Werkzeugkiste jedes ernsthaften > > µC-C-Programmierers. Da zähle ich mich noch nicht zu. Wobei es schön wäre. Ich komme aus der Bascom Welt und mache erste Gehversuche.
Karl heinz Buchegger schrieb: > ist ein 'char' als Datentyp für ein Byte. > > Das kann, je nach Compiler bzw. dessen Einstellungen, massig ins Auge > > gehen Jetzt verstehe ich, warum die Vorlagen meiner Kollegen kein einziges char beinhalten. Noch funzt´s mit char, aber wenn mein Text ins Reine geschrieben wird, werden die sicherlich auch ersetzt...
Stephan R schrieb: > GEILE SCHEISSE!! > Hast Du das grad extra für mich programmiert? Freu! Die Frage kommt jede Woche ungefähr 300 mal vor. > Ich komme meinem Problem gerade näher.... wenn ich eine unsigned int in > eine int schiebe.... was muss ich beachten? Kann es sein, dass du dir erst mal deinen Kernighan&Ritchie 'Programmieren in C' schnappen solltest, und ein paar Stunden mit Lesen und Übungen auf dem PC verbringen solltest?
Stephan R schrieb: > Jetzt verstehe ich, warum die Vorlagen meiner Kollegen kein einziges > char beinhalten. Noch funzt´s mit char Du willst an dieser Stelle keinen char haben. Halte dich an diese Regel, und du hast weniger Probleme Es gibt in C 3 Datentypen für kleine Integer signed char Für alles im Wertebereich -127 bis +128 unsigned char Für alles im Wertebereich 0 bis 255 char Der Compiler sucht sich aus, ob char ein Vorzeichen hat oder nicht. Praktisch gebrauchen kann man diesen Datentyp nur für Dinge, in denen es tatsächlich um Zeichen im Sinne von Textverarbeitung geht. Sobald es darum geht, einen Datentyp zu haben, der dem Prinzip nach eigentlich einen kleinen Integer aufnehmen soll, ist char zu meiden wie der Teufel das Weihwasser. > aber wenn mein Text ins Reine > geschrieben wird, falsch. Gleich richtig machen!
Sucht sich der Compiler bei Verwendung von int auch aus, ob es Vorzeichen gibt oder nicht?
Stephan R schrieb: > Sucht sich der Compiler bei Verwendung von int auch aus, ob es > Vorzeichen gibt oder nicht? Nein. int ist die 'Kurzschreibweise' für "signed int" Jetzt aber husch, husch in die nächste Buchhandlung und einen K&R ordern.
Geht auch "C in 21 Tagen"? Den hab ich da... Da ein signed int nur bis 32.768 reicht, heißt das also, dass meine zwei ankommenden Bytes in ein unsigned speichern muss, richtig?
Stephan R schrieb: > Geht auch "C in 21 Tagen"? > Den hab ich da... Besser als nichts. > Da ein signed int nur bis 32.768 reicht, Genau genommen (bei 16 Bit int) von -32767 bis +32768 > heißt das also, dass meine zwei > ankommenden Bytes in ein unsigned speichern muss, richtig? Das hat damit erst mal nichts zu tun :-) sowohl ein signed int als auch ein unsigned int beanspruchen 2 Byte. Wichtig ist: Was ist der Wert konzeptionell? Hat der konzeptionell ein Vorzeichen oder hat er es nicht? Das kannst aber nur du wissen, weil nur du weißt wo die Bytes herkommen und was die dadurch dargestellte Zahl repräsentiert.
Okay. Er hat kein Vorzeichen. Bissel unschön (nicht von mir) steht 0xFFFF für einen Winkel von 360°. Dieser ist die gewünschte Größe, die weiterverarbeitet werden soll.
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.