Hallo zusammen,
ich weiß nicht genau wieso, aber meine Sende-Routine endet immer wieder
in einer Endlosschleife.
Ich initialisiere den UART so:
1 | UCA0CTL1 = UCSWRST + UC7BIT + UCSSEL_1;
|
2 | UCA0CTL0 = UCPEN + UCPAR; // Parity enabled, Even Parity
|
3 |
|
4 | // BRCLK Baudrate
|
5 | //---------------
|
6 | UCA0BR0 = 0x03; // 32k/2400 - 13.65
|
7 | UCA0BR1 = 0x00; //
|
8 | UCA0MCTL = 0x06; // Modulation
|
9 |
|
10 | UCA0CTL1 &=~ UCSWRST; // Initialize USART state machine
|
11 | IE2 |= UCA0RXIE; // Enable USART1 TX interrupt --> ISR bei Empfang
|
Die Sende und Empfangsroutine sieht dann so aus:
1 | #pragma vector = USCIAB0RX_VECTOR
|
2 | __interrupt void USCIAB0RX_ISR(void)
|
3 | {
|
4 | if (UCA0RXBUF == ('1'))
|
5 | {
|
6 | Uart_SendText("End");
|
7 | IE2 &= ~UCA0RXIE;
|
8 | UCA0TXBUF = 0;
|
9 | LeaveNode();
|
10 | m_Uart = FALSE;
|
11 | }
|
12 | else
|
13 | {
|
14 | // Echo received char
|
15 | while(!(IFG2&UCA0TXIFG));
|
16 | UCA0TXBUF = UCA0RXBUF;
|
17 | IFG2 = 0;
|
18 | }
|
19 | }
|
Auf gut Deutsch: Wenn eine "1" empfangen wird, wird der Empfang
eingestellt. Andernfalls soll das empfangene Zeichen einfach nur
zurückgegeben werden.
Das Resultat ist nun leider, dass der uC endlos lang sendet und ich
damit nicht wirklich was anfangen kann.
Meine Vermutung ist, dass UCA0RXBUF nicht geleert wird. Muss ich das
selber machen?
Gibt es andere schöne Routinen, die nicht in einer Endlosschleife enden?