OK. Damit können wir dann mal die Funktion korrigieren :-)
Normalerweise würde man sich ein Flag setzen, wenn die UART eine
komplette Zeile beisammen hat. Denn so wie du das abfragst, ist das
Murks. Du willst nicht den kompletten Buffer durchgehen, ob irgendwo
(zufällig) ein OK drinnen steht. Das könnte ja auch aus dem Zusammenhang
gerissen noch von etwas ganz anderem drinnen stehen.
Daher willst du
1) dass dich die UART benachrichtigt, wenn eine (neue)Zeile beisammen
ist. Das 'OK' von vor einer halben Stunde und einer ganz anderen Anfrage
gilt nicht mehr.
2) willst du die Buchstabenfolge 'O' und 'K' nur dann akzeptieren, wenn
sie am Zeilenanfang steht. Eine "DAMPFLOK" gilt nicht.
1 | volatile uint8_t uart_haveLine;
|
2 |
|
3 | ISR(USART_RXC_vect)
|
4 | {
|
5 | static uint8_t uart_rx_cnt;
|
6 | uint8_t data;
|
7 |
|
8 | data = UDR;
|
9 |
|
10 | if (data=='\n')
|
11 | {
|
12 | uart_rx[uart_rx_cnt]=0;
|
13 | uart_rx_cnt=0;
|
14 | uart_haveLine = TRUE;
|
15 | }
|
16 | else if (uart_rx_cnt<(UART_BUFFER_SIZE-1))
|
17 | {
|
18 | uart_rx[uart_rx_cnt]=data;
|
19 | uart_rx_cnt++;
|
20 | }
|
21 | }
|
1 | ....
|
2 |
|
3 | uart_puts("AT\r\n");
|
4 |
|
5 | _delay_ms(1000);
|
6 |
|
7 | ok = 0;
|
8 | if( uart_haveLine && strcmp( uart_rx, "OK" ) == 0 )
|
9 | ok = 1;
|
10 |
|
11 | uart_haveLine = FALSE;
|
12 |
|
13 | ....
|
sicherheitshalber sollte man noch alle (möglichen) '\r' ausfiltern. Es
ist nicht ganz einheitlich, ob ein Gerät sein Zeilenende nur mit einem
'\n' alleine, oder mit der Kombination '\r\n' markiert.
1 | ISR(USART_RXC_vect)
|
2 | {
|
3 | static uint8_t uart_rx_cnt;
|
4 | uint8_t data;
|
5 |
|
6 | data = UDR;
|
7 |
|
8 | if (data == '\r' ) // wollen wir nicht haben
|
9 | return;
|
10 |
|
11 | if (data == '\n')
|
12 | {
|
13 | uart_rx[uart_rx_cnt]=0;
|
14 | uart_rx_cnt=0;
|
15 | uart_haveLine = TRUE;
|
16 | }
|
17 | else if (uart_rx_cnt<(UART_BUFFER_SIZE-1))
|
18 | {
|
19 | uart_rx[uart_rx_cnt]=data;
|
20 | uart_rx_cnt++;
|
21 | }
|
22 | }
|