mikrocontroller.net

Forum: Compiler & IDEs Senden von "Zahlen" über UART


Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöle!

Ich möchte Zahlen über meinen UART senden. Wie mache ich das am besten? 
Bisher ist es mir nur gelungen, char's zu senden.:

 UDR = 'x';

Ich möchte also das TCCR0-Register und diverse Überlauf-Variablen 
dezimal an mein VisualBasic-Programm schicken.

Vielen Dank

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

Bewertung
0 lesenswert
nicht lesenswert
EinSteigÄr wrote:
> Ich möchte Zahlen über meinen UART senden. Wie mache ich das am besten?

Indem du sie in ihrer Textform verschickst.
Wie man eine Zahl in ihre Textform überführt findest du
zb hier.

http://www.mikrocontroller.net/articles/FAQ#Wie_ka...


Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, habe es durchgelesen...

ich möchte wiegesagt eine Variable über den UART schicken, damit der 
wert der variablen als "dezimale" Zahl in meinem Programm erscheint.


Ich würde mich mal für diese sprintf() variante interessieren:
______________________________________________

char Buffer[20];                  //Ist das die Anzahl der Zeichen, die 
gewandelt werden müssen? also 20?

  sprintf( Buffer, "%d", i );    //steht i für die Array-Position?


Das heißt doch, dass ich eine Array mit 20 "Buchstaben" habe, und diese 
Buchstaben in dezimal wandle?!

danke

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

Bewertung
0 lesenswert
nicht lesenswert
Nein.
Das heist das du eine Zahl hast und sprintf wandelt dir
eine Zahl in einen String, einen Text um.
Aus 5436 wird der String "5436"
Und den kannst du dann als ganz normalen Text verschicken.

Der Vorteil einer Textform ist es, dass diese von jedem
Programm leicht aufgefangen werden kann (und dann eventuell
wieder in eine Zahl verwandelt wird). Aber auch jedes
Terminal, bzw. jedes Terminalprogramm kann so einen Text
unmittelbar anzeigen.

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

Bewertung
0 lesenswert
nicht lesenswert
> char Buffer[20];           //Ist das die Anzahl der Zeichen, die
> gewandelt werden müssen? also 20?

Die 20 bedeuten, dass dieses Array maximal einen String
der Länge 20 aufnehmen kann. Für eine int Zahl brauchst du
wesentlich weniger. Ein 16-Bit Integer kann ja minimal
-32768 gros sein. Dafür brauchst du daher maximal
eins, zwei, drei, ..... sechs Zeichen (inklusive Vorzeichen).
Dazu noch das obligatorische abschliessende '\0' Zeichen
für Strings und mit einem Array der Länge 7 bist du dabei.
Mehr schadet nicht: Ein String der Länge 7 kann ohne Probleme
in einem Array der Länge 10 oder 20 gespeichert werden.
(Siehe auch im gleichen Artikel etwas weiter unten den
Abschnitt über String-Verarbeitung).


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

Bewertung
0 lesenswert
nicht lesenswert
>  sprintf( Buffer, "%d", i );    //steht i für die Array-Position?

Nein.
i ist die Zahl die gewandelt werden soll.

   char Buffer[20];
   int i = 5436;

   sprintf( Buffer, "%d", i );

   // Buffer enthält jetzt den String "5436"

Du solltest dir Literatur zum Thema 'C' besorgen.
Ohne sie wirst du nicht weit kommen.


Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm könntet ihr mir dann mal so nen kleinen Codeschnipsel zukommen 
lassen?

Etwa wie diesen FALSCHEN von mir?


char Buffer[3] = {1,2,3};
for (i=0;i<3;i++)
{
char Buffer[i];

  sprintf( Buffer, "%d", i );
}



danke

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke, habs gelesen

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe jetzt folgenden Code:

#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>


void enableTx(void)
{
while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
{
}
}

/////////////////// Im Terminalprogramm wird eine Baudrate von 9600 
eingestellt

