Forum: Mikrocontroller und Digitale Elektronik "Versenden von SMS."-Code mit AVR Studio -> Problem


von Martin (Gast)


Lesenswert?

Hallo alle zusammen,

ich versuche jetzt schon seit ein paar Stunden den Quellcode von Lars 
Neubert aus dem Artikel Versenden von SMS mittels Mobiltelefon zum 
Laufen zu bekommen.

Wenn ich den Code im AVR Studio verwende (Atmega32 eingestellt), dann 
bekomme ich 5 Fehler beim Kompilieren:

jeweils die Meldung: undefined reference to 'smd_decode_data'


Kennt jemand das Problem und kann mir einen Tip geben??

Ich verwende den folgenden Quellcode aus dem Artikel:

http://www.mikrocontroller.net/wikifiles/f/fa/Software_Stand_28.12.2010.zip

Bevor ich den Code an meine Bedürfnisse anpasse möchte ich ihn erst 
einmal so wie er ist zum Laufen bekommen.

Vielleicht findet sich ja jemand, der das selbe Problem hatte und mir 
weiterhelfen kann:-)

Danke

MfG Martin

von Nico (nico123)


Lesenswert?

Hast Du alle Quell- und Header-Dateien eingebunden?
Zeige am Besten deinen Code, dann kann man leichter helfen!

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

@Nico: Ja habe jetzt alle Quell- und Headerdateien richtig eingebunden, 
aber es sind immer noch Fehler vorhanden.

Das Projekt ist ein AVRStudio4-Projekt und ich will es im Studio5 
betreiben.

Folgendes habe ich jetzt zuletzt gemacht:

Ich habe die .aps-Datei im Studio5 importiert. Nach dem Kompilieren 
(habe keine Änderungen vorgenommen)sind ein Fehler und zwei Warnungen 
aufgetreten (siehe Anhang), die ich bereits bei meinen vorherigen 
Versuchen hatte.

Die Fehler und Warnungen kommen von der Funktion sms_decode, aber ich 
kriege es nicht hin, diese auszumerzen.

Im Artikel Versenden von SMS mittels Mobiltelefon wurde unter 
Download -> Software_Stand_28.12.2010 darauf hingewiesen, dass ein Bug 
bei sms_decode war - kann das sein, dass der Bug immer noch da ist!?

Könnt ihr mir weiterhelfen??


Mfg Martin

von Thomas B. (nichtessbar)


Lesenswert?

Der fehler ist easy...

einfach in der Entsprechenden Zeile einen Cast machen:

(struct SMS_DECODE_DATA_T*)(ptr)

Der Rest rührt von unsauberem code her...

von Thomas B. (nichtessbar)


Lesenswert?

Zeile 358
1
  if (*p_sms_telnr_tmp1='+') {

sollte
1
  if (*p_sms_telnr_tmp1=='+') {

sein.

Und der Rest bleibt dir überlassen dass du auch noch deinen Beitrag 
leistest ;)

von Martin (Gast)


Lesenswert?

Hey danke Thomas!!! :-)

Dein Beitrag klingt zuversichtlich, ich teste das gleich mal:-)

Gruß Martin

von Thomas B. (nichtessbar)


Lesenswert?

Najo, man braucht eigentlich nur die Fehlermeldungen/Warnings bewusst zu 
lesen

1.) suggested paranthesis around assignment as truth value
Hier warnt dich der Compiler, dass ein "Wahrheitswert" im IF erwartet 
wird, also der Ausdruck entweder true (alles ungleich 0) oder false (0) 
ergeben muss.
Da hier im Source ein einfaches = verwendet wird (das ist in C der 
Zuweisungsoperator) und == der Vergleichsoperator ist, der true oder 
false liefert. Deshalb zweiteren verwenden (solangs natürlich Sinn 
macht)

2.) Hier wird einer Funktion die einen Pointer auf den einen Datentyp 
erwartet ein Pointer auf einen anderen übergeben (oder im Worstcase ein 
Integer). Hab mir den Code nicht angesehen sondern nur die Meldungen, 
aber würd vermuten hier ist entweder der von dir erwähnte Bug zu suchen 
oder es fehlt einfach ein entsprechender Cast


3.) Noch eindeutiger, er sagt dir sogar welchen Typ er er erwartet und 
was er bekommt. Der typ unterscheidet sich nur durch das Schlüsselwort 
"volatile", und dieses sagt dem Compiler, dass er diese Variable nicht 
wegoptimieren darf, da sie außerhalb des sequentiellen Programmablaufs 
(also beispielsweise in ISRs, durch Speichermanipulation oder sonst wie) 
und somit für ihn nicht ersichtlich manipuliert wird.

von Martin R. (martin84)


Lesenswert?

Guten morgen :-)

Oh man! Thomas ich habs hingekriegt :-) Danke dir wie verrückt!!! :-)

Das sind Fehler die ich eigentlich hätte hinkriegen müssen, aber 
manchmal braucht man jemanden der einem die Augen öffnet :-)

Bei den Deklarationen von sms_dec_data habe ich in der sms.h und sms.c 
das 'volatile' entfernt.

Und in der entsprechenden IF-Anweisung habe ich "='+'" zu "=='+'" 
geändert.

Danke!!

Gruß Martin

von Thomas B. (nichtessbar)


Lesenswert?

volatile kann ggf. gefährlich sein, da dann der Compiler Sachen 
wegoptimiert die er nicht wegoptimieren sollte - hängt dann davon ab mit 
welcher Optimierung übersetzt wird...

Das nur im Hinterkopf behalten falls mal was wieder was 
unerklärlicherweise nicht mehr funktioniert ;)

von eProfi (Gast)


Lesenswert?

> Bei den Deklarationen von sms_dec_data habe ich in der sms.h
> und sms.c das 'volatile' entfernt.

Oh Oh, da setzt Du besser überall, wo "struct sms_dec_data" ohne 
"volatile" davor steht, ein "volatile" hin.
Das wird schon nicht umsonst dortstehen.

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.