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
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
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
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
> 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.
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
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).
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 :-)
1 | #define AT91C_PA21_RTS0 ((unsigned int) AT91C_PIO_PA21) // Usart 0 Ready To Send
|
das müsste es dann sein, oder? Bernd
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.