www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART: Zeichenkette übertragen


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mich gerade am UART - Daten an das HyperTherminal von 
Windows zu schicken.

Dazu verwende ich die Funktion Put_Char - bei einem Zeichen ist das auch 
kein Problem, wird im HyperTherminal dargestellt; aber wenn ich versuche 
einen ganzen Text auszugeben wird immer der letzte Wert nur dargestellt, 
die anderen nicht.

  char  a[10] = "Hallo Welt";

  for(int i=0; i<2; i++)
  {
     AT91F_US_PutChar (COM0,a[i]);
  }

muss ich nach dem ersten Aufruf von PutChar eine gewisse Zeit warten, 
bis das nächste Zeichen gesendet werden kann oder liegt das problem 
woanders?

Bernd

Autor: 2917 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das sollte man. Warten bis das Gesendet-flag da ist.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, das muss ich dann noch mal suchen, welches register da genau 
verantwortlich ist - dachte mir sowas schon... vielen dank für die 
schnelle antwort.

Bernd

Autor: mw1987 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, ob du warten musst oder nicht hängt davon ab, wie die 
Putchar-Methode implementiert ist... Wenn sie eine Warteschleife intern 
enthält, dann brauchst du nix zu berücksichtigen und dein Aufruf sollte 
funktionieren. Ansonsten bist du dafür zuständig, dass die passende Zeit 
gewartet wird.

MfG
Marius

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomm halt immer das letzte zeichen im hypertherminal von der 
schleife dargestellt, die ersten zeichen nicht...

wenn ich die schleife verkürze, passiert das gleiche...

ich arbeite mit dem AT91RM9200 - wo finde ich heraus wie die PutChar 
Methode implementiert ist? Im Datenblatt hab ich dazu nichts gefunden.

Bernd

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> char  a[10] = "Hallo Welt";
Ist zwar für den speziellen Fall vermutlich unerheblich, aber "Hallo 
Welt" passt nicht in ein Array von 10 Elementen. Dafür brauchts 11.

Was die AT91F_US_PutChar-Routine macht müsste eigentlich in der 
Dokumentation zu der verwendeten Library stehen.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich verwende den Realview Compiler von Keil... in der lib zum AT91RM9200 
hab ich nur diesen Codeschnipsel gefunen

__inline void AT91F_US_PutChar (
  AT91PS_USART pUSART,
  int character )
{
    pUSART->US_THR = (character & 0x1FF);
}


Bernd

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das scheint nur eine Zuweisung zu sein. Da wird nirgends auf das Ende 
der Übertragung gewartet. Das musst Du dann selber machen (bzw. 
vermutlich eher eine andere Funktion benutzen).

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernd,

du musst in der For-Schleife noch das TX-Ready Flag abfragen!
char  a[11] = "Hallo Welt";

for(int i=0; i<11; i++)
{
  while(!AT91F_US_TxReady(COM0));
  AT91F_US_PutChar (COM0,a[i]);
}

so zum Beispiel :-)

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define AT91C_PA21_RTS0     ((unsigned int) AT91C_PIO_PA21) //  Usart 0 Ready To Send

das müsste es dann sein, oder?

Bernd

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok es funktioniert...

kannst du mir noch diese eine zeile erklären:
COM0->US_THR = (a[i] & 0xFF);

welches Register US_THR ist weiß ich ,aber die 0xFF verstehe ich nicht 
ganz. Der Offset von der Basis-Adresse ist 0x001C.

Bernd

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xFF stellt eine Maske dar, und wenn a[] = 0 ist - also das ende der 
zeichenkette erreicht worden ist, würde US_THR auch null enthalten... 
wird dann der schreibvorgang abgebrochen oder ähnliches?

Bernd

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

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster wrote:
> 0xFF stellt eine Maske dar,

Maske ist richtig.

Aber: welchen Datentyp hat denn a?

Wenn das ein char Typ ist, dann ist diese Maskierung
unnötig.
Wenn das aber ein int ist, und int mehr als 8 Bit hat,
dann sieht die Sache anders aus.

Hier geht es also darum, sicher zu stellen, dass bei der
Zuweisung immer nur ein Byte gemacht wird. Und zwar auch
dann, wenn aus dem a ein Wert wie beispielsweise 0xABCD
heraus kommt. Die Maskierung mit 0xFF lässt dann nur
das 0xCD übrig.

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.