Forum: Mikrocontroller und Digitale Elektronik Anruferkennung Handy-USART?


von Egon M. (kpc)


Lesenswert?

Hallo

Ich würde gern einen ankommenden Anruf am Handy erkennen und darauf 
reagieren.

1.) Handy und ATmega16 sind seriell miteinander verbunden und das 
Programm wartet auf ein "R" ("R", weil das Handy RING RING ...) an 
Hyperterminal sendet. Leider kommt am AVR kein "R" an.

2.) Ich wurde gern aus dem Programm eine Nummer an das Handy schicken, 
damit es wählt. Also schicke ich per USART atd0721xxxxxx. Eigentlich 
sollte das Handy nun wählen - aber nichts geschieht.

Weiß vielleicht jemand, wie man es richtig machen könnte?
Oder kennt jemand ein Forum, in dem solche Dinge eher behandelt werden?

mfg
Egon

von gast (Gast)


Lesenswert?

schau erst einmal was bei htherm ankommt, dann kannst auch darauf 
reagieren (das ist nämlich nicht immer ring). hab sowas auch schon 
gemacht.

von gast (Gast)


Lesenswert?

achso, besser ist es auf das eintreffen des "ring" zu warten und dann 
über ein at kommando noch die anrufnummer auszulesen+telefonat beenden, 
dann weisst wer angerufen hat (ob du es warst oder jemand anderes)

von gast (Gast)


Lesenswert?

sry für mass posting, aber hab grad mal in mein source geschaut, ich 
warte auf "+CRING: VOICE" und nicht auf ring. wie gesagt einfach mal mit 
hterm "reinhören"

von Egon M. (kpc)


Lesenswert?

gast wrote:
> schau erst einmal was bei htherm ankommt, dann kannst auch darauf
> reagieren (das ist nämlich nicht immer ring). hab sowas auch schon
> gemacht.
 Eigenartigerweise kriege ich mit hterm keine Verbindung (ging früher 
besser als Hyperterminal) Hyperterminal hingegen funktioniert mit dem 
Handy und mit dem AVR (leider nacheinander, nicht parallel).

Was Du in Deiner nächsten Mail schreibst, die Telefonnummer auszulesen, 
muß ich noch etwas aufschieben. Ich kann zunächst nur einzelne Zeichen 
lesen, Strings kann ich noch nicht.

Gruß
Egon

von Johannes (Gast)


Lesenswert?

Hallo Egon,

1. hast du ein CR+LF oder in C: "\n\r" an das "atd" gehängt? Das Modem 
erwartet das als Abschluss von jedem AT-Befehl! Hyperterminal sendet das 
automatisch mit, wenn du nach dem Befehl "Enter" drückst.

2. Wie ist das Modem eingestellt? GSM- Modems senden in ihrer Default- 
Einstellung jedes zeichen über die UART zurück(Echo). Wenn der AVR also 
auf das Echo wartet, kann man sicher sein, dass das Zeichen korrekt vom 
Modem angenommen wurde.

Mein Tipp: Während der AVR an das Modem/Handy angeschlossen ist, einfach 
ein Serielles Kabel an TX des Modems hängen, und mit Hyperterminal 
gucken, was das Modem ausgibt, während der AVR seine AT-Befehle sendet. 
Da sollte alles rauskommen, was der AVR reinschickt ( und natürlich ein 
"OK" als Bestätigung).


Grüße,

Johannes

von gast (Gast)


Lesenswert?

bei hterm hast siehst aber alle zeichen. also versuch das mal 
hinzukriegen, halt 9600baud, 8N1 glaub ich war da immer die einstellung 
für handies

das empfangen ganzer zeichenketten machst mit dem 
uart-empfangs-interrupt. du hast eine globale variable (hier volatile 
char string[maxstrlen+1]) in der du alles zwischenspeicherst. ist eine 
maximale anzahl von zeichen eingegangen oder ein /n bzw /r (also ein 
enter), dann schliest du den string ab und signalisierst der 
hauptroutine, dass die zeichenkette zur verarbeitung bereit steht. ist 
diese dann verarbeitet, kann str_complete und str_count wieder 
zurückgesetzt werden.
1
ISR(USART_RXC_vect)
2
{
3
    unsigned char buffer;
4
5
    // Daten aus dem Puffer lesen
6
    buffer = UDR;
7
  // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
8
    if (buffer!='\n' && buffer!='\r' && str_count<maxstrlen-2){ //&& str_complete!=0) {
9
    string[str_count]=buffer;
10
    str_count++;
11
  } else {
12
    if (buffer!='\n' && buffer!='\r'){
13
      string[str_count]=buffer;
14
      str_count++;
15
    }
16
    string[str_count]='\0';
17
    str_complete=1;
18
  } 
19
}

von gast (Gast)


Lesenswert?

