Aufgabenstellung: Über meinen Microcontroller(ATmega32) mittels dem At-Befehlssatz eine SMS mit meinem GSM-Modem(MC35i von Siemens) zu senden. Problem: Das SMS wird kommt einfach nicht an. Ich bin kein C Experte und verstehe nicht wieso nichts funktioniert (Liegt wahrscheindlich am Coding). Programmiert wird mittels PonyProg. Dies ist ein Teil meiner Diplomarbeit und für mich eine sehr schwere Hürde. Hier mein Coding in AVR Studio 4: #include <avr/io.h> #include <util/delay.h> int uart_putc(unsigned char c); void SendeString (char *szBuf); void long_delay(uint16_t ms); int main(void) { int c=0; UCSRA = 0x00; // MCU =ATMega32, F_CPU = 16Mhz, 9600 Baudrate UCSRB = 0x18; //8 Bit , kein Parity, 1 Stopbit, Asynchron UCSRC = 0x86; UBRRH = 0x00; UBRRL = 0x67; if(c==0) { SendeString("at+cpin=0000\r\n"); //AT-Befehl zur Pineingabe long_delay(2000); //2 sec warten //2 Sekunden Warteschleife SendeString("at+cmgf=1\r\n"); //SMS-Ein und Ausgabe erfolgt im 7Bit Klartext long_delay(2000); SendeString("at+cmgs=+436644209014\r\n"); //Zieladressnummer nach Österreich A1 long_delay(2000); SendeString("Test"); //SMS-Text long_delay(2000); uart_putc(0x1A); //Hex Code fuer Strg+Z wird gesendet long_delay(5000); c=1; // Überprüfung das SMS nur 1 mal gesendet wurde } return 0; } int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ { } UDR = c; /* sende Zeichen */ return 0; } void SendeString (char *szBuf) //Methode zum Senden { while (*szBuf++) { outp (*szBuf, UDR); loop_until_bit_is_set (UCSRA, UDRE); } } void long_delay(uint16_t ms) //Warteschleife { for(; ms>0; ms--) _delay_ms(1); }
Ich nehme an, du suchst jetzt nach einem Punkt, wo du ansetzen kannst, um zu schauen, was jetzt schief läuft? Wo ist das Problem? Ich würde erstmal statt dem GSM-Modul ein PC anschliessen um zu schauen, ob überhaupt was vom Controller geschickt wird. Ausserdem würde ich statt den long_wait() auf das "OK" warten, mit dem das Modem die AT-Befehle quittieren sollte.
Nur mal eine Frage: Sind die AT-Befehle nicht groß zu schreiben? AT..., denn das ergibt ja einen ganz anderen Code. Groß-/Kleinschreibung nicht egal, jedenfalls stehen alle Hayes-Befehle im Manual zum TC35i/MC35i in Großbuchstaben drin.
Soweit ich das gewohnt bin, spielt gross/kleinschreibung keine Rolle. Ein "ATZ" sollte genau wie ein "atz" funktionieren.
Hab selber in der Art schon was gemacht, aber in einem Projekt. Wir erstellten aber damals das Handy als Modem. Schau mal ob deine Befehle stimmen die du ans Handy schickst. Am besten mit Datenkabel mal an PC und dort mitn Hyperterminal rumspielen. Wenn du das SMS schicken kannst liegts irgendwo am Controller. Also Prüf was er schickt und was er schicken sollte. Wir haben damals auch so angefangen. Alleine die Datenverbindung kostete uns schon 3 Tage bis das von Rechner zu Rechner lief (M35 auf MT50 beide Siemens). Ich weis blos nicht mehr ob wir die AT Befehle gross geschrieben haben...doch fast Sicher gross. Leider hab ich den Code nicht mehr, war aber auch in Basic welches dir nicht viel helfen wird. Was du auch noch versuchen kannst einfach mit ATDT mal auf ein Telefon Rauszuwählen, damit du weist das was geht. MfG Matthias P.S. Das MC35 braucht das nicht den PTY Code für ne SMS oder kann es sicher schon Klartext?
habe es auch mal gemacht und nur kurz drübergeschaut (mein Modem brauchte keine Pinnummer). flash unsigned char at_set_textmode[]="at+cmgf=1\r"; printf(at_set_textmode); da ist bei dir noch ein \n dran, kann sein, dass es nicht stört - braucht man aber nicht. Bei mir hats jedenfalls so funktioniert. Auch sonst überall nur \r.
Erstmals danke für die zahlreichen Antworten. Jedoch kenne ich mich persönlich nicht so gut in C aus und habe den Code größtenteils kopiert u zusammengesetzt. Das senden mittels Hyperterminal funktioniert einwandfrei. Das Problem liegt ganz allein am Microcontroller der einfach nichts Ausgibt in Hyperterminal und ich und mein Partner wissen einfach nicht warum. Kann uns wer vl eine einfache Anwendung schicken wo man etwas in Hyperterminal vom microcontroller ausgibt, das würde uns glaub ich sehr helfen. lg Benni
lach Nein, das funktioniert gewiss so nicht. Wenn euer Kontroller nicht so funktioniert, wie ihr es haben wollt, könnt ihr nicht jedesmal im Forum nachfragen, ob jemand die Arbeit für euch macht. Ich schlage vor, ihr beschäftigt euch selber mit dem Problem. Nur so lernt ihr. Im GCC-Tutorial ist alles was man über den Betrieb des UARTs wissen muss beschrieben. Das müsst ihr euch erstmal durchlesen.. Ich vermute, das ihr die UART falsch inititalisiert und UDRE nicht vom kontroller gesetzt wird. Die Folge: euer Code hängt in einer Endlosschleife. Wie man richtig initialisiert steht hier im im GCC-Tutorial. Tipps und Ratschläge werden hier gerne erteilt, aber daß sich jemand die Arbeit für euch macht, könnt ihr ganz schnell vergessen.
Hy Benni, I have read your Code and your problems. And tried your Code to the same modem i have. So, let me tell you details. num1. UART configuration is OK. num2. SendeString() is not working in order to send String to Hyper terminal. So use those methods - int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ { } UDR = c; /* sende Zeichen */ return 0; } void uart_puts (char *s) { while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ uart_putc(*s); s++; } } That means to your Code: uart_puts("at+cpin=0000\r\n"); //AT-Befehl zur Pineingabe or just leave \n number 3: You should wait for the answer from your modem. The answer could be "OK" or "ERROR" just try to proof positive that you can make communication between your GSM modem and microcontroller. For that you wait for "OK" string.... and let your LED ON. num 4. You must read "String Empfangen" from the GCC tutorial here or at Roboternetz.Tips: write a programm to send a string("OK" then press Enter ) to ATmega32 from your hyperterminal. IF microcontroller get OK to USART, LED should goes ON. num 5. Next tip: you might need Interrupt Routines for USART/UART. num 6. Another important thing is your Serielle Kabel. To communate PC and your board, you might use Nullmodem 9 Pol Seriell Kabel. Here you have One side Männlich and other side Weiblich of your kabel. At your modem you might need gekreuztes Kabel. You just have to convert it and proof if your RxD and TxD lines are connencted to Gsm modem and microcontroller. PS. my German is horrible and my english is also not very good.Though i have tried to explain my tips to your projekt. You and everybody can write me in German.i dont have any problem with it. Thats all for now.
Danke für die zahlreichen Infos. Ich hab schon herausgefunden wie es funktioniert. Und zwar war mein Microcontroller kaputt und man konnte nichts über UART schicken. Nun hab ich Microcontroller ausgewechselt und des Program lief ausnahmslos. lg Benni
Hi soweit ich weis akzeptiert Siemens 35i nur PDU Mode. Du verschickst aber nur klartext mit dem progi oder habe ich da was übersehen?
Hy Miri, Da wird Klar Text gesendet... und funktiniert einwandfrei mit Siemens 35i. cheers
Ich habe das schon mit sl45i ausprobiert. Kann nur PDU. Verstehe jetzt die Welt nicht mehr. Das s35i ist noch älter. wie geht das???
Hy Miri, Just study this site : http://www.dreamfabric.com/sms/ Here you will find about PDU format. There are two ways of sending and receiving SMS messages: by text mode and by PDU (protocol description unit) mode. The text mode is unavailable on some phones. I guess..your Siemens sl45i doesnt support Text Mode. In this situation you can try to Convert your PDU Format in Text mode. You will find enough about this converting in google. cheers
Hallo, Nur um das Thema "Text / PDU Mode" abzuschließen: GSM-Modems von Siemens sind standardmäßig im PDU Mode initialisiert. Bei vielen (z.B. beim 35i oder 45i) kann man aber über den Befehl "AT+CMGF=1" in den Text Mode wechseln, wobei stest die Befehle "AT&W" sowie "AT^SMSO" (lässt Modem 1x runterfahren und speichert dabei die Werte) nötig sind, um diese und andere Einstellungen dauerhaft zu sichern. Details hierzu stehen in den jeweiligen AT Command Sets...
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.