Forum: Mikrocontroller und Digitale Elektronik SMS senden mit ATMEGA32


von Wolfi (Gast)


Lesenswert?

hallo!
ich würde gerne mit meinem atmega32 sms versenden. leider treten noch 
einige fehler im programm auf.

hier die fehler:

Warning: C:\...\main\main.c(89): local variable 'c' was set, but not 
used
Warning: C:\...\main\main.c(105): function parameter #1 name: 's' 
doesn't match it's previous declaration: 'szBuf' from line: 38
Warning: C:\...\main\main.c(94): unused function 'uart_putc' was removed 
by the linker
Warning: C:\...\main\main.c(105): unused function 'uart_puts' was 
removed by the linker
Warning: C:\...\main\main.c(70): unused function 'sende_SMS' was removed 
by the linker

ich schreibe die software mit codevisionavr.
hier ist der code:
1
#include <mega32.h>         //Bibliothek ATMEGA32 einbinden
2
#include <stdio.h>              //Bibliothek Standard I/O einbinden
3
#include <delay.h>              //Bibliothek Delay einbinden   
4
     
5
int uart_putc(unsigned char c);
6
void uart_puts (char *szBuf);
7
8
9
10
#define UDRE 5                   // UART Data Register Empty
11
    
12
13
/*Unterprogramm SMS senden*/
14
/*******************/       
15
16
void sende_SMS()
17
{
18
  int c=0;
19
20
21
  if(c==0)
22
  {
23
  uart_puts("at+cpin=0000\r\n"); //AT-Befehl zur Pineingabe
24
  delay_ms(2000);       //2 sec warten   //2 Sekunden Warteschleife
25
  uart_puts("at+cmgf=1\r\n");   //SMS-Ein und Ausgabe erfolgt
26
                                       //    im 7Bit Klartext
27
  delay_ms(2000);
28
  uart_puts("at+cmgs=+xxxxxxxxxxxxxxx\r\n"); //Zieladressnummer                                                   //nach Österreich A1
29
  delay_ms(2000);
30
  uart_puts("Hello World"); //SMS-Text
31
  delay_ms(2000);
32
  uart_putc(0x1A);  //Hex Code fuer Strg+Z wird gesendet
33
  delay_ms(5000);
34
  c=1;  // Überprüfung das SMS nur 1 mal gesendet wurde
35
  }
36
  return;
37
38
}
39
int uart_putc(unsigned char c)
40
{
41
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
42
    {
43
    }
44
45
    UDR = c;                      /* sende Zeichen c */
46
    return 0;
47
}
48
49
50
void uart_puts (char *s)
51
{
52
    while (*s)
53
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
54
        uart_putc(*s);
55
        s++;
56
    }
57
}

ich hoffe es kann mir jemand weiterhelfen.

von Frank S. (franksanderdo)


Lesenswert?

Hallo Wolfi,

hast Du keine Funktion main angelegt?


Warning: C:\...\main\main.c(94): unused function 'uart_putc' was removed
by the linker
Warning: C:\...\main\main.c(105): unused function 'uart_puts' was
removed by the linker
Warning: C:\...\main\main.c(70): unused function 'sende_SMS' was removed
by the linker

Der Linker wirft deine ganze Arbeit weg weil die Funktionen nirgends 
aufgerufen werden.

Warning: C:\...\main\main.c(89): local variable 'c' was set, but not
used

Wie er schon sagt. Da gibt es einen Variable die nirgendwo genutzt wird 
;-)

Grüße
Frank

von Wolfi (Gast)


Lesenswert?

stimmt...hab die funktion nirgends aufgerufen.
leider bleibt folgender fehler:

Warning: C:\...\main\main.c(89): local variable 'c' was set, but not
used

und das senden funktioniert auch nicht.
benutze ein gsm-modul von siemens (tc35).

von Daniel F. (df311)


Lesenswert?

da wir alle wisse, wo in deinem code-snippet die zeile 89 ist, würde ich 
einfach mal sagen, schreib // vor die zeile

von Der Bastler (Gast)


Lesenswert?


von Wolfi (Gast)


Lesenswert?

Der Bastler schrieb:
> https://www.mikrocontroller.net/attachment/106245/...
>
> Lesen und staunen ...

da hat doch das meiste etwas mit dem empfangen von sms zu tun. ich 
möchte nur senden und nicht empfangen.

von Der Bastler (Gast)


Lesenswert?

Senden wird da dick und breit behandelt ...

lesen musst du schon selbst

von Dom (Gast)


Lesenswert?

> Warning: C:\...\main\main.c(89): local variable 'c' was set, but not
> used

bedeutet das was da steht :)
Du hast an an besagter Stelle Speicher für eine Variable geholt, diese 
aber nie benutzt.
Weg mit der entsprechenden Zeile.

Für was hast du in der Fkt. "sende_SMS" die Abfrage mit dem c eingebaut?

> int c=0;
>  if(c==0)
>  {
>  ...
>  c=1;  // Überprüfung das SMS nur 1 mal gesendet wurde
>  }
>  return;

Die Abfrage tut an sich garnichts :D
Das return brauchst du auch nicht.

von Michelle K. (Firma: electronica@tdnet) (michellekonzack) Benutzerseite


Lesenswert?

Wolfi schrieb:
>   uart_puts("at+cpin=0000\r\n"); //AT-Befehl zur Pineingabe
>   delay_ms(2000);       //2 sec warten   //2 Sekunden Warteschleife
>   uart_puts("at+cmgf=1\r\n");   //SMS-Ein und Ausgabe erfolgt
>                                        //    im 7Bit Klartext
>   delay_ms(2000);
>   uart_puts("at+cmgs=+xxxxxxxxxxxxxxx\r\n"); //Zieladressnummer
> //nach Österreich A1
>   delay_ms(2000);
>   uart_puts("Hello World"); //SMS-Text
>   delay_ms(2000);
>   uart_putc(0x1A);  //Hex Code fuer Strg+Z wird gesendet
>   delay_ms(5000);

Bist Du sicher das diese operationen alle erfolgreich sind?

Anstatt eine millionen delay_ms() einzubauen, solltest Du
uart_get() verwenden und das OK auswerten.

Anm.:  Mein TC35 hatte teilweise länger als 2 Sekunden
       gebraucht, um die PIN zu akzepieren...

Grüße
Michelle

von Alex (Gast)


Lesenswert?

Hallo Wolfi,

das mit den delays ist so ne Sache! Bspw. dauert die 
Netzwerkregistrierung nach der Pin-Eingabe je nach Standort und 
Sendestärke seine Zeit--> AT+CREG?
ich würde dir raten die GSM-Antwort bzw. die Quittierung unbedingt 
auszuwerten. Empfange die Daten schreib sie in ein Array und werte sie 
so

if( strcmp( buffer, "OK" ) == 0 )
do something;

bspw. aus.
Wenn die Antwort "OK" ist, gehst du zum nächsten Initialiserungsschritt 
und so weiter. Bei nem ERROR kannst du bspw. eine rote LED aufblinken 
lassen oder einen Reset ausführen.

Gruß

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.