Forum: Mikrocontroller und Digitale Elektronik C++ falscher Funktions-Rückgabewert


von Ste R. (ste_r)


Lesenswert?

Hallo zusammen,

ich stehe vor einem Problem, das mich an die Grenze meiner praktischen 
Erfahrung bringt.

Grundsätzliche Aufgabenstellung: Eingabe eines Zeichens am PC -> USART 
zum ATmega328. Einlesen des Zeichens -> nutzen, um andere Funktionen zu 
triggern.

Das Problem: Alles funktioniert erstmal gut, doch plötzlich (immer nach 
derselben Eingabefolge), liefert mir die untenstehende Funktion einen 
falschen Rückgabewert.

Info: Ich verzichte hier erstmal auf viel drum-herum, um nur die aus 
meiner Sicht Fehlerstelle aufzuzeigen.
1
//******************************
2
//uart_debugging.hpp
3
4
// ist "true", wenn ein Zeichen über USART empfangen wurde und gibt es über ret_val zurück
5
extern bool received_single_char(unsigned char* ret_val);
6
7
//******************************
8
// Hauptprogramm.cpp
9
10
unsigned char received_char = 0;
11
12
// Hier wird innerhalb der Funktion das empfagene Zeichen richtig ausgegeben (über UART zurück gesendet)
13
if(uart_debugging::received_single_char(&received_char))
14
{
15
   //wenn ich hierher komme, ist teilweise ein falsches Zeichen gesetzt (wird über UART raus gesendet)
16
   uart_debugging::write_char(received_char);
17
}

Also wenn ich mir den Rückgabewert (&received_char) innerhalb der 
Funktion ausgeben lasse, passt es. Außerhalb der Funktion aber nicht.

Interessant: Egal was ich dann eingebe, es bleibt immer derselbe falsche 
Wert gesetzt.

Was ebenfalls auftrat: obwohl ich innerhalb der Funktion bei nicht 
empfangenen Zeichen "false" zurückgegeben habe, hat die if() Abfrage 
teilweise permanent "true" gelesen.

Hat jemand eine Erklärung, bei welchen Situationen ein solches Verhalten 
auftreten kann?
Kann irgendwie der Pointer verbogen werden? Wenn ja, wie?
Stack-Overflow habe ich mit der mem-check-Funktion eigentlich schon 
ausgeschlossen. Waren noch >1000Bytes frei.

Danke schon mal.
Beste Grüße

von Oliver S. (oliverso)


Lesenswert?

Wie immer: Fehler in Zeile 42.

Oliver

von (Gast)


Lesenswert?

Der Fehler ist im geheimen Teil der Quellen.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

1. Warum unsigned char?
2. Wo ist der Source von received_single_char?

von Axel S. (a-za-z0-9)


Lesenswert?

Ste R. schrieb:
> Info: Ich verzichte hier erstmal auf viel drum-herum, um nur die aus
> meiner Sicht Fehlerstelle aufzuzeigen.

Dummerweise verzichtest du auch auf alles, was Licht auf das Problem 
werfen könnte.

> Also wenn ich mir den Rückgabewert (&received_char) innerhalb der
> Funktion ausgeben lasse, passt es. Außerhalb der Funktion aber nicht.

Das kann man deinen Codefragmenten nicht entnehmen. Genau genommen gibst 
du nirgenwo irgendetwas aus.

Ist es denn so schwer, den Code zu zeigen der nicht funktioniert und dem 
den Code gegenüber zu stellen, der funktioniert? Und zwar 
sinnvollerweise Code, der auch bei einem anderen compiliert? Und weil 
das dann mehr Code als Text sein wird, in Form eines Anhangs?

von (Gast)


Lesenswert?

Ste R. schrieb:
> Interessant: Egal was ich dann eingebe, es bleibt immer derselbe falsche
> Wert gesetzt.
>
> Was ebenfalls auftrat: obwohl ich innerhalb der Funktion bei nicht
> empfangenen Zeichen "false" zurückgegeben habe, hat die if() Abfrage
> teilweise permanent "true" gelesen.

das täuscht auch, unter garantie. klingt eher danach als würde die 
funktion in dem fall gar nicht aufgerufen.

von Ste R. (ste_r)


Lesenswert?

Vorteil im Forum: Schnelligkeit und Expertise,
Nachteil: Fehlende Sachlichkeit.... (gilt nicht für alle ;-) )

Wie ich schrieb, ich habe bewusst andere Teile vom Code weggelassen, 
damit der geneigte Antwortende nicht gleich ein halbes Buch lesen muss..

