µC startet immer wieder neu

Gast #1962287
Lesenswert?

Hallo,

ich habe heute morgen ein kleines Problem für meinen Dimmer geschrieben. 
Dieses Programm soll empfangene Daten in das int Format umwandeln und 
danach in das Timer Register schreiben, um einen Phasenanschnitt zu 
bewirken.

Wenn ich dort eine Konstante verwende, klappt auch alles super und ohne 
Probleme. Nur bei dem Empfangen harpert es noch.

Wenn der Controller gestartet wird, setzt er zunächst testweise eine 
konstanten Wert in die Variable, um erstmal zu schauen, o, die Glühbirne 
für die Testzwecke noch funktioniert.

Danach versuche ich, einen Wert zu senden (ca so: "090\n").

Sobald ich das jedoch gemacht habe, startet der Controller immer wieder 
neu.

Eigentlich sollte er ja in seiner WHILE-Schleife bleiben.

Macht er jedoch nicht. Ich habe jetzt schon mehrere Stunden rumprobiert 
und immer mit dem gleichen Ergebnis.

Hat jemand vielleicht eine Lösung für diesen seltsamen Fehler?



Viele Grüße
Angehängte Dateien:
#1962296
Lesenswert?

Paul schrieb:

> Hat jemand vielleicht eine Lösung für diesen seltsamen Fehler?

Schau Dir mal Dein sprintf in der while-Schleife ganz genau an:

Prototyp:
int sprintf ( char * str, const char * format, ... );

Zaunpfahl 1: Zeigt der erste Parameter auf einen String mit 
hinreichender Länge?

Zaunpfahl 2: Was passiert, wenn die Ausgabe von sprintf nicht mehr in 
den String, in den sie rein soll, reinpasst? Gibt es andere 
Bibliotheksfunktionen, die vielleicht sicherer sind?

fchk
Gast #1962363
Lesenswert?

Hallo Frank,
ich habe deine Antwort ganz übersehen.

1. Nein, der erste Parameter zeigt auf gar keinen String. Aber jetzt wo 
du's sagst, fällt es mir auch auf.

2. Ich wüsste keine andere Funktion, die besser geeignet wäre. Sosnt 
hätte ich die ja wahrscheinlich auch nicht genommen. ;)
Hättest du vielleicht eine für mich?

Liebe Grüße
#1962462
Lesenswert?

Paul schrieb:
> Hallo Frank,
> ich habe deine Antwort ganz übersehen.
>
> 1. Nein, der erste Parameter zeigt auf gar keinen String. Aber jetzt wo
> du's sagst, fällt es mir auch auf.

Und damit überschreibst Du irgendwelche Variablen. Dass das dann zum 
Absturz führt, ist klar.

> 2. Ich wüsste keine andere Funktion, die besser geeignet wäre. Sosnt
> hätte ich die ja wahrscheinlich auch nicht genommen. ;)
> Hättest du vielleicht eine für mich?

Hast Du ein C-Buch? Wenn nein, solltest Du Dir mal eines kaufen. Der 
Trend geht zum Zweitbuch. Ansonsten schau in Deine stdio.h rein. Da 
könnte auch so etwas stehen:

int snprintf(char *str, size_t size, const char *format, ...);

Dort kannst Du noch die Länge des Strings mit übergeben, in den Du 
sprinten willst. Wird der String zu lang, wird abgeschnitten. Damit 
kommst Du nicht in Gefahr, dass irgend etwas überschrieben wird.

Aus dem gleichen Grund sind strcpy, strcat und gets igitt und zu 
vermeiden.

So, jetzt noch mal zu Deinem Programm: Wolltest Du an der Stelle 
wirklich etwas ausgeben, oder nicht doch etwas aus einem String 
einlesen? In diesem Fall wären sscanf, atoi, atol, strtol oder strtoul 
passende Kandidaten.

fchk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren