Datenaustausch mit einem Mikrocontroller



  • Hallo,

    Das Code-Beispiel von Anton Zechner ist jedoch in C++ geschrieben und funktioniert sehr gut. Leider ist der Fuzzy Regler in C geschrieben und wenn ich diese C Datei dann in das C++ Projekt icludiere meckert der Compiler.

    Ich lade die ZIP gleich hier nochmal hoch.

    LG



  • Die zip-Datei ist in Ordnung. Aber file-upload.net macht blöde Werbung die wie Download-Buttons aussehen... wenn man keinen Ad-Blocker hat.

    Das ganze nutzt MathWorks und PRINTF ist halt je nach dem, was gebaut wird, eine andere Ausgabe. 😉

    Zu dem Code und der Ausgabe... was gibt der Code, den du hochgeladen hast genau aus? Und was erwartest du, das ausgegeben wird?

    Edit:
    Die Schleife in Zeile 113 sieht so aus, als wenn du die Klammern vergessen hast.
    In Zeile 139 verwendest du einen falschen Index, du meinst z .
    Die Zeilen aus deinem zweiten Post kommen so nirgends vor. (Versuch mal zu schauen, was in stell steht.)
    In Windows ist es eventuell ratsam die Datei im binären Modus zu öffnen.





  • Hallo

    So konnte den Code nun auch herunterladen.

    Wie schon angemerkt, könnte es sein das du bei Z113 die Klammern vergessen hast. Wenn das Absicht ist, dann ist der Wert von "stell" undefiniert, da du bei Z118 über dein Array hinaus liest (j == fis->out_n).

    Z117 ist hoffentlich immer auskommentiert, sonst überschreibst du dir die äußere Variable und die behält dann den Original-Wert.

    Geb doch mal zum testen, den Wert von "stell" direkt in Z152 aus, nur dort weißt du dann wirklich welcher Wert in deiner Variable steht.

    MfG mdn



  • Der Code gibt einen Double Kommawert aus zwischen 0 und 255.

    Mir reicht aber auch ein Integerwert von 0-255. Wenn ich einen reinen Integerwert habe, dann kann ich den auch ohne Probleme mit fprintf auf die Schnittstelle schreiben, so dass er auch richtig angezeigt wird.

    Somit muss wahrscheinlich nur noch der bisherigr double (float) Wert aus der outputMatrix [i][j] in einen Integerwert von 0-255 umgewandelt werden. Dann sollte es laufen denn:

    DOUBLE **outputMatrix;
    stell = outputMatrix [i][j];
    


  • Ja das stimmt wohl soweit, aber deine Zuweisung

    stell = outputMatrix[i][j]
    

    ist aktuell an einer Stelle, bei der du dir nicht sicher sein kannst, welcher Wert herauskommt. (Array Überschreitung)

    Hast du jetzt schon mal den Wert an Zeile 152 ausgegeben?

    MfG mdn



  • Ja habe ich gerade gemacht. Wenn ich den stell Wert in Zeile 152 ausgebe ist er 0

    152: PRINTF("Stellwert = %.12f \n\n, stell);
    


  • Bis Zeile 125 kann ich ihn ausgeben. Danach nicht mehr. Aber auch nur mit %.0f oder %.12f mit %i ist er auch da Null.



  • Hast du es schon mal probiert, wenn du Zeile 118 wie folgt abänderst:

    stell = (int)outputMatrix[i][j]
    

    Und nochmal, deine Zugriff auf die outputMatrix[i][j] ist bei deinem letzten Schleifendurchlauf außerhalb des Arrays, da j > als dein höchstes Element ist.

    Zum testen könntest du noch die Variable "stell" statt mit einem Wert aus der Matrix, mit einem konstanten Wert auf Zeile 118 belegen, somit würdest du sehen ob es rein die Zuweisung ist oder du deine Variable mehrfach deklarierst und sie durch verlassen des Scopes entfernt wird.

    Könntest du auch bitte mal eine Ausgabe deiner Software hier posten, dann könnte man dies mit deinem Code vergleichen.

    MfG mdn



  • also wenn ich in der Zeile 128 die Variable stell auf 8.17 setze und dann weiter unten über fprintf %i ausgebe, gibt er mir auf der seriellen Schnittstelle nur die 8 aus.

    Wenn ich hingegen stell als int stell = 8.17; oberhalb von main deklariere und dann stell mit fprintf %f auf die serielle Schnittstelle schreibe, schreibt er 0.0000

    Wenn ich aber in der Zeile 127 stell = 8.18; schreibe, gibt er auf der seriellen Schnittstelle 8.180000 aus.

    Also kann er scheinbar den double Rückgabewert von outputMatrix nicht über fprintf ausgeben.

    Gibt es nicht eventuell eine Möglichkeit die letzte ausgegebene Zeile auf der Eingabeaufforderung wieder einzulesen in eine int Variable, denn da stellt er den Wert aus der outputMatrix ja richtig da?!

    auch mit

    stell = (int)outputMatrix[i][j]
    

    funktioniert es nicht



  • Servus

    So hab mir die arbeit gemacht und dein Programm übersetzt und debugged, und wie ich dir schon mal angemerkt habe, greifst du aus dem Array raus, hier mal einen Version, mit der es funktioniert:

    /* print output vector */
    	for (i = 0; i < data_row_n; i++) {
    		for (j = 0; j < fis->out_n; j++)
    			PRINTF("stellwert = %.12f", outputMatrix[i][j]);
    		PRINTF("\n");
    		stell = (int)outputMatrix[i][j-1]; // Hier -1 da j = fis->out_n ist und damit man rausgreifen wuerde
    		PRINTF("Stellwert = %i \n\n", stell);
    	}
    

    Mit dem Code-Schnippsel bekomm ich folgende Ausgabe:

    Starte Fuzzy Logic...
    
    Oeffne COM-Port: 4...
    
    stellwert = 85.008714548229
    Stellwert = 85
    

    MfG Mdn



  • Hey super dankeschöööön!

    SO klappt es. Also fehlte lediglich die -1 bei j.
    Also bewirkt die 1- lediglich nur, dass ich in dem Array bleibe?

    LG



  • Ja dafür ist die -1 da. Wobei die Frage an der Stelle ist, wieso benutzt du überhaupt eine Schleife? Und wenn ja wäre dieser Code besser:

    /* print output vector */
        for (i = 0; i < data_row_n; i++) {
            for (j = 0; j < fis->out_n; j++) {
                PRINTF("stellwert = %.12f", outputMatrix[i][j]);
                stell = (int)outputMatrix[i][j];
            }
            PRINTF("\n");
        }
        PRINTF("Stellwert = %i \n\n", stell);
    

Anmelden zum Antworten