PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wandlung hex -> ASCII um über UART zu senden



jay-1982
05.08.2005, 12:27
Hallo,

ich will Daten über den UART mit Mega8 an den PC senden. Das senden und empfangen klappt wunderbar. Allerdings werden die Daten ja im hex-Format gesendet und im ASCII-Format angezeigt.
Wenn ich z.B. einen Wert der nur eine Stelle enthält (z.B. den Inhalt einer Variablen, z.B. variable=8) dann kann ich dem Wert ja einen Offset (+48) geben damit er richtig angezeigt wird.
Ein String zu senden ist ja auch kein Problem da dies ja direkt in ASCII umgewandelt und jedes Zeichen einzeln gesendet wird.

Wenn ich aber jetzt einen Wert einer Variablen senden will, z.B. variable=512, wie mache ich das?!?!?!
Die Variable besteht ja aus 2 Byte. Ein ASCII-Zeichen ja aus 1 Byte. Wie kann die 2 Byte also sozusagen auftrennen und einzeln senden, und so dass der Wert dann eben auch stimmt...

Vielleicht hatte jemand von Euch ja schon mal dasselbe Problem...
Danke.

fwallenwein
05.08.2005, 13:25
Mal ein Vorschlag. Es gibt viele Möglichkeiten das zu machen.


#include <stdlib.h>


.....

char *myString[7];

myString = itoa(variable, myString, 10);

dann solltest Du die Zahl als String in der Variable myString haben.
Die kannst Du dann ueber die serielle Schnittstelle senden.

itoa(interger Variable, string zum speichern, radix ( 2 = Binär, 16 = hex etc. )

Gruss
Frank

jay-1982
05.08.2005, 13:47
Danke für die schnelle Antwort!

Habe es ausprobiert, aber leider kommt beim compilieren die Fehlermeldung "Incompatible types in assignment"...
Habe es genau so gemacht wie Du es gepostet hast.

Die include-Datei habe ich ebenso eingebunden.

Also meine Variable hat z.B. den Wert 512 und die ist auch als integer deklariert.

Hmm... was mache ich da falsch?!?!

fwallenwein
05.08.2005, 13:59
Sorry, da habe ich wohl etwas vorschnell geschrieben.
Also -. ich habe eben folgendes probiert - un ddas ging



char myCharBuffer[20];
char *myCharPtr;
myCharPtr = myCharBuffer;
myCharPtr = itoa(min,myCharPtr,10);

Gruss
Frank

SprinterSB
05.08.2005, 14:05
Du kannst die beiden bytes auch einzeln schicken.


short s; //bit 0-15
unsigned char low; // bit 0-7
unsigned char high; // bit 8-15

// auseinanderbauen:
low = (unsigned char) (s & 0x00ff);
high = (unsigned char) (((s>>8) & 0x00ff);

//zusammen setzen
s = ((short) high << 8) | low;

Den Overhead das in ein String zu konvertieren brauchst du nicht, das geht am PC einfacher mit itoa oder sprintf.

Oder ganz ohne Überflüssigen Code mit einem Komposit:


typedef union
{
unsigned short s;
struct
{
unsigned char low;
unsigned char high;
};
} __attribute__((packed)) data_t;

data_t data;

// Zugriff über data.s, data.high und data.low

Andun
05.08.2005, 14:07
Ja. Das Problem bei deinem ersten Code beispiel war glaub ich einfach das *. Das war zuviel.

fwallenwein
05.08.2005, 14:10
Ja. Das Problem bei deinem ersten Code beispiel war glaub ich einfach das *. Das war zuviel.

So kommts wenn man schnell was schicken will.
Statt Pointer ein Pointer auf Pointer.
Nun gut - nächstes mal passe ich besser auf ! :-b

Gruss
Frank

jay-1982
05.08.2005, 14:35
Dank an Frank und den aderen!!!

Hat jetzt hingehauen :)

Vielen Dank!!!!!!!!!!!!!!!!!!!!!!!!!!!

Wenn doch nur alles so einfach wäre... :roll: :mrgreen: