uint16 in uint8 umwandeln

Gast #5167456
Lesenswert?

Hallo,
ich möchte mir gerne werte über uart an meinem computer senden.
1
void sendUartData( unsigned char data )
2
{
3
/* Wait for empty transmit buffer */
4
while ( !( UCSR0A & (1<<UDRE0)) );
5
/* Put data into buffer, sends the data */
6
UDR0 = data;
7

8
}

Der Funktionsaufruf beinhaltet allerdings einen uint16. Hiervon wird 
allerdings nur die ersten 8bits benötigt.

z.B.
uint16_t value = 200
sendUartData(value);

egal was ich mache, auf dem Computer kommt immer nur 0 an.
Was muss ich machen, damit die 200 ankommt?

value muss uint16 sein, da vorherige rechenoperationen höhere ZAhlen 
haben.
#5167461
Lesenswert?

Lars schrieb:
> z.B.
> uint16_t value = 200
> sendUartData(value);
>
> egal was ich mache, auf dem Computer kommt immer nur 0 an.

Und sendUartData() ist genau die obige Funktion? Und bei 8-Bit-Variablen 
funktioniert alles?

> Was muss ich machen, damit die 200 ankommt?

Nichts weiter normalerweise. Poste doch bitte mal ein möglichst 
minimales, aber vollständiges Programm, das auch genau so den Fehler 
erzeugt hat. An dem, was du gepostet hast, ist kein Grund zu erkennen, 
warum es nicht gehen sollte.
Gast #5167493
Lesenswert?

Lars schrieb:
> Der Funktionsaufruf beinhaltet allerdings einen uint16. Hiervon wird
> allerdings nur die ersten 8bits benötigt.
>
> z.B.
> uint16_t value = 200
> sendUartData(value);

Falls du mit "die ersten" die obersten 8 Bit meinst, wäre doch nichts 
anderes als 0 zu erwarten. Du solltest allerdings überprüfen, ob deine 
sendUartData() Funktion überhaupt ein uint16_t als Argument erwartet. 
Sonst solltest du den zu übertragenden Wert erstmal in den richtigen Typ 
umwandeln, bevor irgendwelche dir unbekannte Default-Mechanismen 
zuschlagen.
Moderator (Firma: Titel) Persönliche Seite #5167562
Lesenswert?

Lars schrieb:
> egal was ich mache, auf dem Computer kommt immer nur 0 an.
Wie siehst du dir diese "200" bzw die "0" auf "dem Computer" an?
Mit einem Terminalprogramm?
Was kommt an, wenn du sowas machst:
sendUartData('a');

Maxim B. schrieb:
> Hier ist wohl auch Problem: die Funktion wartet auf unsigned char, und
> du willst uint16_t senden.
Das geht problemlos solange der Wert maximal 255 ist.
#5167718
Lesenswert?

Also die Funktion sendUartData erwartet ein unsigned char was beim 
AVR-GCC ein einfaches Byte = 8-Bit = uint8_t ist.

Wenn man jetzt einen größeren Datentyp übergibt, verwendet die Funktion 
nur die niederwertigsten 8 Bit und der Compiler gibt auch eine Warnung 
aus, dass die Datentypen nicht passen.

Korrekter Weise sollte man also bei einem größeren unsigned Datentyp 
vorher auf >UINT8_MAX prüfen, ggf. begrenzen und explizit casten: 
sendUartData((uint8_t)meinUint16_t);
Für die grundlegende Funktion ist das aber nicht notwendig.

Zu beachten ist vielmehr, dass wie Walter Tarpan schon sagte, 200 keinem 
standard ASCII-Zeichen entspricht und je nach verwendetem 
Terminalprogramm u.U. einfach nichts angezeigt wird.

Wenn eine Ausgabe als ASCII String erwartet wird, muss die Zahl zunächst 
in einen String umgewandelt werden, welcher dann aus mehreren Zeichen 
besteht.

Ich benutze als Terminalprogramm gerne HTerm, dies verfügt auch über 
eine Anzeige in Dezimal und Hex und kann somit die 200 auch als 200 
dezimal anzeigen. Putty und andere Terminalprogramme tun das 
normalerweise nicht.

Was passiert wenn man 'a' versucht auszugeben, erscheint dann ein a im 
Terminalfenster???

Mfg Bimbo385

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren