µ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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.