Forum: Mikrocontroller und Digitale Elektronik aus CAN mach int mach unsigned int


von Stephan R (Gast)


Lesenswert?

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?

von Lord Z. (lordziu)


Lesenswert?

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.

von Stephan R (Gast)


Lesenswert?

was zum Geier ist uint16_t??

von Floh (Gast)


Lesenswert?

unsigned integer mit 16 bit

von HoffeEsHIlft (Gast)


Lesenswert?

UnsignedInt 16bit vielliecht... :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> was zum Geier ist uint16_t??
Ist dein Google kaputt?
http://lmgtfy.com/?q=uint16_t+definition

von Hc Z. (mizch)


Lesenswert?

> was zum Geier ist uint16_t??

Siehe <stdint.h>.  Das gehört in die Werkzeugkiste jedes ernsthaften 
µC-C-Programmierers.

von Stephan R (Gast)


Lesenswert?

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??

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stephan R (Gast)


Lesenswert?

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.

von Stephan R (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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!

von Stephan R (Gast)


Lesenswert?

Sucht sich der Compiler bei Verwendung von int auch aus, ob es 
Vorzeichen gibt oder nicht?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stephan R (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stephan R (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.