Forum: Mikrocontroller und Digitale Elektronik UART: Zeichenkette übertragen


von Bernd S. (mms)


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

von 2917 (Gast)


Lesenswert?

Ja, das sollte man. Warten bis das Gesendet-flag da ist.

von Bernd S. (mms)


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

von mw1987 (Gast)


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

von Bernd S. (mms)


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

von Johannes M. (johnny-m)


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.

von Bernd S. (mms)


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

von Johannes M. (johnny-m)


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).

von Stephan (Gast)


Lesenswert?

Hallo Bernd,

du musst in der For-Schleife noch das TX-Ready Flag abfragen!
1
char  a[11] = "Hallo Welt";
2
3
for(int i=0; i<11; i++)
4
{
5
  while(!AT91F_US_TxReady(COM0));
6
  AT91F_US_PutChar (COM0,a[i]);
7
}

so zum Beispiel :-)

von Bernd S. (mms)


Lesenswert?

1
#define AT91C_PA21_RTS0     ((unsigned int) AT91C_PIO_PA21) //  Usart 0 Ready To Send

das müsste es dann sein, oder?

Bernd

von Bernd S. (mms)


Lesenswert?

ok es funktioniert...

kannst du mir noch diese eine zeile erklären:
1
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

von Bernd S. (mms)


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

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.