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.
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
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...