sry, das ist noch die fehlerhafte isr gewesen:
1
ISR(USART_RXC_vect)
2
{
3
    unsigned char buffer;
4
5
    // Daten aus dem Puffer lesen
6
    buffer = UDR;
7
  // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
8
    if (buffer!='\n' && buffer!='\r' && str_count<maxstrlen-1 && str_complete!=1){ //&& str_complete!=0) {
9
    string[str_count]=buffer;
10
    str_count++;
11
  } else {
12
    //durch Abfrage von str_compete werden ankommende Zeichen verworfen, falls die Verarbeitung der Zeichenkette (string) gerade läuft                
13
    if (buffer!='\n' && buffer!='\r' && str_complete!=1){
14
      string[str_count]=buffer;
15
      str_count++;
16
    }
17
    string[str_count]='\0';
18
    str_complete=1;
19
  } 
20
}

von Bernhard (Gast)


Lesenswert?

Ich hab die Erfahrung gemacht, dass es mit 19200 Baud besser 
funktioniert.
Ähnlich wie Egon hab ich aber das Problem, dass ich keine Zeichen auf 
der Rx Leitung des µC empfange.
Wie hier schon am Ende beschrieben: 
Beitrag "welche Signale liefert ein Handy an TX"

Bei mir wird bei einem Anruf nicht mal das RI Flag gesetzt..

von Johannes (Gast)


Lesenswert?

.. ein weiterer Stolperstein fällt mir gerade noch ein: Wenn am Modem 
Autobaud aktiviert ist, funktioniert die Kommunikation oft nicht so 
richtig.

Das sollte man also erstmal über Hypertermial deaktivieren: 
("AT+IPR=9600") und anschließend die Einstellung speichern ("AT&W").

Wobei ich nicht genau weiß, ob das bei Handys auch genau so 
funktioniert, oder ob die AT-Befehle hier anders sind.

Gruß,

Johannes

PS: der String zum wählen, den der AVR an das Modem/Handy sendet sollte 
so aussehen:
"atd0721xxxxxx\n\r"

von Bernhard (Gast)


Lesenswert?

Bei nobbi.com hab ich zum Umschalten der Baudrate nur folgendes 
gefunden:

AT^SBFB Schnittstellengeschwindigkeit umschalten
AT^SBFB=a   kann offenbar zwischen 19200 (a := 0) und 57600 (a := 1) 
umschalten. Bisher ungetestet.

von Johannes (Gast)


Lesenswert?

Also AT^XXX ist ein Herstellerspezifischer Befehl (^,#, o.ä. als 
Separator zwischen AT und Befehl ist immer Herstellerspezifisch)

... da hilft nur nachlesen im AT-Command-Set des jeweiligen 
Herstellers...

von Bernhard (Gast)


Lesenswert?

Gut zu wissen. Hat jemand eine Bezugsquelle zum AT Command Set für das 
Siemens S55? Ich konnte bisher nur jenes für das Siemens L55 bzw Siemens 
C35i/M35i/S35i finden. Oder unterscheiden sich die AT Commands innerhalb 
der Modellreihen eh nicht so stark?

Ich kann mir kaum vorstellen, dass der Hersteller das freiwillig 
rausrückt?

von Johannes (Gast)


Lesenswert?

Also bei den Modems (z.B. MC35i) müssen sie es ja rausrücken... sonst 
kann keine Mensch was damit anfangen...

Erfahrungsgemäß macht mant, wenn man für ein "unbekanntes" Modem eines 
Herstellers, die AT-Commands nimmt, die im AT-Command Set für ein 
anderes  Modem des gleichen Herstellers stehen, nicht so viel falsch.

Die Befehle zum wählen ("ATD ..."), SMS - versand ("AT+CMGW=..":), 
aktuelle Konfiguration speicher ("AT&W"), Feldstärke abfragen 
("AT+CSQ"), anzeige des aktuellen Providers ("AT+COPS?") u.v.m. sind 
aber in allen mir bekannten Modems gleich. (Dafür gibts einen Standard)
Herstellerspezifische Commandos sind i.d.R. das Herunterfahren (bei 
Siemens "AT^SMSO") oder das versetzten in den Standby. In den meisten 
Fällen braucht man die nicht unbedingt.

Hier gibts ein Paar Herstellerspezifische(?) Commandos für Siemens- 
Handys:
http://www.nobbi.com/atsiem.htm

Am besten einfach mal mit Hyperterminal ausprobieren, auf welche Befehle 
es reagiert.

Mit "AT+IPR?" fragst du übrigens ab, welche Baudraten unterstützt 
werden. Bei meinem Sony Erricson kommt da "0" zurück, was wohl heißt, 
dass nur Autobaud unterstützt wird - ich kann es auch nicht auf eine 
andere Baudrate einstellen ("AT+IPR=9600" z.B. liefert "ERROR").


viel Erfolg,

Johannes

von gast (Gast)


Lesenswert?

"Ähnlich wie Egon hab ich aber das Problem, dass ich keine Zeichen auf
der Rx Leitung des µC empfange."
Aber Tx klappt?

Ich hatte einmal das Problem, dass ich 2 max dazwischen hatte (einem der 
am µC hängt und einer im Datenkabel) und somit Rx und Tx tauschen 
musste.

von Bernhard (Gast)


Lesenswert?

Tx funktioniert.

Hab keinen MAX232 dazwischen. Das Datenkabel wurde selbstgebaut und 
besteht im Prinzip nur aus GND,Tx und Rx.
Rx und Tx hab ich ausgekreuzt an den µC angeschlossen.

@Johannes: Danke für die Info!

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.