Hallo Karl Heinz,
Danke für deinen Hinweis. Dieser hat mich auf einen anderen Denkfehler
gebracht. Ich lösche den Puffer grundsätzlich durch das Beschreiben mit
\0, bevor ich diesen verwende. Somit ist auf jeden Fall ein String
Terminator am Ende des Strings. Zusätzlich frage ich das vom GSM Modul
immer am Ende gesendete \n ab, um danach ein \0 anzuhängen.
1 |
|
2 | ISR(USART0_RX_vect)
|
3 | {
|
4 | uint8_t data;
|
5 |
|
6 | // Daten auslesen, dadurch wird das Interruptflag gelöscht
|
7 | data = UDR0;
|
8 | if (uart_rx_cnt<(uart_buffer_size-1)) // Ist Puffer nicht voll ?
|
9 | {
|
10 | // Daten in Puffer speichern
|
11 | // aber durch if() Pufferüberlauf vermeiden
|
12 | uart_rx_buffer[uart_rx_cnt]=data;
|
13 | uart_rx_cnt++; // Zähler erhöhen
|
14 | if (data=='\n')
|
15 | {
|
16 | //ja, dann String terminieren
|
17 | //uart_rx_buffer[uart_rx_cnt]="\0";
|
18 | }
|
19 | }
|
20 | }
|
Der o. g. Denkfehler war das Abfragen von \n, denn der Antwortstring vom
GSM Modul ist grundsätzlich "<CR><LF><response><CR><LF>". also habe ich
die String Terminierung in der Eingangsrouting auskommentiert.
Doch mein Problem bleibt das selbe.
Ich habe die Warte Routine umgeschrieben in eine Routine ohne
Aufrufparameter und den Wartezeitwert als Konstante festgelegt, was im
normalfall keine Rolle spielt, dann funktioniert die strstr() Funktion.
Kannst Du dir einen Reim darauf machen? Ich würde das gerne verstehen.
Ich hänge die Warteroutine mal unten hin. Vileicht siehst Du mit Deiner,
von mir sehr geschätzten Erfahrung, mein Fehler.
Auskommentiert = nicht funktionierender Programmteil
1 | uint16_t GSM_wait(void/*uint16_t z_ms*/)
|
2 | {
|
3 | /* uint16_t status;
|
4 | status=0;
|
5 | while(!(strstr(uart_rx_buffer, GSM_ret)))
|
6 | {
|
7 | if(status > z_ms)
|
8 | {
|
9 | break;
|
10 | }
|
11 | status++;
|
12 | _delay_ms(1);
|
13 | wdt_reset();
|
14 | }
|
15 | */
|
16 | temp0_16=0;
|
17 | while(!(strstr(uart_rx_buffer, GSM_ret)))
|
18 | {
|
19 | if(temp0_16 > 5000)
|
20 | {
|
21 | break;
|
22 | }
|
23 | temp0_16++;
|
24 | _delay_ms(1);
|
25 | wdt_reset();
|
26 | }
|
27 | return temp0_16;
|
28 | }
|
Vielen Dank und Gruß
rufus357