fprintf keine Funktion in einer While-Schleife



  • Hallo Leute,
    bin eher so der stille Leser habe nun jedoch ein Problem mit fprintf.
    Ich benutze WIN 7 und DEV-C++ zum programmieren.

    Grober Überblick:
    Ich habe mir einen 5x5x5 LED Cube gebaut welcher als Microcontroller ein Arduino MEGA2560 besitzt. Meine Programm auf dem Arduino überwacht die Serielle Schnittstelle und wenn Daten vorhanden sind handelt es dementsprechend.
    Der Arduino erwartet eine Folge von 3 Bytes welche ich im Arduino in Integer umwandel um so Ebenen und Säulen anzusprechen.

    Das klappt auch alles wunderbar über den Eingebauten SerialMonitor aus der Arduino IDE.
    Jetzt habe ich in C ein kleines Programm geschrieben um dem Arduino die Befehle über den PC (COM3) senden zu können.
    Das klappt auch - aber genau nur 1 Mal 😞

    #include<windows.h>
    #include<string.h>
    #include<stdio.h>
    #include<conio.h>
    
    int main(){
    FILE* COM3 ;
    char eingabe[4];
    int stop = 0,x = 1;
    system( "mode com3: baud=9600 parity=0 data=8 stop=1 to=off xon=off"); // COM Port 3 einschalten
    COM3 = fopen( "com3", "w" ) ; // Schreiberechte auf COM 3 setzen
    system("title CUBE");
    
            while(x == 1){
            printf("\nEingabe = ");
            scanf("%s",&eingabe);
            printf("%s",eingabe); //debugg
            //stop = atoi(eingabe);
            fprintf( COM3,eingabe ) ; // Eingabe auf COM3 schreiben       
        }
    fclose( COM3 ) ; // COM Port schliessen
    system("pause");
    }
    

    Entferne ich die while-Schleife kann ich einmal eine Eingabe machen und die Entsprechende LED leuchtet auch - dann ist das Programm zu ende.
    Wenn ich z.B eine For-Schleife benutze kann ich schön solange Werte eingeben bis die For-Schleife endet - es passiert aber nix.

    Falls ihr mehr Infos braucht werdet ihr sie sofort erhalten 🙂

    Ich hoffe es sieht einer auf anhieb den Fehler denn ich plage mich damit jetzt 2 Tage schon ab.

    LG Björn


  • Mod

    Geh doch einfach mal mit einem Debugger durch.

    Mein starker Verdacht ist: Du schreibst über die Grenzen von eingabe hinaus, dadurch ändern sich Werte anderswo im Programm und es folgt allgemeine Heiterkeit bei der Fehlersuche. Falls es das ist: Das kommt eben davon, wenn man sich nicht gegen Pufferüberläufe absichert.



  • Nehme bei fopen mal "wb" statt "w" und statt fprintf besser fwrite

    if( 3==fwrite( eingabe, 1,3,COM3 ) )
      puts("OK");
    

    Wenn du sowieso schon (nicht standardkonformes) conio.h nimmst, dann bietet sich in deinem Fall besser getch bzw. kbhit/getch an, wo du einzelne Zeichen einlesen und schicken kannst (ohne auf '\n' "warten" zu müssen).



  • Danke erstmal für den Denkanstoß - habe es geschafft den Fehler einzugrenzen.
    Ein Pufferüberlauf tritt nicht auf.
    Meine Eingabe sind 3stellige Zahlen (z.B 103 1 Ebene 3 Säule meines Cubes)
    Durch den Debugg printf("%s",eingabe); wird mir ja auch immer meine Eingabe schön nochmal gezeigt und dort treten keine Fehler auf.

    Was ich beim Debugg beobachtet habe ist folgendes:
    Habe fprintf nun in einer For-Schleife x=0 bis x<3 kann also 3 mal Werte eingeben.
    Ich gebe ein 103 203 303 - sobald ich bei der letzen Eingabe enter drücke und den LED Cube betrachte sehe ich wie Ebene 1 und 2 (jeweils Säule 3) ganz schnell durchschalten und letzendlich Ebene 3 Säule 3 anbleibt.

    Sprich das Programm auf dem Arduino holt sich imme 3 Bytes von der Serial und führt die Steuerung aus.

    Somit liegt das problem dadrin das mein Programm die Daten erst sendet wenn ich alle Eingaben gemacht habe. Als ob es eine Art Warteschlange am COM3 gibt.

    Wie kann ich nun meinem Programm sagen ,dass es senden soll wenn 3 Bytes vorhanden sind und nicht erst wenn keine Eingabe mehr kommt ?

    LG Björn



  • Inden du wie o.g. die Zeichen (standardinkonform) einzeln liest und mitzählst oder den 3er Block selbst sicherstellst:

    if( 1==scanf("%3[^\n]",eingabe) )
      if( 3==fwrite(eingabe,1,3,COM3) )
        puts("OK und raus");
    


  • Sowas

    scanf("%s",&eingabe);
            ...
            fprintf( COM3,eingabe )
    

    ist gefährlich und macht nicht immer was du möchtest.

    fprintf erwartet als 2. Parameter einen Formatstring.
    Wenn du jetzt mal %s eingibst, versucht fprintf einen Nullterminierten String auszugeben.
    Da du aber keine Adresse von dem String übergeben hast, nimmt sich fprintf eine Adresse.
    Da kommt von Nichts passiert bis zum Programmabsturz alles möglich bei raus.


Anmelden zum Antworten