Hallo,
hab ein Problem mit einem Teil meines Codes,
und zwar wird eine Interruptroutine, in die eine if-Aweisung
implementiert ist aufgerufen. Die If Anweisung soll erst dann als war
betrachtet werden, wenn ich auf der Tastatur die Entertaste Drücke.
In die If Anweisung wird jedoch nie reingesprungen.
Weiß jemand woran es liegen könnte??
ist was am Code falsch??
if(interruptflag&0x04) // Abfragen, ob Sende- oder Empfangsinterrupt
{
IEN=0; //Interrupt´s Aus
*readpointer = Receiver_Buffer_Register; // Zeichen von UART
einlesen
putchar(*readpointer); // normale Zeichen werden
ausgegeben
if (*readpointer == '\n') //<---wird nie als Wahr
Akzeptiert
{ trigger = 2;
putchar('A'); //Test Ausgabe
}
IEN=1;
printf("tr = %d ", trigger); // Test Ausgabe
putchar('B'); putchar('\n'); //Test Ausgabe
readpointer++;
}
Bist du sicher, dass für die Enter-Taste ein '\n' (LF) und nicht ein '\r' (CR) gesendet wird? Probier's einfach mal mit '\r'.
bei windows sind es sogar zwei zeichen \r\n wobei das \n das letzte von beiden ist.
bei windows sind es sogar zwei zeichen \r\n wobei das \n das letzte
von beiden ist.
aber komischer weise geht´s hier mit \r.
Gleicher Quellcode nur eine andere Interruptroutine und dort klappt es
auch mit \n, ich glaube das muß man nicht verstehen.
oder hat einer eine Idee wieso es hier klappt??
else if (interruptflag&0x02)
{
if (*writepointer == '\n') \\ <-----klappt
trigger = 1;
putchar('\n');
printf("trigger1 = %d ", trigger);
Transmitter_Holding_Register = *writepointer; // Zeichen auf UART
schreiben
writepointer++;
putchar('b'); putchar('\n');
}
info: Prgrammiere uC(c167) mit Keil und Versuche einen UART in gang zu
bringen.
Ein klassisches Terminal (z.B. ein VT100) sendet bei Drücken der
Enter-Taste einen CR, das hat mit unterschiedlichen Betriebssystemen
zunächst nichts zu tun. Deswegen machen das Terminalemulationsprogram-
me (Minicom, Hyperterm usw.) genauso. Man kann allerdings viele
Terminals bzw. Emulatoren so umkonfigurieren, dass bei Enter ein CR+LF
oder auch nur ein LF gesendet wird. Der Default ist aber ein einzelnes
CR.
Dein erstes Beispiel zeigt die Empfangsroutine, die Zeichen wahr-
scheinlich von einem Terminal empfängt. Deswegen ist es richtig, auf
CR abzufragen.
Das zweite Beispiel ist die Senderoutine. Die Zeichen stammen nicht
vom Terminal, sondern von deiner Controllersoftware, und diese
verwendet offensichtlich ein LF ('\n') am Zeilenende, wie in C üblich.
Streng genommen müsstest du am Zeilenende sowohl einen CR (setzt den
Cursor an den Anfang der aktuellen Ausgabezeile) also auch einen LF
(bewegt den Cursor eine Zeile tiefer an der gleichen Horizontalposi-
tion) ausgeben. Vielleicht tust du das ja auch. Aber auch hier können
die Terminals oft so umkonfiguriert werden, dass ein einzelner CR oder
LF wie die Kombination aus CR und LF behandelt wird.
Das ganze CR/LF-Gedöns stammt noch aus der Zeit der Fernschreiber, wo
die beiden Steuerzeichen mechanisch umgesetzt wurden. CR ist der
Wagenrücklauf, LF dreht die Papierwalze um ein Zeile weiter. Im
Elektronikzeitalter wäre es sinnvoller und weniger verwirrend, diese
beiden Zeichen durch ein einzelnes namens LE (Line End) zu ersetzen,
das sowohl bei der Eingabe, bei der Ausgabe als auch in Textdateien
verwendet wird.
In Unix/Linux/C und auf den Apple-Rechnern wird das prinzipiell auch
so gemacht, indem nur ein Zeichen (LF in Unix/Linux/C bzw. CR bei
Apple) ein Zeilenende markiert. Die Konvertierung für Ein-/Ausgabe-
geräte, die nach dem klassischen Standard arbeiten, macht das
Betriebssystem. Nur bei hardwarenaher Programmierung schlägt die
Unterscheidung zwischen CR und LF bei Ein- und Ausgabe manchmal noch
zu.
DOS/Windows verhält sich diesbezüglich noch "fernschreibermäßig", was
die Kommunikation mit Ein-/Ausgabegeräten oft etwas erleichtert. Dafür
mussten in die Standardbibliothek des aus der Unix-Welt stammenden C
Krücken eingebaut werden, um zwischen den beiden unterschiedlichen
Zeilenendedarstellungen zu konvertieren.
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.