Datei lesen, erster Buchstabe fehlt und # wird nicht angezeigt



  • Hallo,

    ich programmiere gerade das erste Mal eine Oberfläche, die als Editor für
    eine Schrittmotorsteuerung dienen soll.

    Es klappt soweit alles ganz gut, bis auf den Umstand, dass ich in letzter Zeit wenig mit C gemacht habe.

    Damit ich nicht alles 1000 Mal machen muss, hab ich mir gedacht, ich schreibe ein Skript, speichere es in einer Datei und wenn ich <Send> drücke, dann wird die Datei zeilenweise gelesen und der Pufferinhalt an die Anlage geschickt (Da die Anlage noch nicht da ist, nehme ich das Hyperterminal von Windows um zu sehen, was ankommt)

    Nun ist es so, dass die Befehle als ASCII-Code an die Steuerung geschickt werden sollen, allerdings mit einem führenden #, im Hyperterminal kommt alles an, ABER dieses dämliche # nicht.

    Es ist auch so, dass es scheint, dass von jedem extra eingefügten String, das erste Zeichen nicht gelesen wird.

    Is es ein Problem dieses Zeichen zu senden ? Warum findet er es nicht ?

    Danke schon mal für eure Beiträge
    Michael

    Das ist die Texteingabe, gelesen aus einer Textbox

    void getFreeInput(int mainPanelHandle,int  stepSetupPanel, int stepFreeInputPanelHandle )
    {
    	char freeText [1000] = "";
    	char hackText [20] = "";
    
    	int i = 0;
    	int j = 0;
    
    	GetCtrlVal(stepFreeInputPanelHandle, STEP_TEXTF_STEP_FREETEXTBOX, &freeText[0]);
    
    	for(i=0; freeText[i] != '\0'; i++)
    	{
    		if ((freeText[i] == '\n') || (freeText[i] == '\0'))
    		{
    			//sprintf(hackSend,"%s",hackText);
    			writeSkriptNOTFREE(mainPanelHandle, stepFreeInputPanelHandle, hackText);    
    			SetCtrlVal(stepSetupPanel, STEP_PANEL_STEP_TBCOMMANDS, hackText);
    
    			j = 0;
    
    		}
    		hackText[j] = freeText[i] ;
    		j++;
    		Delay(0.2);
    	 }
    
    	//schaltet den SEND Button frei 
    	SetCtrlAttribute(stepSetupPanel, STEP_PANEL_STEP_SEND,ATTR_DIMMED, 0);
    }
    

    und hiermit wird der Code in die Datei geschickt

    int writeSkriptNOTFREE(int mainPanelHandle,int stepSetupPanel,char* puf)
    {
    
    	if( (skriptNOTFREE=fopen("skriptNOTFREE.gho","a+")) == NULL) 
       	{
    		printf("Kann SKRIPTNOTFREE.GHO nicht oeffnen\n");
    		return 1;
       	}
        	fprintf(skriptNOTFREE,"%s\n",puf);
        	fclose(skriptNOTFREE);
       	return EXIT_SUCCESS;
    }
    

    Und hiermit wird es dann per Knopfdruck gesendet
    Zischendurch wird noch eine Backupkopie und die Zieldatei beschrieben

    int sendCommandToStepper(mainPanelHandle, unterPanel, isPortOpen)
    {
    
    	char puffer[11];
    	char stepReadBuf[61];
    	char text[101];
    	char c;
    
    	if (isPortOpen == 1) 
    {                                                                                                           
    
    		if((skriptfile=fopen("skript.gho","r")) == NULL) 
    		{
    	    	printf("Kann SKRIPT.GHO nicht oeffnen\n");
    	    	return 1;
    	    }
    	    //pscanf(skriptfile,"\n%s",)
    
    	    while (c = fgetc(skriptfile) != EOF)
    	    {
    	       	fgets(puffer, 11, skriptfile);
    
    	    	ComWrt(port, puffer, 11);
    			ComRd (port, stepReadBuf, 61);
    
    	    	sprintf(text," *** Sent to COM %i at %s\n",port,TimeStr());
    
    	    	DisplayPanel(unterPanel);
    			SetCtrlVal(unterPanel, SYS_LOGPAN_SYS_TEXT, &puffer[0]);
    
    	    	SetCtrlVal(unterPanel, SYS_LOGPAN_SYS_TEXT, &text[0]);
    
    			sprintf(text," *** Answer from stepper: %s\n",stepReadBuf);
    			SetCtrlVal(unterPanel, SYS_LOGPAN_SYS_TEXT, &text[0]);
    
    			//Delay(1);                        
    		} 
    
    	fclose(skriptfile);  
    	}
    
    	else
    {                                                                                                           
    		sprintf(text," *** ERROR No COM open at %s\n",TimeStr());
    	    DisplayPanel(unterPanel);
    	    SetCtrlVal(unterPanel, SYS_LOGPAN_SYS_TEXT, &text[0]);
    
    	}       
     	return EXIT_SUCCESS;
    }
    


  • Das erste Zeichen der Eingabe wird schon gelesen - und zwar von der fgetc()-Abfrage in der while-Schleife. Jetzt könntest du es entweder vor den eigentlichen Eingabepuffer setzen oder per man: ungetc wieder zurückschreiben.

    Eine dritte Möglichkeit wäre es, den fgets()-Aufruf als Schleifenbedingung zu setzen:

    while (fgets(puffer, 11, skriptfile)!=NULL)
    {            
      ComWrt(port, puffer, 11);
      ...
    }
    


  • Das is ne Idee,

    was mich aber extrem irritiert ist dass, mit denselben Methodenaufrufen unterschiedliche Ausgaben erscheinen.

    Hab leider keinen Webhost etc hier, sonst würd ich n Bild posten.


Anmelden zum Antworten