PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wirres Zeug mit C bei der UART übertragung von µC zu PC



MaN
01.09.2005, 13:20
Hi,

Hab das myAVR Board.

Mit C Schaffe ich es aber einfach nicht mit dem UART umzugehen.

Mit Bascom geht das ohne Probleme.

Folgenen Code benutze ich (aus der Roboternetz wiki)



#include <inttypes.h>
#include <stdio.h>
#include <avr/io.h>

#define F_CPU 3686400
#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16)-1)

char cText[] = "Hello, world !\r\n";

//-----------------------------------------------------
void _writeChar(char c)
{
while (!(UCSRA & (1<<UDRE))) {}
UDR = c;
}
//-----------------------------------------------------
void _writeString(unsigned char *string)
{
while ( *string)
_writeChar(*string++);
}
//-----------------------------------------------------
void main()
{
UCSRB |= (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRL = (unsigned char) USART_BAUD_SELECT;
_writeString(cText);
}


im Terminal bekomm ich aber das hier: (obere 2 mit Bascom unteres mit C)

http://mitglied.lycos.de/silentshop/PC/sonstiges/Terminal-c.JPG

mit Bascom hab ich es auch so wie in der wiki gemacht.

Was mach ich denn jetzt falsch???

PicNick
01.09.2005, 13:27
Hallo, versuch mal
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)
Also mit einem "L" nach "16"
Ich muß das nochmal überprüfen, dann bessere ich das ggf. aus
Sollte das so sein, dann bitt' ich um Vergebung

MaN
01.09.2005, 13:30
ich glaubs nicht... Das war die Lösung!!! Danke!!!

Vieleicht sollte man das mal in der Wiki berichtigen.

PicNick
01.09.2005, 13:38
Nachdem du ja jetzt das Versuchs-Meerschweinchen warst, hab' ich es gleich ausgebessert. Tut mir leid ! :oops:

MaN
01.09.2005, 14:11
eine Frage noch:

Wie kann ich eine uint8 variabel in ein String umwandeln das ich sie mit de r writeString funktion senden kann?

PicNick
01.09.2005, 14:28
Du meinst beim Einlesen ?
Du kannst die Zeichen in einem Array sammeln


uint8 bChar[64]; // 64 wär der längste string
unit8 bIdx; // Index

bIdx = 0;
do {
while ( !(UCSRA & (1<<RXC)) ) {}
bChar[bIdx] = UDR;

while (!(UCSRA & (1<<UDRE))) {}
UDR = bChar[bIdx] ; // Echo

if (bChar[bIdx] == 0x0D) // bei <ENTER> aufhören
break;
bIdx++;
} while (1);
bIdx++;
bChar[bIdx] = 0x0A; // wir hängen noch ein LF an
bIdx++;
bChar[bIdx] = 0x00; // und ein \0 als ende-Kennzeichen


_writeString((unsigned char*)&bChar[0] ); // alles abschicken

}

Versuch's mal !


Ich hoff', es ist kein Hund drinnen

MaN
01.09.2005, 14:45
das kann ich sicher auch gebraucht :)

aber ich habe was anderes gemeint.

wenn ich vom Microcontroller irgend eine Variabel mit einem Wert an den PC senden will, muss der Wert doch erst in ein String umgewandelt werden, oder?

Wie geht das?

hast einmal unit8 geschrieben anstatt uint8

PicNick
01.09.2005, 14:56
Du mußt nur umwandeln, wenn am PC nur ein Terminal zu Hause ist, das eben nix anderes als strings und ein paar Steuerzeichen versteht.
In der GCC-Library gibt's eine menge funktionen, mit denen man irgendwas in strings verwandeln kann. Ich weiß die jetzt auch nicht auswendig, da muß ich immer selber nachschauen.

MaN
01.09.2005, 18:23
ok ich schaus mir mal an.

Danke nochmal für deine Hilfe

Andun
01.09.2005, 19:59
sprintf() ist das was du suchst in einer normalen C-Lib. In den extra libs für die µC gibts aber eigentlich auch noch die itoa() analog zur atoi().

Andun