16bit int über UART versenden
Hallo!
Ich möchte folgendes realisieren, bin mir aber nichts sicher, dass das so richtig ist. Bei einer AD-Wandlung im Atmega8 hab ich ein 10bit Ergebnis, den ich per UART versenden möchte.
Die Funktion der AD-Wandlung sieht so aus:
Code:
uint16_t ReadChannel(uint8_t mux){
ADMUX=mux;
ADMUX|=(1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADSC);
while ( ADCSRA & (1<<ADSC) ) {}
//uart_putc(ADCL);
//uart_putc(ADCH);
return ADCW;
}
Das Ergebnis liegt also in der Variable result, die als 16bit int deklariert wird.
Versenden möchte ich das aus dem Hauptprogramm folgendermassen:
Code:
uint16_t result;
result=ReadChannel(3);
uart_putc((uint8_t)(result));
uart_putc((uint8_t)(result >> 8));
Ist das so richtig? Also wird hiermit zuerst das Low-Byte, dann das High-Byte versendet, oder ist das schwachsinn? Wie würdet ihr das lösen?
Danke für die Hilfe, mfg
pongi
Re: 16bit int über UART versenden
Zitat:
Zitat von pongi
Ist das so richtig? Also wird hiermit zuerst das Low-Byte, dann das High-Byte versendet, oder ist das schwachsinn? Wie würdet ihr das lösen?
Prinzipiell ist es richtig.
Es kommt aber immer drauf an, wie ein INT dargestellt ist. Es gibt Maschinen, da stehen die low-Bits im unteren Teil (little Endian) und es gibt solche, da stehen die low-Bits im oberen Teil (big Endian).
Man muss also sicherstellen, daß auf Sende- und Empfangsseite die gleiche Darstellung verwendet wird.
Zum Versenden kann man allgemeiner sowas machen:
Code:
void uart_send_buf (void*, uint8_t);
// n Bytes (max 255) ab Adresse vbuf verschicken
void uart_send_buf (void * vbuf, uint8_t nBytes)
{
uint8_t i;
uint8_t * buf = (uint8_t*) vbuf;
for (i=0; i < nBytes; i++)
{
uart_putc (*buf++);
}
}
...
{
// result als static weil es aufwändig ist,
// die Adresse einer auto-Variablen zu nehmen
static uint16_t result;
result = ReadChannel (3);
uart_putc (& result, sizeof (result));
}