Forum: Mikrocontroller und Digitale Elektronik uart string empfängen bis zeichenfolge vom gsm-modem


von David (Gast)


Lesenswert?

Meine Frage ich benutze momentan den code aus dem Tutorium um einen 
String über Uart zu empfangen. Jetzt möchte ich aber von meinem 
GSM-Modem über AT befehle die "OK"'s empfangen, diese werden jedoch 
angeführt vom befehl das man gesendet hat (quasi ECHO) und zusätzlich 
noch so ein paar \r und \n hier mal ein beispiel:

ich sende den befehl: at\r
Antwort: at\r\r\nOK\r\n

das führt natürlich zum abruch des string empfanges. Wie könnte ich den 
folgenden Code ändern das er wartet bis alles vom gsm-modem empfangen 
wurde???? und ggf. nach einer gewissen zeit (ok mit einem timer/counter) 
abgebrochen wird.
1
int usart0_getc(void)
2
{
3
    while (!(UCSR0A & (1<<RXC)));   //Warten bis Zeichen verfügbar
4
    return UDR0;          //Zeichen aus UDR an Aufrufer zurückgeben
5
}
6
7
void usart0_gets(char* Buffer, int MaxLen)
8
{
9
  int NextChar;
10
  int StringLen = 0;
11
 
12
   NextChar = usart0_getc();  //Warte auf und empfange das nächste Zeichen
13
                 //Sammle solange Zeichen, bis:
14
                // * entweder das String Ende Zeichen kam
15
                // * oder das aufnehmende Array voll ist
16
  while(NextChar != '\r' && StringLen < MaxLen - 1)
17
  {
18
      *Buffer++ = NextChar;
19
    printf("%c",NextChar);
20
      StringLen++;
21
      NextChar = usart0_getc();
22
  }
23
 
24
  //Noch ein '\0' anhängen um einen Standard
25
  //C-String daraus zu machen
26
  *Buffer = '\0';
27
}

von fb (Gast)


Lesenswert?

Ich weiß nicht, ob Dei GSM-Modem das macht, aber "ATE0" sollte dieses 
Verhalten eigentlich abschalten. Jedenfalls haben die Modems früher das 
so gemacht.

lg,
Frank.

von David (Gast)


Lesenswert?

der befehl ate0 funktioniert bei meinem modem auch, jedoch sind die CR 
und LF immer noch dabei. hier ein beispiel:

sende: at\r
antwort: \r\n\OK\r\n

das erste CR würden den empfang abbrechen.

von David (Gast)


Lesenswert?

könnte man vielleicht den code so ändern das er auf ein OK wartet statt 
auf \r oder \n ???

von David (Gast)


Lesenswert?

keiner eine IDEE?!?!? :-S

von Gast (Gast)


Lesenswert?

..Du könntest den Code so ändern, dass er auf ein "OK\r\n" wartet statt 
auf '\r' oder '\n'.

HTH

von David (Gast)


Lesenswert?

1
while(NextChar != '\r' && StringLen < MaxLen - 1)

hier kann man aber nur ein zeichen eingeben

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>>> ich sende den befehl: at\r
>>> Antwort: at\r\r\nOK\r\n
Dann warte eben auf das \n... :-/
1
  while(NextChar != '\n' && StringLen < MaxLen - 1)

von David (Gast)


Lesenswert?

ja aber vor dem OK kommt schon ein \n ;-)

von holger (Gast)


Lesenswert?

>ja aber vor dem OK kommt schon ein \n ;-)

Dann hol es ab und ignoriere es.

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
Noch kein Account? Hier anmelden.