Hier die aufgerufene Funktion (im Wesentlichen aus dem 
uart-std-Beispiel) - sicherlich hätte ich die auch gleich mit angeben 
können:
1
#include "uart.h"
2
3
bool received_single_char(unsigned char* ret_val)
4
{
5
   bool b_retVal = false;
6
   uint16_t c = uart_getc();
7
8
   if ( c & UART_NO_DATA )
9
   {
10
      /* 
11
       * no data available from UART 
12
       */
13
14
        *ret_val = 0u;
15
        b_retVal = false;
16
   }
17
   else
18
   {
19
       /* 
20
        * send received character back
21
        */
22
        uart_putc( (unsigned char)c );
23
24
        /* return via function */
25
        *ret_val = (unsigned char)c;
26
        b_retVal = true;
27
   }
28
   return b_retVal;
29
}
30
31
32
void write_char(unsigned char data)
33
{
34
   uart_putc(data);
35
}

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Da fehlt Zeile 42.

Oliver

von (Gast)


Lesenswert?

Ein paar zusätzliche Salami-Scheiben brauchts noch.

von (Gast)


Lesenswert?

Ich hol schon mal die Kartoffelchips...

von Ste R. (ste_r)


Lesenswert?

Tim T. schrieb:
> 1. Warum unsigned char?

Weil die "Standard" Funktionen der uart-Lib mit unsigned char arbeiten

Axel S. schrieb:
> Ist es denn so schwer, den Code zu zeigen der nicht funktioniert und dem
> den Code gegenüber zu stellen, der funktioniert? Und zwar
> sinnvollerweise Code, der auch bei einem anderen compiliert? Und weil
> das dann mehr Code als Text sein wird, in Form eines Anhangs?

Witzigerweise ist es derselbe Code. Ich mache ein paar Eingaben -> 
funktioniert. Paar Eingaben später -> funktioniert nicht mehr.

Sicher kann ich auch das ganze Projekt hochladen (bzw privat schicken). 
Aber erstmal möchte ich abklopfen, obs nicht etwas offensichtliches ist, 
ehe sich jemand die Mühe macht. Sind halt schon ein paar Zeilen..

rµ schrieb:
> das täuscht auch, unter garantie. klingt eher danach als würde die
> funktion in dem fall gar nicht aufgerufen.

Das glaube ich nicht, weil innerhalb der Funktion gibt's ja auch ne 
Ausgabe, die richtig funktioniert. Siehe Funktionscode in meinem letzten 
Post.
nach dem Motto:
>innen: 1 > außen: 1
>innen: 3 > außen: 3
>innen: 5 > außen: 5
>innen: 3 > außen: Y
>innen: 5 > außen: Y

VG

: Bearbeitet durch User
von (Gast)


Lesenswert?

Ste R. schrieb:
> rµ schrieb:
>> das täuscht auch, unter garantie. klingt eher danach als würde die
>> funktion in dem fall gar nicht aufgerufen.
>
> Das glaube ich nicht, weil innerhalb der Funktion gibt's ja auch ne
> Ausgabe, die richtig funktioniert. Siehe Funktionscode in meinem letzten
> Post.
> nach dem Motto:
>>innen: 1 > außen: 1
>>innen: 3 > außen: 3
>>innen: 5 > außen: 5
>>innen: 3 > außen: Y
>>innen: 5 > außen: Y

Das Problem liegt jedenfalls nicht (offensichtlich) im code der bis 
jetzt gezeigt wurde. Es fehlt auch noch die Hauptschleife und die uart_ 
Funktionen, die scheinen aus einer Library zu stammen, und ich gehe mal 
davon aus dass die lib funktioniert.

von Ste R. (ste_r)


Lesenswert?

Und nochmal, weshalb ich nicht mehr Code gepostet habe:

Aus meiner Sicht ist es:
1
char Variable;
2
f(&Variable); //<-- ändern Variablenwert und gibt Ergebnis aus
3
read(Variable); //<-- nicht der erwartete (gleiche) Wert

Bitte erleuchtet mich, was der restliche Code dazu beitragen kann?!
Btw. ich hab auch schon ein cli() und sei() ringsrum gebaut: keine 
Besserung.

rµ schrieb:
> Das Problem liegt jedenfalls nicht (offensichtlich) im code der bis
> jetzt gezeigt wurde.

Gibt es übliche Fehler, die ich selbst überprüfen kann?

rµ schrieb:
> die uart_
> Funktionen, die scheinen aus einer Library zu stammen, und ich gehe mal
> davon aus dass die lib funktioniert.

Ja, davon gehe ich auch aus

: Bearbeitet durch User
von (Gast)


