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
schau erst einmal was bei htherm ankommt, dann kannst auch darauf reagieren (das ist nämlich nicht immer ring). hab sowas auch schon gemacht.
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)
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"
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
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
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 | }
|
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 | }
|
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..
.. 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"
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.
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...
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?
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
"Ä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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.