www.mikrocontroller.net

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


Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs mit:

uint16_t val = Byte[4] << 8;
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.

Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was zum Geier ist uint16_t??

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned integer mit 16 bit

Autor: HoffeEsHIlft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UnsignedInt 16bit vielliecht... :-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> was zum Geier ist uint16_t??

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

Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stephan R (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.