Lesenswert?

Ste R. schrieb:
> Bitte erleuchtet mich, was der restliche Code dazu beitragen kann?!
> Btw. ich hab auch schon ein cli() und sei() ringsrum gebaut: keine
> Besserung.

Einfacher als aufzuzählen was man in C++ auf einem µC alles falsch 
machen kann wäre es den Code anzusehen. Whatever. Viel Spass noch. Gn8.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Welche Baudrate benutzt du und welchen Quarz? Lib ist von Peter Fleury?

von g457 (Gast)


Lesenswert?

> Gibt es übliche Fehler, die ich selbst überprüfen kann?

<salamitaktik>Ja.</>

HTH und nix für ungut

von Ste R. (ste_r)


Lesenswert?

rµ schrieb:
> Einfacher als aufzuzählen was man in C++ auf einem µC alles falsch
> machen kann wäre es den Code anzusehen.

Ja, da hast du wohl recht. Fehler gefunden: ein char-Array an ganz 
anderer Stelle im Programm war ein Feld zu klein.. Asche auf mein Haupt.

Danke trotzdem..

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Ste R. schrieb:
> rµ schrieb:
>> Einfacher als aufzuzählen was man in C++ auf einem µC alles falsch
>> machen kann wäre es den Code anzusehen.
>
> Ja, da hast du wohl recht. Fehler gefunden: ein char-Array an ganz
> anderer Stelle im Programm war ein Feld zu klein.. Asche auf mein Haupt.
>
> Danke trotzdem..

Mit komplettem Quelltext wäre das eventuell auch jemandem aufgefallen...

von mh (Gast)


Lesenswert?

Tim T. schrieb:
> Ste R. schrieb:
>> rµ schrieb:
>>> Einfacher als aufzuzählen was man in C++ auf einem µC alles falsch
>>> machen kann wäre es den Code anzusehen.
>> Ja, da hast du wohl recht. Fehler gefunden: ein char-Array an ganz
>> anderer Stelle im Programm war ein Feld zu klein.. Asche auf mein Haupt.
>> Danke trotzdem..
>
> Mit komplettem Quelltext wäre das eventuell auch jemandem aufgefallen...
Ja, der vollständige Quelltext hätte vielleicht geholfen (falls sich 
jemand die Mühe gemacht hätte ihn zu lesen). Was sicher geholfen hätte, 
wäre ein minimales compilierbares Beispiel, das den Fehler reproduziert. 
Dann hätte er den Fehler ziemlich wahrscheinlich selbst gefunden, bevor 
er das erste Wort seiner Frage hier im Forum geschrieben hat.

von Axel S. (a-za-z0-9)


Lesenswert?

mh schrieb:
> Was sicher geholfen hätte, wäre ein minimales compilierbares
> Beispiel, das den Fehler reproduziert.
> Dann hätte er den Fehler ziemlich wahrscheinlich selbst gefunden

Genau das war der Grund, weswegen ich danach gefragt hatte.

von Forist (Gast)


Lesenswert?

Oliver S. schrieb:
> Wie immer: Fehler in Zeile 42.

Aber wie soll man ohne mühseliges Abzählen herausfinden, welches die 
Zeile 42 ist, wenn keine C Code-Tags verwendet werden?

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Forist schrieb:
> Oliver S. schrieb:
>> Wie immer: Fehler in Zeile 42.
>
> Aber wie soll man ohne mühseliges Abzählen herausfinden, welches die
> Zeile 42 ist, wenn keine C Code-Tags verwendet werden?

Und da sagt man es gibt keine dummen Fragen...

von Oliver S. (oliverso)


Lesenswert?

Forist schrieb:
> Aber wie soll man ohne mühseliges Abzählen herausfinden, welches die
> Zeile 42 ist, wenn keine C Code-Tags verwendet werden?

Ist doch einfach: Zeile 42 ist die mit dem Fehler.

Oliver

von Ford (Gast)


Lesenswert?

Tim T. schrieb:
> Forist schrieb:
>> Oliver S. schrieb:
>>> Wie immer: Fehler in Zeile 42.
>>
>> Aber wie soll man ohne mühseliges Abzählen herausfinden, welches die
>> Zeile 42 ist, wenn keine C Code-Tags verwendet werden?
>
> Und da sagt man es gibt keine dummen Fragen...

Bis Du das, Deep Thought?

von Carsten P. (r2pi)


Lesenswert?

Ford schrieb:
> Bis Du das, Deep Thought?

Wenn du Ford bist, weißt du, dass Deep Thought nur Antworten weiß, nicht 
die passenden Fragen dazu =p

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.