int main (void)
{

char s[7];


int y=4;
char string1[10] = {'J'};

UCSRB |= (1<<TXEN);              //Senden aktivieren
UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  //

UBRRH = 00;                      //Baudrate einstellen 9600 bei 8 MHz
UBRRL = 51;




char Buffer[20];
   int i = 5436;

   sprintf( Buffer, "%d", i );

UDR = Buffer;

   // Buffer enthält jetzt den String "5436"

}



Am VB-Programm kommt jedoch ein "L" an.

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: ich habe schon ein Buch in amazon letzten Samstag bestellt :-)

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

Bewertung
0 lesenswert
nicht lesenswert
EinSteigÄr wrote:
> char Buffer[20];
>    int i = 5436;
>
>    sprintf( Buffer, "%d", i );
>
> UDR = Buffer;

Wie soll das gehen.
Buffer ist ein String, also eine Abfolge von einzelnen Zeichen.
UDR hingegen kann nur ein einzelnes Zeichen fassen.

Du musst dir schon eine Funktion schreiben, die einen
String entgegen nimmt und den Zeichen für Zeichen
über die UART verschickt.

Dazu schreibst du dir als erstes mal eine Funktion die
ein einzelnes Zeichen korrekt verschickt!
Denn einfach so mit Zuweisen an UDR ist es ja nicht getan.
An UDR zuweisen kannst du sinnvollerweise erst dann,
wenn die UART auch bereit ist ein Zeichen entgegen zu nehmen
(Das steht aber eigentlich auch alles im AVR-gcc Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
)
int uart_putc(unsigned char c)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
  {
  }
 
  UDR = c;                      /* sende Zeichen */
  return 0;
}
 
void uart_puts (char *s)
{
  while (*s)
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
    uart_putc(*s);
    s++;
  }
}

und mit diesen Hilfsfunktionen macht man dann:

  char Buffer[20];
  int i = 5436;

  sprintf( Buffer, "%d", i );

  uart_puts( Buffer );

  

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok. vielen Dank. hat geklappt. Habe noch eine Funktion dazu geschrieben, 
die "sendet und wandelt".

Klappt super:)

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfee es klappt nicht mehr. Was habe ich gemacht dass er nichts mehr 
sendet?? Ich dreh gleich am Rad^^

danke:

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



int uart_putc(unsigned char c)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
  {
  }

  UDR = c;                      /* sende Zeichen */
  return 0;
}




void uart_puts (char *s)
{
  while (*s)
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
    uart_putc(*s);
    s++;
  }
}

int wandle(int y)
{
char Buffer[20];
  int i = y;

  sprintf( Buffer, "%d", i );

  uart_puts( Buffer );

}


/////////////////// Im Terminalprogramm wird eine Baudrate von 9600 
eingestellt

int main (void)
{



int testvar=0xFF;
int y=4;
char string1[10] = {'J'};

UCSRB |= (1<<TXEN);              //Senden aktivieren
UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  //

UBRRH = 00;                      //Baudrate einstellen 9600 bei 8 MHz
UBRRL = 51;


wandle(testvar);            //soll "0xFF" über UART schicken



}

Es kommt nichts mehr in meinem Terminal an

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe in die UART-Registernamen ein paar 1 eingefügt und das Ganze auf
einem ATmega1281 laufen lassen.  Es kommen fotlaufend 255255255255
auf dem Terminal an.

#include <stdio.h> fehlte noch.

Wie schreibt doch Cliff Lawson so schön in seiner signature auf
avrfreaks.net:

FAQ#3: 99.9% of UART errors are AVRs not being clocked right

Bist du dir sicher, dass deine 8 MHz auch stimmen?  (Und du nicht
z. B. noch den Taktteiler auf 1 MHz drin hast oder sowas.)

p.s.: Bitte benutze [ c ] ... [ /c ] Markierungen, damit deine
Programme ordentlich formatiert bleiben und nicht wild umgebrochen
werden.

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, habe es aber wieder hingekriegt. Ganz komisch....Habe das 
<stdio.h> weiterhin NICHT eingefügt, und es funktioniert so wie vorher, 
wo es auch nicht dabeistand.

danke:)

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.